유투버 [널널한 개발자] 님의 강의를 듣고 정리 했습니다.
https://www.youtube.com/playlist?list=PLXvgR_grOs1DGFOeD792kHlRml0PhCe9l
인터럽트는 CPU에게 “띵동”하는 것이다.
인터럽트는 외부 인터럽트와 내부 인터럽트가 있다.
인터럽트마다 고유한 번호인 IRQ가 있다.
CPU는 인터럽트를 만나게 되면 인터럽트의 IRQ를 통해 정해진 인터럽트 서비스 루틴인 ISR을 수행하게 된다.
HW는 OS에 의해 보호된다. 따라서 고급 (User Layer) 에서 HW와 I/O를 하기 위해서는 OS, kernel의 도움을 받아야 한다.
이로 인해 user mode / kerner mode로 구분이 된다.
kernel은 System Call이라는 interface를 user layer에게 제공함으로써 HW와 I/O를 가능케 해준다.
Device와의 I/O 과정
프로세스에서 System Call 호출
CPU가 kernel mode로 전환됨 (mode_bit = 1 → 0)
프로세스는 대기 모드로 전환 (Context Switch)
kernel은 Device Driver를 호출해서 System Call 로직을 수행한다. (화면 출력 등등)
!! C code에서 printf(”Hello World!”); 화면에 출력한다고 가정하자.
위 예시를 보면 I/O가 굉장히 많다.
하지만 I/O는 굉장히 느리다. 고성능 프로그램 (주로 게임) 에서는 많은 I/O가 굉장히 빠르게 일어나야 한다.
그런데 이렇게 여러 I/O를 불필요하게 많이 거치게 되면 성능이 안 좋을 수 밖에 없다.
따라서 Direct (곧바로) X (cross), user mode에서 device driver로 바로 접근 가능하게 해주는 DirectX가 등장하게 됐다.
Direct Memory Access로, DirectX의 등장 배경을 보면 알 수 있듯이 DMA도 왜 사용하는지 느낌이 올 것이다.
핵심은
불필요한 I/O를 없앤다
다음은 DMA!