개발자 끄적끄적

커널(Kernel)과 시스템 호출(System Call) 본문

운영체제

커널(Kernel)과 시스템 호출(System Call)

햏치 2024. 3. 13. 18:05

<커널의 실체>
- 부팅 시 메모리에 적재되는 '함수/데이터'의 집합
  - 컴파일된 바이너리, 보조저장장치의 특정 영역에 저장
  - 커널이 스스로 실행되어지는 능동적인 주체는 아니다
 *스스로 실행되어지는 능동적인 주체 : 프로세스(Process)
  
  - 사용자공간 -> (시스템호출) -> 커널공간(커널 함수들과 자료구조) -> (디바이스 드라이버) -> 타이머, 디스플레이, 디스크, 키보드
- 키보드(가 눌렸을 때) -> 인터럽트 -> 디바이스 드라이버 -> 커널공간(커널에서 제공하는 기능들)
  

<커널과 관련된 이슈>
- 커널은 스스로 실행되는 프로세스인가? 아니요, 시스템 호출을 통해 호출되는 단순 함수/데이터의 집합

- 커널은 실행 중이다? 아니요, 시스템 호출/인터럽트를 통해 커널 코드/ISR(Interrupt Service Routine)이 실행되고 있을 뿐이다, 능동적인 주제가 아니라 수동적인 주체

- 커널은 스택이나 힙을 갖는가? 아니요, 각 프로세스/스레드가 스택/힙 소유
  *app이 커널 코드 실행 시, 커널 공간에 커널 코드 실행을 위한 스택 생성, 복귀 시 해제



<응용 프로그램을 위한 라이브러리 유형>
- 라이브러리(Library)
  - 응용프로그램에서 활용하도록 미리 작성된 함수들을 컴파일한 바이너리

- 라이브러리의 두 유형
  1. 표준 라이브러리(Standard Library)
    - OS나 HW에 상관없이 이름과 사용법 동일
    - 사용자가 작성하기 힘들거나 번거러운 함수 제공

  2. 시스템 호출 라이브러리(System Call API)
    - '시스템 호출'을 진행해 커널 모드로 바꾸고, 커널로 진입해서 커널에서 제공하는 함수 실행(커널의 다양한 기능 수행)
    - OS마다 함수 이름이 다르다(운영체제 내부마다 다르기 때문, linux에서 system call과 window의 system call은 서로 다르다)
    - 시스템 호출 함수 또는 커널 API라고도 부른다



<응용 프로그램의 빌드>
- 사용자 모드
  main() -> (함수 호출) -> f() -> g() //f(), g()는 사용자가 작성한 코드
  표준 라이브러리 : prinft(), strcpy(), abs()
  시스템 호출 라이브러리 : write(), open() -> (시스템 호출) -> (커널모드) -> 시스템호출 핸들러 -> 커널 함수들



<시스템 호출(System Call)>
- 사용자 공간의 코드에서 '커널 서비스'(함수)를 요청하는 과정
  - 커널 콜(Kernel Call), 트랩(Trap)이라고도 부른다
  - 응용프로그램이 커널 기능을 활용하도록 제공
  - 시스템 호출 라이브러리를 통해 제공
    - OS마다 다르며 약 200여개 이상 제공



<시스템 호출로 커널 코드의 실행 예 - read() 시스템 호출 함수에 의해 시스템 호출이 일어나는 과정>

-- 사용자 모드 --
1. read(fd, buffer, mBytes); /사용자가 작성한 코드

-- 시스템 호출 라이버러리 -- 
2. read() 시스템 호출 함수, CPU의 특정 레지스터들에 시스템 호출 번호와 매개 변수 저장
3. 시스템 호출을 일으키는 System Call 명령 실행

-- 4. 시스템 호출(트랩), 커널모드 -- 
5. 현재 CPU 레지스터를 저장
   CPU의 레지스터를 읽어 시스템 호출 번호를 알아낸다

6. 시스템 호출 표에서 커널 함수의 주소 알아내고 커널 함수 호출

-- sys read() --
7. 디스트 장치를 제어하여 파일 읽기 -> 하드디스크

-- system_call_handler() : 시스템 호출 핸들러 -- 
8. sys_read()로 부터 리턴하고, 커널 스택에 저장해둔 레지스터 값을 CPU로 복귀

-- 시스템 호출(트랩) --
9. CPU는 사용자 모드로 변경

-- 사용자 모드 --
10. 사용자가 작성한 코드 read(fd, buffer, mBytes)



<printf()의 출력 동작>
- printf() 함수는 표준 라이브러리 함수이다 
- printf() 함수를 호출하는 스스템 호출이 일어날까?
  - 디스플레이에 접근하는 것은 커널만 가능
  - printf() 함수는 디스플레이에 직접 출력 불가능 
  - printf()는 C 표준 라이브러리 버퍼에 출력
  - 버퍼가 꽉 차면 printf()는 시스템 호출 함수 write() 호출
  - write() 함수는 '시스템 호출 CPU 명령' 실행
  - 커널에 작성된 함수가 디스플레이어에 "hello" 출력



<시스템 호출 비용>
- 시스템 호출은 일반 함수 호출에 비해 많은 시간 비용 발생
  - 시스템 호출을 많이 할수록 프로그램 실행 속도 저하

- ex) fread()(표준라이브러리)와 read()(시스템호출 라이브러리) 비교
  - 파일에서 1000 바이트를 읽으면 
    fread()의 호출 -> 표준라이브러리 : 상대적으로 빠름
    read()의 호출 -> 시스템호출 라이브러리 : 상대적으로 느리고 비효율적 

'운영체제' 카테고리의 다른 글

운영체제와 인터럽트(Interrupt)  (0) 2024.03.13
논리 주소 공간과 실행 모드  (0) 2024.03.13
운영체제  (0) 2024.03.09