시스템 프로그래밍 핵심기술

시스템 프로그래밍 핵심 기술

시스템 콜과 API

시스템 프로그래밍의 기반 요소

  • 시스템 콜
  • C 라이브러리
  • C 컴파일러
    사용자 영역에서 시스템 프로그래밍을 해본다.

시스템 콜

커널 영역으로 들어가는 함수.

리눅스 유닉스도 C 언어로 만들어져 있으며, 시스템 콜도 C 언어로 구현한다.

시스템 콜은 어떻게 구현?

eax 에 시스템 콜 번호를 넘겨 준다.
ebx 에는 시스템 콜 인자를 넘겨준다.
INT 로 인터럽트를 실행해서 0x80 에 해당아하는 함수를 실행 시키는데 IDT(Interrupt Descriptor Table) 에서 0x80은 리눅스에서 시스템 콜에 해당한다.

1
2
3
mov eax, 1
mov ebx, 0
int 0x80

이때 커널 모드로 바뀌어서 실행되고, 실행이 완료 된 다음에는 다시 사용자 모드로 바뀐다.

API

응용 프로그램과 불리된 하위 호환 인터페이스. 예) 시스템 콜 래퍼, 입출력 라이브러리 등등..

ABI와 표준

C 라이브러리

유닉스 - libc

리눅스 - glibc

이 안에 시스템 콜, 시스템 콜 래퍼, 기본 응용 프로그램 기능이 포함 된다.

C 컴파일러

유닉스 - cc

리눅스 - gcc

1
2
3
sudo apt-get install gcc
gcc --version
gcc -o test.c test // 실행 파일이 생성

만약 -o 안쓰면 a.out으로 실행파일 생성됨.

ABI

Application Binary Interface

  • 함수 실행 방식, 레지스터 활요으, 시스템 콜 실행, 라이브러리 링크 방식등을 제공 한다.
  • ABI가 호환되면 재 컴파일없이 동작한다.
  • 컴파일러, 링커(라이브러리 링크), 툴체인(컴파일러를 만드는 프로그램) 에서 제공한다.

각각의 업체에서 이것을 정의해서 표준화 할 필요가 있었다.

POSIX

유닉스 시스템 프로그래밍 인터페이스 표준이다.
IEEE에서 표준화를 계속해서 시도하고 있고, 리차드 스톨만이 POSIX를 표준안 이름으로 제안했다.

C 언어 표준

다양한 C 언어의 변종이 존재한다. 그래서 ANSI에서 ANSI C 표준을 정립했고 리눅스에서는 POSIX 와 ANSI C 를 지원한다.

시스템 프로그래밍과 버전

하위 시스템 레벨은 거의 변하지 않고 유지되고 있음. 하위 레벨까지 잘 알고 있으면 상위 레벨에서 동작하는 프로그램을 만들지라도 성능 향상에 도움을 줌.