시스템 프로그래밍의 기반 요소
사용자 영역에서의 시스템 프로그래밍
- 시스템 콜(system call)"
- C 라이브러리
- C 컴파일러
시스템 콜
- 시스템 콜: 운영체제 리소스나 서비스 요청을 위해, 사용자 영역에서 커널 영역으로 들어가는 함수
- 주요 시스템 콜: read(), write(), open() 등
리눅스/유닉스는 C언어로 만들어져있으므로, 시스템 콜도 C언어로 구현
어떻게 구현되어 있나?
- eax 레지스터에 시스템 콜 번호를 넣고,
- ebx 레지스터에는 시스템 콜에 해당하는 인자값을 넣고,
- 소프트웨어 인터럽트 명령을 호출하면서 0x80x값을 넘겨줌
ㄴinstruction code (CPU가 제공한 코드)
ㄴ인터럽트 번호 0x80(128번)
ㄴ시스템 콜 번호 1을 시스템 레지스터 eax에 넣어줌
ㄴ함수인자 0을 ebx에 넣어줌
(1) int명령 받으면 CPU는 사용자모드에서 커널모드로 바꿔주고
(2) OS가 부팅할 때 적어둔 IDT에서 0x80에 해당하는 함수가 저장되어 있는 주소로 이동해서 → PC(Program Counter)에 주소를 써주게되면 실행함.
(3) 리눅스 같은 경우 system_call() 함수가 적혀져있다. (4) 즉, system_call() 함수로 이동해서 eax로부터 시스템 콜 번호를 찾아서, 해당 번호에 맞는 시스템 콜 함수로 이동한다.
(5) 이 때, ebx에 있는 인자를 시스템 콜 함수에 넘겨줘서 실행한다.
(6) 시스템 콜 함수 실행 후, 다시 커널 모드에서 사용자 모드로 변경하고, 다시 해당 프로세스 다음 코드 진행함.
API
C 라이브러리
- 유닉스 C 라이브러리 - libc
- 리눅스 C 라이브러리 - GNU libc- glibc (지립씨, 글립씨)
- 시스템콜, 시스템콜 래퍼, 기본 응용프로그램 기능이 포함하고 있다
C 컴파일러
- 유닉스 C 컴파일러 - cc
- 리눅스 C 컴파일러 - GNU cc - gcc (지씨씨)
- 우분투 리눅스에 gcc 설치
ABI (Application Binary Interface)
응용프로그램과 라이브러리를 연결/통신 어떻게 해야할지 정해야 한다. 이러한 방식을 정하는 것이 ABI.
- 응용 프로그램 바이너리 인터페이스
- 함수 실행 방식, 레지스터 활용, 시스템 콜 실행, 라이브러리 링크 방식등
- ABI가 호환되면 재컴파일 없이 동작 가능
ㄴ윈도우에서 리눅스 프로그램이 호환되지 않은 이유도 ABI와 라이브러리가 달라서이다.
- 컴파일러, 링커(라이브러리를 해당 실행파일을 연결 시키는 역할), 툴체인(컴파일러를 만드는 프로그램)에서 제공
컴퓨터 만든 사람들이 중구난방식으로 정했기 때문에 표준화를 작업을 하는 그룹들이 생겼다
POSIX
- 유닉스 시스템 프로그래밍 인터페이스 표준
- IEEE(Institute of Electronic and Electonics Engineers)에서 표준화 시도
- 리차드 스톨만(자유 소프트웨어 재단)이 POSIX를 표준안 이름으로 제안 (시스템콜, ABI 등에 대해 표준화를 하고 있다)
C언어 표준
- 다양한 C언어 변종
- ANSI(American national StaNDARS Institute)에서 ANSI C 표준 성립
리눅스는 POSIX와 ANSI C 지원
시스템 프로그래밍과 버전
- 끊임없는 POSIX, C, C++ 표준 업데이트
- 끊임없는 소프트웨어 업데이트
- 프로그래밍 트렌드와 상관없이 시스템 레벨단 기술은 유지되고, 필요함 (기술들은 시스템 레벨단에서부터 쌓여져 개발됨)