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

내용 삭제됨 내용 추가됨
프그램 -> 프로그램
편집 요약 없음
18번째 줄:
[[명령어 인터프리터]] 또는 [[셸]]을 통해 입력된 명령을 수행하는 과정에서 새로운 [[프로세스]]를 시작하기 위해서는 시스템 호출을 해야 한다. 예를 들어 [[유닉스]] 시스템에서는 새로운 프로세스를 시작하기 위해 [[exec]] 시스템 호출 이후 [[fork]] 시스템 호출이 뒤따른다. exec 호출이 호출 프로세스 위로 다른 실행가능한 새로운 프로세스를 띄우는 동안, fork 호출은 현재 실행 중인 프로세스를 복제한다.
 
[[리눅스]]의 [[커널]]은 권한수준이 최고수준(x86, Ring 0)에서 실행되며 하드웨어 제어 및 응용 프로그램의 스케쥴링스케줄링 및 시분할 실행을 하도록 제어한다. 하드웨어 제어를 하는 모든 권한을 커널에서 가지고 있기 때문에 파일시스템 같은 경우 응용 프로그램에서는 직접 제어할 수 없다. 따라서 응용 프로그램에서 하드웨어의 데이터를 가져오거나 쓰려면 커널의 장치 드라이버와 연동되어 실행되어야 한다.
결국 응용 프로그램이 파일시스템을 이용하려면 커널의 파일시스템 드라이버로 넘어가 실행되어야 하므로 시스템 호출 방법을 사용한다.
 
72번째 줄:
# 소프트웨어 인터럽트에 의해 ISR(Interrupt Service Routine)이 있는 커널의 인터럽트 처리 위치를 찾아 해당 주소로 실행을 옮긴다. 이때 CPU은 권한수준이 최고수준의 실행모드가 된다. CPU의 인터럽트 메카니즘에 의해 자동변환 된다.
# 많은 시스템 호출 함수중에 해당 인터럽트 벡터숫자를 이용해 함수의 위치를 탐색하고 해당주소로 점프한다. 커널 속의 장치 목록에서 해당 장치를 찾고 드라이버의 함수 '''.open'''에서 정의된 '''mydrv_open'''(...)가 호출된다.
# mydrv_open()함수의 '''return'''에 따라 커널의 함수 호출이 완료되고, 커널은 다시 해당 응용 프로그램을 스케쥴링에스케줄링에 의해 활성화하고 해당 [[프로세서]]로 전환한다. 이 때 CPU의 권한수준은 다시 사용자모드로 전환된다.
 
만약 write함수나 read 함수의 호출에 의해, 커널의 함수가 호출된 후 return에 의해 종료되지 않으면 응용 프로그램은 스케쥴링에서스케줄링에서 빠져 커널의 상태에서 머물면서 블럭킹 현상이 발생한다. 해당 드라이버의 인터럽트 등으로 블럭킹을 해제할 수 있다.
 
== 같이 보기 ==