포스트

운영체제 6. Read를 호출하면 무슨일이 벌어질까

운영체제 6. Read를 호출하면 무슨일이 벌어질까

Read 시스템 콜을 프로세스에서 호출하면 어떤일이 벌어지는가?

Pasted image 20250324153602.png

read를 호출하면, libc.a 라이브러리의 read 함수가 호출된다. 이 read 함수는 read 시스템 콜을 호출하는 트랩 명령어가 기록되어 있다. CPU는 트랩 명령어를 만나면 인터럽트 처리 루틴을 호출한다. 이 루틴은 다음과 같다. CPU Context를 보존하고, 커널 모드로 변경 후, 커널 내의 Interrupt Handler 함수를 호출한다. 함수 내에선 온전한 Context를 보존하고 트랩 코드를 가지고 Interrupt Descriptor Table에 접근하여 관련 함수 포인터를 얻는다. 만약 시스템 콜을 호출하는 트랩 명령어였다면, system_call() 함수를 얻는다. 시스템 콜 함수 내에선 미리 read in libc.a 내에 저장해뒀던 약속된 레지스터의 값을 읽어서 특정 시스템 콜의 Type Number를 얻는다. 이 Number를 가지고 시스템 콜 Table에 접근해서 실제 작업을 처리하는 시스템 콜 함수 포인터를 얻는다. 시스템 콜에서 Device를 사용해야 하면, Device Driver를 통해 디바이스 컨트롤러의 명령 레지스터에 read 명령을 적재한다. 이후 sleep을 걸거나, polling 방식으로 무한루프를 돌면서 상태 레지스터의 상태가 busy에서 done으로 바뀌는지 계속 체크할 수 있다. 여기선 sleep를 걸고 인터럽트 방식을 사용한다고 가정한다. 디바이스 내의 Data transfer 작업이 완료되면 디바이스는 인터럽트를 발생시킨다. 인터럽트는 인터럽트 컨트롤러를 만나 언젠가 수행하게 된다. 인터럽트가 수행되면 CPU는 다시 인러텁트 처리 루틴을 수행한다. 이번엔 시스템 콜이 아니라 ISR 함수를 호출한다. ISR 함수에선 기존의 Blocking해놨던 프로세스를 찾아 Ready 상태로 전환하는 작업을 수행해야 한다. Blocking했던 프로세스를 Ready로 바꾸고 스케쥴링 하면, 상태 천이된 프로세스는 언젠가 스케쥴링에 의해 Run 상태로 전환되고, Sleep 다음 줄부터 실행한다. 이후 자료 레지스터에 있는 값을 사용자 영역인 메인 메모리 영역으로 옮겨야 한다. 이 과정은 직접 레지스터 방식 vs Memory Mapped 방식 둘 중 하나를 선택해서 Main Memory로 옮겨올 수 있다. 옮겨오는 방식은 CPU가 직접 노가다뛰며 옮기거나, DMA를 사용해서 다이렉트로 옮기게 할 수 있다. 여기까지 하면 read 과정이 완료되고 시스템 콜을 리턴한다.

Pasted image 20250423134642.png