공부해요/운영체제

시스템 콜

yenas0 2024. 9. 19. 10:23
반응형

응용프로그램을 위한 라이브러리

라이브러리

라이브러리는 응용프로그램이 활용할 수 있도록 미리 작성된 함수들의 집합으로, 컴파일되어 바이너리 형태로 제공

개발자는 라이브러리를 활용하지 않고서는 응용프로그램을 작성하기 어렵.

라이브러리의 종류

  1. 표준 라이브러리:
    • 응용프로그램을 위해 구현된 함수를 제공
    • 운영체제(OS)나 하드웨어(HW)에 상관없이 이름 및 사용법이 동일
  2. 시스템 콜 라이브러리:
    • 시스템 콜 함수를 제공
    • 시스템 콜 함수들은 시스템 콜을 통해 커널 모드로 전환하고 커널에 진입하여 함수를 실행
    • OS마다 시스템 콜의 구현이 다름

사용자 코드와 라이브러리 코드의 링킹

  • 실행 파일 생성 과정:
    • 컴파일 과정에서 사용자 코드와 라이브러리 코드가 링킹되어 하나의 실행 파일로 만들어짐
    • 이 과정에서 각 함수와 변수의 주소가 계산
  • 응용프로그램 실행:
    • 응용프로그램이 사용자 공간(User Space)에 적재
    • 응용프로그램은 사용자 모드(User Mode)로 실행을 시작

 

함수 호출과 시스템 콜

함수 호출(Function Call)로 라이브러리 실행

  • 실행 위치:
    • 사용자 공간에서 사용자 모드로 실행
  • 동작 과정:
    • 스택에 복귀 주소와 매개변수를 저장
    • 호출된 함수의 지역 변수를 생성한 후, 해당 함수의 주소로 점프
    • 함수 실행이 끝나면 복귀 주소를 통해 호출한 곳으로 복귀

시스템 콜(System Call)로 커널 코드 실행

  • 동작 과정:
    1. 시스템 콜 명령 실행:
      • 시스템 콜을 일으키는 특별한 기계 명령(예: int 0x80 또는 syscall)을 실행
      • 이 명령을 통해 사용자 모드에서 커널 모드로 전환
    2. 고유 번호 전달:
      • 커널 함수마다 매겨진 고유 번호를 레지스터나 스택을 통해 전달
    3. 시스템 콜 핸들러 실행:
      • 커널의 시스템 콜 핸들러(System Call Handler)가 호출되어 전달받은 고유 번호에 따른 커널 함수를 실행
    4. 커널 함수 실행:
      • 실제 커널 기능을 수행하는 함수가 실행
    5. 모드 전환 및 복귀:
      • 커널 함수 실행이 끝나면 사용자 모드로 전환되며, 사용자 프로그램으로 복귀

 

시스템 콜

사용자 공간의 코드에서 커널의 서비스를 요청하는 과정

read() 함수에 의한 시스템 콜 과정

  • 동작 과정:
    1. 응용프로그램에서 read() 호출:
      • 파일 디스크립터와 버퍼, 읽을 바이트 수를 인자로 read() 함수를 호출
    2. 시스템 콜 인터페이스:
      • read() 함수는 시스템 콜 라이브러리를 통해 시스템 콜 인터페이스를 호출
    3. 커널 모드 전환:
      • 시스템 콜 명령을 실행하여 커널 모드로 전환
    4. 시스템 콜 핸들러 호출:
      • 커널의 시스템 콜 핸들러가 read에 해당하는 커널 함수를 호출
    5. 파일 시스템 및 드라이버 연계:
      • 커널 함수는 파일 시스템과 디바이스 드라이버를 통해 실제 데이터를 읽음
    6. 데이터 전달 및 복귀:
      • 읽은 데이터를 사용자 공간의 버퍼에 복사
      • 커널 모드에서 사용자 모드로 전환하고, 응용프로그램으로 복귀

 

printf()는 디스플레이에 어떻게 출력할까?

  • 버퍼링:
    • printf()는 C 표준 라이브러리의 출력 버퍼에 데이터를 저장
    • 이는 입출력 효율을 높이기 위한 버퍼링 메커니즘
  • 시스템 콜 호출:
    • 버퍼가 가득 차거나 줄 바꿈 문자가 나타나면, printf()는 write() 시스템 콜을 호출
  • 커널을 통한 출력:
    • write() 시스템 콜을 통해 커널 모드로 전환
    • 커널의 write 함수는 디바이스 드라이버를 통해 디스플레이(예: 터미널)에 데이터를 출력
  • 모드 복귀:
    • 출력이 완료되면 사용자 모드로 전환되어 응용프로그램으로 복귀

 

시스템 콜 비용: fread()와 read()의 비교

  • 시스템 콜의 오버헤드:
    • 시스템 콜은 사용자 모드에서 커널 모드로의 전환 등 추가적인 오버헤드가 발생하여 함수 호출보다 시간이 더 소요
  • read():
    • 매번 시스템 콜을 수행하므로 오버헤드가 큼
  • fread():
    • 버퍼링을 통해 여러 데이터 요청을 한 번에 처리하여 시스템 콜 호출 횟수를 줄임
    • 따라서 전체적인 실행 시간이 단축되고 효율성이 향상
  • 성능 최적화 방법:
    • 시스템 콜 호출 횟수를 최소화하여 응용프로그램의 실행 시간을 줄일 수 있음
    • 버퍼링 기법이나 비동기 입출력 등을 활용

 

운영체제의 시작: 부팅 과정

  1. 전원 공급 및 CPU 초기화:
    • 전원 버튼을 누르면 컴퓨터에 전원이 공급되고, CPU가 초기화
  2. 리셋 벡터를 통한 BIOS 실행:
    • CPU는 리셋 벡터를 통해 ROM에 저장된 BIOS의 시작 주소를 찾음
  3. BIOS 실행:
    • CPU가 BIOS를 실행하여 시스템을 초기화
  4. POST 수행:
    • BIOS는 전원 공급 자가 테스트(POST, Power-On Self Test)를 통해 하드웨어의 이상 유무를 검사
  5. 부트 디바이스 탐색 및 부트 로더 로드:
    • BIOS는 부트 순서에 따라 부트 디바이스의 부트 섹터를 찾음
    • 부트 섹터에 있는 부트 로더를 RAM에 로드 및 실행
  6. 운영체제 커널 로드:
    • 부트 로더는 파일 시스템을 읽어 운영체제의 커널을 메모리에 로드
  7. 커널 실행 및 시스템 초기화:
    • 커널이 실행되어 각종 시스템 자원을 초기화하고, 운영체제가 구동

 

디바이스 드라이버

디바이스 드라이버는 운영체제와 하드웨어 장치 간의 인터페이스를 제공하는 소프트웨어

  • 역할:
    • 운영체제가 다양한 하드웨어 장치를 제어하고 통신할 수 있도록
    • 하드웨어의 세부 사항을 추상화하여 응용프로그램이 일관된 방식으로 장치를 사용할 수 있게
  • 동작 원리:
    • 응용프로그램이 시스템 콜을 통해 I/O 작업을 요청하면, 커널은 해당 디바이스 드라이버를 호출
    • 디바이스 드라이버는 하드웨어 장치와 직접 상호 작용하여 요청된 작업을 수행
    • 작업 결과를 커널에 전달하고, 커널은 이를 응용프로그램에 반환
  • 예시:
    • 그래픽 드라이버: 모니터나 그래픽 카드와 통신하여 화면에 그래픽을 출력
    • 네트워크 드라이버: 네트워크 인터페이스 카드를 제어하여 데이터 송수신을 처리
    • 오디오 드라이버: 사운드 카드를 제어하여 소리를 재생하거나 녹음
  • 중요성:
    • 디바이스 드라이버의 효율성과 안정성은 시스템 전체의 성능과 신뢰성에 큰 영향
    • 새로운 하드웨어 장치를 사용하기 위해서는 해당 장치에 맞는 드라이버가 필요
반응형