시스템 프로그래밍 핵심기술
시스템 프로그래밍 핵심 기술
시스템 콜과 API
시스템 프로그래밍의 기반 요소
- 시스템 콜
- C 라이브러리
- C 컴파일러
사용자 영역에서 시스템 프로그래밍을 해본다.
시스템 콜
커널 영역으로 들어가는 함수.
리눅스 유닉스도 C 언어로 만들어져 있으며, 시스템 콜도 C 언어로 구현한다.
시스템 콜은 어떻게 구현?
eax 에 시스템 콜 번호를 넘겨 준다.
ebx 에는 시스템 콜 인자를 넘겨준다.
INT 로 인터럽트를 실행해서 0x80 에 해당아하는 함수를 실행 시키는데 IDT(Interrupt Descriptor Table) 에서 0x80은 리눅스에서 시스템 콜에 해당한다.
1 | mov eax, 1 |
이때 커널 모드로 바뀌어서 실행되고, 실행이 완료 된 다음에는 다시 사용자 모드로 바뀐다.
API
응용 프로그램과 불리된 하위 호환 인터페이스. 예) 시스템 콜 래퍼, 입출력 라이브러리 등등..
ABI와 표준
C 라이브러리
유닉스 - libc
리눅스 - glibc
이 안에 시스템 콜, 시스템 콜 래퍼, 기본 응용 프로그램 기능이 포함 된다.
C 컴파일러
유닉스 - cc
리눅스 - gcc
1 | sudo apt-get install gcc |
만약 -o 안쓰면 a.out으로 실행파일 생성됨.
ABI
Application Binary Interface
- 함수 실행 방식, 레지스터 활요으, 시스템 콜 실행, 라이브러리 링크 방식등을 제공 한다.
- ABI가 호환되면 재 컴파일없이 동작한다.
- 컴파일러, 링커(라이브러리 링크), 툴체인(컴파일러를 만드는 프로그램) 에서 제공한다.
각각의 업체에서 이것을 정의해서 표준화 할 필요가 있었다.
POSIX
유닉스 시스템 프로그래밍 인터페이스 표준이다.
IEEE에서 표준화를 계속해서 시도하고 있고, 리차드 스톨만이 POSIX를 표준안 이름으로 제안했다.
C 언어 표준
다양한 C 언어의 변종이 존재한다. 그래서 ANSI에서 ANSI C 표준을 정립했고 리눅스에서는 POSIX 와 ANSI C 를 지원한다.
시스템 프로그래밍과 버전
하위 시스템 레벨은 거의 변하지 않고 유지되고 있음. 하위 레벨까지 잘 알고 있으면 상위 레벨에서 동작하는 프로그램을 만들지라도 성능 향상에 도움을 줌.