Mode switch : User → Kernel
- 그렇다면, Ch1에서 본 Memory protection에서 user에서 kernel모드로는 어떻게 전환될까?
- 다음과 같은 3가지 방법이 존재한다.
- Interrupts
- 미리 저장한 kernel의 code이다.
- Externel hardware에 의해서 Trigger된다(ex timer and I/O)
- Exceptions(=traps)
- 주로 software의 unexpected program behavior or malicious behavior에 의해 Trgger된다
- System calls
- exception mechanism에 의해서 구현된다 ( exception 발생하면 이를 해결하기 위해 syscall 호출)
- process에 의해 requested되며, process를 대신해 kernel에서 어떤 동작을 수행한다
Mode switch : Kernal → User
- New process/thread가 시작될 떄
- program이나 thread의 첫 번째 instruction으로 Jump한다
- interrupt, exception, syscall로부터 Return 할 때
- 중단되었던 execution을 재개한다
- Process의 Context switch가 일어날 때
- 다른 process를 재개한다
- User-level upcall이 발생할 때
- Asynchronous notifican을 프로그램에 알려준다.
Data Transfer Modes
I/O design question
- 그렇다면, 어떻게 I/O를 효과적으로 구현할까?
- I/O devices와 Cpu는 동시에 execute할 수 있다.
- 특정 device type마다 담당하는 device controller가 존재한다
- 각각의 device는 local buffer을 보유한다
- CPU는 I/O명령어로 I/O devices에 전달한다
- CPU는 main memory와 I/O device의 local buffer 사이에서 data를 운반한다.
- CPU는 time-consumin tasks로부터 자유로워야 하기에
- 운송 시간이 짧은 main memory와 local buffer 사이에서 data를 운반하고
- Device가 명령한 명령어를 수행했는지 안했는지 주기적으로 확인한다.
Data transfer modes
- Programmed IO ( PIO )
- CPU가 직접 memory와 I/O devces 사이의 data를 운반하는 것에 관여하는 방식(직접 data 교환)
2. Direct Memory Access( DMA )
- 주로 대역폭이 높고 빠른 데이터송이 요구되는 장치가 사용
- CPU의 관섭 없이 DMA라 Divice controller가 main memory에서 local buffer 사이의 data 전송 알아서 시행
- Data 전송이 block 단위로 이루어지고, block 단위에서만 interrupt가 발생
→ 그렇다면, CPU에게 Date transfer이 마무리되었다는 건 어떻게 알림?
Event Notification to CPU ( or kernel )
- Polling
- 정해진 시간 간격의 특정 하드웨어의 장치 상태를 확인 → 특정 조건이 만족되었으면 시스템은 적절 응답 수행
- CPU 바빠죽겠는데 I/O까지 확인할 시간 어딨음?;;;;; 그래서 나온
- Interrupt
- device가 I/O수행을 완료했다는 것을 CPU에 알리기 위해 발생
- Hardware-based mechanism임
- CPU는 각각 interrupt pin이라고 하는 물리적핀 보유
- Pin에 가는 signal이 interrupt handling 발생시킴
- 이렇게 함으로써 CPU는 I/O에 신경쓸 시간에 다른 동작 수행 가능
그렇다면, 이러한 interrupt를 어떻게 Handling하는가?
Handling interrupts ( or exceptions )
- Interrupt가 들어오면, 실행중이었던 user process의 context를 저장해놓는다
- 여기서 Context란 CPU register값들임 (IP, SP 등등)
- interrupt stack(fixed location)이라는 스택에 저장함
- 이후 interrupt handler에게 control을 넘긴다 ( Interrupt Service Routine)
- 참고로 kernel은 boot time때 ISR들을 set up 해놓음
→그럼, Interrupt stack이란 무엇인가
Interrupt stack
- Core마다 kernel memory에 갖고있는 stack임.
- 보통 process/thread는 kerenel stack와 user stack을 모두 보유하고 있음.
- Interrupt stack은 kernel stack의 한 부분이다!
→ 그렇다면, Interrupt handling을 하는 도중 interupt가 들어오면 어떡해?
- interrupt stack < kernel stack < kernel memory < virtual memory (각 용어별 범위: 참고바람)
Interrupt Masking
- Interrupt handler는 interupts가 off된 상태로 동작한다 !
- interrupt 비활성화 ⇒ interrupt 처리 ⇒ interrupt 재활성화
- x86에서는 CLI: disable interrupts / STI : enable interrupts 명령어임
→ 그렇다면, Interrupt handling이 완료된 후 Return은 어떻게 이루어지는가?
Returning from interrupt
- 일단, Kernel이 적절한 Interrupt handling을 진행함
- 이후, Control을 interrupt handler에서 interrupt를 당한 user process로 넘겨주게 된다.
- 이 때, interrupt handling을 시작하기 전 보관해놓았던 context를 interrupt stack으로부터 복원하는 과정을 포함함.
- IP, SP와 같은 Context를 복원한다는 것은,CPU가 interrupted된 user code를 다시 실행하게 해주는 것과 같다
- 근데 X86에서는 바로 kernel에서 user-level로 넘어가진 않고 iret 명령어 사용해야함