입출력 장치 제어기
status register, control register, dataregister, input/output 레지스터 등등이 있다.
control 비트에 쓰면 그게 곧 제어다.
그냥 쓰던 명령어 쓴다.
실제 메모리라기 보다는, 메모리 영역에 가상적으로 사상하는 것이다.
만약, 해당 주소공간이 입출력 장치였다면, 해당 입출력 장치에 상응하는 일을 수행하게끔 한다.
코딩을 아예 동일하게 할 수 있다.
만약 별도의 메모리 버스를 가지면, I/O 장치에서 어떻게 확인을 하겠는가,,?
메인보드의 칩에서 주소공간을 확인하여 PCI 버스로 보내주거나,
스누핑을 달아서, 메모리 공간이 만약 실패하면 자연스럽게 PCI 버스 쪽으로 넘어오도록.
관계 없는 두 공간을 참조한다.
코드를 짤 때, C언어 만으로는 이런 하드웨어적 연산을 수행할 수 없기 때문에 어셈블리를 추가해야 한다.
버퍼를 쓰는 이유
항상, 비트단위로 막 들어오는데 이걸 바로 메모리에다가 쓰라고 할 수는 없잖아.
또한, 체크섬이 필요할 수 있잖아
상황은, I/O 장치에 쓰려는 상황
실제 사용
엄청나게 많은 종류의 장치들이 존재하고, OS에서 일일이 이거를 다 컨트롤 할 수는 없다.
그러니까, OS의 API 규격(인터페이스)에 맞게 장치들을 매핑하도록, 장치드라이버를 제조사마다 만들도록 해라.
ioctl콜
각자의 드라이버가 사용하는 임의의 명령을 실행할 수 있게 해준다.
내부구현은 다를지라도 사용자에게 파일형태로(/dev) 존재한다.
인터벌 타이머
시간이 지난 후 인터럽트를 발생