- 시스템 콜(system call)
- C 라이브러리
- C 컴파일러
사용자 영역에서의 시스템 프로그래밍
- 시스템 콜
- 운영체제 리소스나 서비스 요청을 위해 사용자 영역에서 커널 영역으로 들어가는 함수
- 주요 시스템콜 : read(), write(), open() 등
리눅스 / 유닉스는 C 언어로 만들어져있으므로 시스템콜도 C 언어로 구현
- 시스템 콜 구현
- eax 레지스터에서 시스템 콜 번호 넣음
- ebx 레지스터에는 시스템 콜에 해당하는 인자값을 넣고
- 소프트웨어 인터럽트 명령을 호출하면서 Ox80 값 넘김
mov eax, 1
mov ebx, 0
int 0x80
- 소프트웨어 인터럽트 명령을 호출하면서 0x80 값을 넘겨줌
- CPU 는 사용자 모드를 커널 모드로 바꿔줌
- IDT(Interrupt Descriptor Table) 에서 0x80 에 해당하는 주소 함수) 를 찾아서 실행
- System_call() 함수에서 eax 로부터 시스템 콜 번호를 찾아서 해당 번호에 맞는 시스템 콜 함수로 이동
- 해당 시스템콜 함수 실행 후 다시 커널 모드에서 사용자 모드로 변경하고 다시 해당 프로세스 다음 코드 진행
- API
- 응용 프로그램과 분리된 하위 호환 인터페이스
- 시스템 콜 래퍼, 입출력 라이브러리 등등
- C 라이브러리
- 유닉스 C 라이브러리 : libc
- 리눅스 C 라이브러리 : GNU libc, glibc
- 시스템, 시스템콜 래퍼, 기본 응용 프로그램 기능 포함
- C 컴파일러
- 유닉스 C 컴파일러 : cc
- 리눅스 C 컴파일러 : GNU cc -> gcc
- Ubuntu 리눅스에 gcc 설치
# sudo apt-get install gcc
# gcc --version
# gcc -o test.c test
- ABI (Application Binary Interface)
- 응용 프로그램 바이너리 인터페이스
- 함수 실행 방식, 레지스터 활용, 시스템 콜 실행, 라이브러리 링크 방식 등
- ABI 가 호환되면 재컴파일 없이 동작
- 컴파일러, 링커(라이브러리 링크), 툴체인(컴파일러를 만드는 프로그램) 에서 제공
- POSIX
- 유닉스 시스템 프로그래밍 인터페이스 표준
- IEEE(Institute of Electronic and Electronics Engineers) 에서 표준화 시도
- 리차드 스톨만(자유 소프트웨어 재단) 이 POSIX를 표준안 이름으로 제안
- 시스템 프로그래밍과 버전
- 끊임없는 POSIX, C, C++ 표준 업데이트
- 끊임없는 소프트웨어 업데이트
- 프로그래밍 트렌드와 상관없이 시스템 레벨단 기술은 유지되고 필요함
상위 레벨 프로그래밍을 할지라도 하위 시스템 레벨을 알고 있으면 더 나은 성능이 개선된 소프트웨어 개발 가능