시스템 호출: 두 판 사이의 차이

내용 삭제됨 내용 추가됨
16번째 줄:
[[명령어 인터프리터]] 또는 [[셸]]을 통해 입력된 명령을 수행하는 과정에서 새로운 [[프로세스]]를 시작하기 위해서는 시스템 호출을 해야 한다. 예를 들어 [[유닉스]] 시스템에서는 새로운 프로세스를 시작하기 위해 [[exec]] 시스템 호출 이후 [[fork]] 시스템 호출이 뒤따른다. exec 호출이 호출 프로세스 위로 다른 실행가능한 새로운 프로세스를 띄우는 동안, fork 호출은 현재 실행 중인 프로세스를 복제한다.
 
[[리눅스]]의 [[커널]]은 특권레벨이 최고수준에서최고수준(x86에서 레벨 0)에서 실행되며 하드웨어 제어 및 응용프로그램의 스케쥴링 및 시분할 실행을 하도록 제어한다. 하드웨어 제어를 하는 모든 권한을 커널에서 가지고 있기 때문에 파일시스템 같은 경우 응용프로그램에서는 직접 제어할수 없다. 따라서 응용프로그램에서 하드웨어의 데이터를 가져오려면 커널의 디바이스 드라이버와 연동되어 실행되어야 한다.
결국 파일시스템인 응용프로그램은 커널로 넘어가서 실행되어야 하므로 시스템 호출이라는호출 방법을 사용한다.
 
=== 리눅스 커널의 디바이스 드라이버와 시스템 호출 예 ===
 
* 리눅스 커널의 디바이스 드라이버 예 (특권레벨 커널 공간(kernel space), x86 레벌 0)
 
<source lang="cpp">
40번째 줄:
와 같은 구조로 디바이스를 정의한다. 이 경우 각각의 함수는 응용프로그램의 요청에 따라 커널에서 실행된다.
 
* 응용 프로그램 예 -(특권레벨 리눅스사용자 커널의공간(user 디바이스space), 드라이버x86 레벌 3) 호출
- 리눅스 커널의 디바이스 드라이버 호출
<source lang="cpp">
char gbuff[100];
줄 60 ⟶ 61:
</source>
 
응용프로그램은 CPU의 특권레벨이 사용자모드에서사용자 공간에서 실행되므로 최고수준이커널 공간이 필요한 하드웨어 제어를 할수 없으므로 위와 같이 커널의 디바이스에서 넣어 하드웨어 제어를 한다.
 
다음과 같은 절차로 응용프로그램 함수가 커널의 함수와 연결된다: