티스토리 뷰
입출력
장치는 연결점, 포트를 통해 통신한다.
와이어의 집합을 버스라고 하며, PC 시스템 버스 중 하나로 PCIe bus가 있다.
port, bus, device등의 전기 장치를 운영하는 것을 controller라고 부른다.
Interrupt
영어로는 방해하다 라는 뜻인데, 전산학 용어로는 하드웨어가 cpu에게 보내는 신호라고 생각하면 된다.
다양한 I/O장치와 통신하기 위해 cpu는 장치를 지속적으로 확인하는 polling 방식을 사용할 수 있지만 비효율적이다.
프로세스가 systemcall(소프트웨어 인터럽트, 트랩)을 통해 OS와 통신한다면, 하드웨어는 인터럽트를 통해 OS와 통신한다.
cpu는 instruction을 한 줄 실행할 때마다 인터럽트 발생 여부를 체크한다.
인터럽트를 발생시키면, cpu는 인터럽트 벡터를 통해 알맞은 인터럽트 핸들러를 실행한다.
인터럽트 별로 우선 순위가 있으며, 트랩은 우선 순위가 꽤 낮다.
throughput이 중요한 I/O는 폴링 방식을 사용하기도 한다.
DMA: Direct Memory Access
데이터를 장치 버스에 태워서 장치에 전송하는 작업들을 cpu에게 맡기면 성능이 너무 떨어질 수 있다. 데이터 전송만을 위한 장치가 DMA 컨트롤러다.
cpu 메모리에 DMA 명령어 블록을 적고, DMA controller에 명령어 블록의 주소를 적으면, DMA가 알아서 이 명령어를 수행하여 장치에 데이타 전송을 한다. 장치 컨트롤러가 DMA controller에게 신호를 보내면, DMA controller는 메모리 버스를 멈추고, 드라이버에게 ok신호를 보낸다. 드라이버 컨트롤러는 이제 전송을 시작하고, DMA는 전송이 끝나면 인터럽트를 발생시킨다.
DMA로 전송되는 데이타는 모두 커널 메모리 영역에 담겨 있다. 유저 쓰레드에서 전송된 데이타를 확인하기 위해서는 커널 메모리 영역에 있는 데이타를 유저 쓰레드 데이타로 옮겨야 하고, 이는 double buffering이라 불리는 문제가 된다. 이를 해결하기 위해 memory mapped I/O라고 하여, 논리 주소를 장치 controller의 레지스터 주소로 매핑하여 일반적인 메모리 접근으로 사용하는 방법이다.
장치 드라이버
장치는 controller를 통해 제어되고, 컨트롤러는 제조사에서 개발한 소프트웨어인 드라이버에 의해 제어된다.
커널 모드에서 I/O관련 작업을 할 때는 드라이버 인터페이스를 통해 다양한 장치를 관리할 수 있다.