개발자 끄적끄적
커널(Kernel)과 시스템 호출(System Call) 본문
<커널의 실체>
- 부팅 시 메모리에 적재되는 '함수/데이터'의 집합
- 컴파일된 바이너리, 보조저장장치의 특정 영역에 저장
- 커널이 스스로 실행되어지는 능동적인 주체는 아니다
*스스로 실행되어지는 능동적인 주체 : 프로세스(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 |