Kernel의 실체
커널은 컴파일된 바이너리 형태로 스토리지에 있다가 컴퓨터 부팅 시에 메모리에 load된다.
커널 코드는 함수들의 집합
커널 코드는 함수들의 집합이다. 실행 중인 응용 프로그램(메모리에 적재된)을 프로세스라 부른다. 하지만 커널은 프로세스가 아니다.
만약, app2의 실행중에 System Call을 유발시키고 커널이 동작한다고 가정해보자. 그러면 User mode에서 실행중이다가 kernel mode로 바뀌고 kernel code를 실행한다. 여기서 kernel이 프로세스가 되는게 아닌, app2가 프로세스이다. 커널은 프로세스가 아니다.
Kernel이 실행중?
kernel은 단지 응용 프로그램에 의해 System Call, interrupt가 발생하여 커널 코드가 실행되고 있을 뿐
Kernel은 stack이나 heap을 가짐?
Kernel은 애초에 프로세스가 아니기 때문에, 스택, 힙을 가지지 않는다. 만약 app2를 실행하면서 커널에서 스택이 필요할때 app2가 커널 모드에서 사용할 스택을 커널 내에 할당한다. 즉, 커널이 스택을 가지는게 아닌 app2의 커널에 있는 스택인 것.
프로세스마다 커널 스택이 할당된다.
라이브러리
라이브러리란 응용 프로그램에 활용하기위해 미리 함수들을 작성하여 컴파일한 바이너리 파일을 말한다.
- 표준 라이브러리
- system call 라이브러리
표준 라이브러리에 포함된 함수들은 운영체제, 하드웨어에 상관없이 이름과 사용법이 같지만, system call 라이브러리는 운영체제 커널과 밀접한 관련이 있기 때문에 함수들의 이름이 운영체제마다 다르다.
system call 라이브러리에 있는 함수들을 system call function이라고 부른다.
요약하자면,
- 라이브러리 기능 활용 : function call
- 커널 기능 활용 : system call
function call로 라이브러리 접근
사용자 공간에 적재된 사용자 함수, 같은 주소 공간 내에서 한 함수가 다른 함수의 코드를 실행하는 과정. function call하면 호출한 함수 번지로 점프한후 실행끝나면 실행하던 함수로 돌아옴. 커널 모드로 안바뀌고 사용자 모드에서 실행
system call로 커널 코드 호출
응용 프로그램이 커널의 도움을 받아야할 때. 시스템 호출 라이브러리에 있는 시스템 호출 함수의 도움을 받아서 간접적으로 커널 접근. 시스템 호출 함수는 고유 번호로 커널 함수를 구별한다. 시스템 호출 발생하면, CPU를 커널 모드로 바꾸고 시스템 호출 핸들러 코드를 실행하고 시스템 호출 번호(고유 번호)를 분석하여 해당 커널 함수 실행.
- 시스템 호출
- CPU Kernel mode 전환
- 시스템 호출 핸들러 코드 실행
- 고유번호 분석 후 해당 커널 함수 실행
System Call을 일으키는 기계 명령
CPU마다 system call을 일으키는 특별한 기계 명령을 두고 있다. 이것을 시스템 호출 CPU 명령이라고 한다.
- syscall/sysret
syscall은 시스템 호출을 일으키는 CPU명령, sysret는 시스템 호출 끝내고 사용자 코드로 돌아가도록 하는 명령이다. 시스템 호출을 trap이라고도 부른다.
일반적으로, 시스템 호출 번호(커널 고유 번호), 커널 함수에게 넘겨줄 파라미터 등이 CPU 레지스터들에 미리 저장된 후 CPU명령이 실행된다.
시스템 호출 비용
시스템 호출은 일반적인 함수 호출에 비해서 많은 시간 비용을 가진다. 시스템 호출 과정이 복잡하기 때문임. 커널 모드로 전환, CPU 레지스터에 있는 데이터를 커널 스택으로 옮기고 커널 함수를 호출하는 등, 복잡한 과정이 있기 때문임.
따라서 표준 라이브러리 함수를 사용하는 것을 권장한다.
'컴퓨터 공학(Computer Science) > OS' 카테고리의 다른 글
OS와 인터럽트 (0) | 2024.03.30 |
---|---|
Kernel, user mode, kernel mode (0) | 2024.03.26 |
커널과 시스템 호출 (0) | 2024.03.25 |
배치(batch) OS, 다중 프로그래밍, 시분할 시스템 (0) | 2024.03.14 |