Just do IT
article thumbnail

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

   * 시스템 (system call)

   * C 라이브러리

   * C 컴파일러

 

시스템

   * 시스템 : 운영체제 리소스나 서비스 요청을 위해, 사용자 영역에서 커널 영역으로 들어가는 함수

   * 주요 시스템콜 : read(), write(), open()

   * 리눅스 / 유직스는 C 언어로 만들어져있으므로, 시스템콜도 C언어로 구현되어 있다

 

시스템 콜은 어떻게 구현?

   * eax 레지스터에 시스템 번호를 넣는다

   * ebx 레지스터에는 시스템 콜에 해당하는 인자값을 넣는다

   * 소프트웨어 인터럽트 명령을 호출하면서 0x80값을 넘겨준다

      1. CPU 사용자 모드를 커널 모드로 바꿔준다

      2. IDT (Interrupt Descrpitor Table)에서 0x80 해당하는 주소(함수) 찾아서 실행한다

      3. system_call() 함수에서 eax로부터 시스템 번호를 찾아서, 해당 번호헤 맞는 시스템콜 함수로 이동한다

      4. 해당 시스템콜 함수 실행 , 다시 커널 모드에서 사용자 모드로 변경하고, 다시 해당 프로세스 다음 코드를 진행한다

   mov eax, 1

   mov ebx, 0

   int 0x80 // 소프트웨어 인터럽트 명령

API

   * 응용 프로그램과 분리된 하위 호환 인터페이스

      - : 시스템 래퍼, 입출력 라이브러리 등등

 

C 라이브러리

   * 유닉스 C 라이브러리 - libc

   * 리눅스 C 라이브러리 - GNU libc- glibc (지립씨, 글립씨)

      - 시스템콜, 시스템콜 래버, 기본 응용 프로그램 기능 포함

 

C 컴파일러

   * 유닉스 C 컴파일러 -cc

   * 리눅스 C 컴파일러 - GNU cc- gcc(지씨씨)

   * 우분투 리눅스에 gcc 설치

 

ABI

   * 응용 프로그램 바이너리 인터페이스

   * 함수 실행 방식, 레지스터 활용, 시스템 실행, 라이브러리 링크 방식

   * ABI 호환되면 재컴파일 없이 동작

   * 컴파일러, 링커 (라이브러리 링크), 툴체인 (컴파일러를 만드는 프로그램)에서 제공

 

POSIX

   * 유닉스 시스템 프로그래밍 인터페이스 표준

   * IEEE (Institute of Electronic and Electronics Engineers)에서 표준화 시도

   * 리차드 스톨만 (자유 소프트웨어 재단) POSIX 표준안 이름으로 제안

 

C 언어표준

   * 다양한 C 언어 변종

   * ANSI (American National Standards Institute)에서 ANSI C 표준 정립

   * 리눅스는 POSIX ANSI C 지원

 

시스템 프로그래밍과 버전

   * 끊임없는 POSIX, C, C++ 표준 업데이트

   * 끊임없는 소프트웨어 업데이트

   * 프로그래밍 트렌드와 상관없이 시스템 레벨단 기술은 유지되고, 필요하다.

   * 상위 레벨 프로그래밍을 할지라도, 하위 시스템 레벨을 알고 있으면, 나은 또는 성능이 개선된 소프트웨어 개발 가능하다

 

출처 : 제로베이스

profile

Just do IT

@AmyG

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!