꾸준한 개발자

계속적인 성장을 추구하는 개발자입니다. 꾸준함을 추구합니다.

계속 쓰는 개발 노트

시스템 프로그래밍

시스템콜, API, ABI, 표준

gold_dragon 2021. 4. 30. 17:28

시스템 콜 구현

시스템콜은 eax 레지스터에 시스템 콜 번호를 넣고, ebx 레지스터에는 시스템 콜에 해당하는 인자값을 넣고, 소프트웨어 인터럽트 명령을 호출하면서 0x80값을 넘겨줍니다.

 

CPU는 사용자 모드를 커널 모드로 바꿉니다. IDT(Interrupt Descriptor Table)에서 0x80에 해당하는 주소를 찾아서 실행합니다. system_call() 함수에서 eax로부터 시스템 콜 번호를 찾아서, 해당 번호에 맞는 시스템 콜 함수로 이동합니다. 해당 시스템 콜 함수를 실행 후, 다시 커널 모드에서 사용자 모드로 변경하고, 다시 해당 프로세스 다음 코드를 진행합니다.

API

응용 프로그램과 분리된 하위 호환 인터페이스입니다. 사용자가 사용하기 쉽게 인터페이스를 제공해줍니다. 실행파일과 분리된 형태이기 때문에 실행 파일을 업데이트한 후 컴파일 할 필요없이, API를 업데이트함으로써 컴파일없이 성능 향상을 이룰 수 있습니다.

동적, 정적 라이브러리가 있습니다.

C 라이브러리

유닉스 C 라이브러리: libc

리눅스 C 라이브러리: GNU libc, glibc (시스템콜, 시스템콜 래퍼, 기본 응용 프로그램 기능을 포함하고 있습니다.)

ABI (Application Binary Interface)

응용 프로그램 바이너리 인터페이스입니다. 함수 실행 방식, 레지스터 활용, 시스템 콜 실행, 라이브러리 링크 방식 등을 정의해놨습니다. ABI가 호환되면 재컴파일없이 동작합니다. 컴파일러, 링커(라이브러리 링크), 툴체인(컴파일러를 만드는 프로그램)에서 제공합니다. window 프로그램을 linux 환경에서 실행하지 못하는 이유가 ABI가 달라서이거나 라이브러리가 다르기 때문입니다.

POSIX

유닉스 시스템 프로그래밍 인터페이스 표준을 말합니다. IEEE(Institute of Eletronic and Electronics Engineers)에서 표준화 시도를 했으며, 리차드 스톨만이 POSIX를 표준안 이름으로 제안하였습니다.

C 언어 표준

ANSI(American Natuinal Standards Institute)에서 ANSI C 표준을 정립했습니다. 리눅스는 POSIX와 ANSI C를 지원합니다.

 

시스템 레벨단 기술들은 프로그래밍 트렌드와 상관없이 유지되고 있고 필요함은 여전합니다.  하위 시스템 레벨을 알고 있으면, 더 나은 또는 성능이 개선된 소프트웨어 개발이 가능할 것입니다.