08-1 장치 컨트롤러와 장치 드라이버
키보드, 마우스 등 입출력장치에 보조기억장치도 포함
장치 컨트롤러
입출력장치는 CPU, 메모리보다 다루기 더 까다롭다.
많은 종류
키보드, 모니터, USB 메모리, SSD 등 다양하며 장치마다 속도, 데이터 전송 형식도 다양하여 규격화하기 어렵다.
낮은 데이터 전송률
전송률(transfer rate): 데이터를 얼마나 빨리 교환할 수 있는지를 나타내는 지표
전송률이 낮은 데이터는 같은 시간 동안 상대적으로 적은 데이터를 주고 받을 수 있음
장치 컨트롤러(device controller)
- 입출력 제어기(I/O controller), 입출력 모듈(I/O module)
- 입출력장치가 연결되는 하드웨어
- 모든 입출력장치는 장치 컨트롤러를 통해 컴퓨터 내부와 정보를 주고 받음
- CPU와 입출력장치 간의 통신 중개, 오류 검출, 데이터 버퍼링
- 버퍼링(buffering): 전송률이 높은 장치와 낮은 장치 사이에 주고받는 데이터를 버퍼라는 임시 저장 공간에 저장하여 전송률을 비슷하게 맞추는 방법
- 버퍼(buffer): 임시 저장 공간
- 내부 구조
- 데이터 레지스터(data register)
- CPU와 입출력장치 사이에 주고받을 데이터가 담기는 레지스터. 버퍼링을 위한 버퍼 역할
- 상태 레지스터(status register)
- 입출력장치가 입출력 작업 상태, 오류 여부 등의 상태 정보 저장
- 제어 레지스터(control register)
- 입출력장치가 수행할 내용에 대한 제어 정보와 명령 저장
- 데이터 레지스터(data register)
장치 드라이버
장치 드라이버(device driver)
- 장치 컨트롤러의 동작을 감지하고 제어함으로써 장치 컨트롤러가 컴퓨터 내부와 정보를 주고받을 수 있게 하는 프로그램
- 입출력장치를 위한 소프트웨어적인 통로
- 하드웨어적인 통로는 장치 컨트롤러
- 운영체제가 장치 드라이버를 인식하고 실행하는 주체
08-2 다양한 입출력 방법
프로그램 입출력
프로그램 입출력(programmed I/O)
- 프로그램 속 명령어로 입출력장치를 제어하는 방법
- 과정
- CPU가 하드 디스크 컨트롤러의 제어 레지스터에 ‘쓰기’ 명령을 보냄
- 하드 디스크 컨트롤러가 하드 디스크의 상태를 확인하고 본인의 상태 레지스터에 ‘준비 완료’를 표시
- CPU는 상태 레지스터를 **폴링(polling)**하며 준비 여부를 확인하고 준비되면 저장할 정보를 하드 디스크 컨트롤러의 데이터 레지스터에 입력
메모리 맵 입출력
메모리 맵 입출력(memory-mapped I/O)
- 메모리에 접근하기 위한 주소 공간과 입출력장치에 접근하기 위한 주소 공간을 하나의 주소 공간으로 간주
- 주소 공간 중 일부는 메모리 주소를 표현하는데 사용, 일부는 장치 컨트롤러의 레지스터를 표현하기 위해 사용
- 메모리에 접근하는 명령어와 입출력장치에 접근하는 명령어가 같음
- ‘읽어라’는 메모리 주소면 정보를 읽고, 장치 컨트롤러의 상태 레지스터면 상태를 확인함
고립형 입출력
고립형 입출력(isolated I/O)
- 메모리를 위한 주소 공간과 입출력장치를 위한 주소 공간을 분리
- 제어 버스 내에 ‘메모리 읽기/쓰기 선’과 ‘입출력장치 읽기/쓰기 선’이 분리
- 메모리 관련 명령어와 입출력장치 명령어가 다름
인터럽트 기반 입출력
인터럽트 기반 입출력(interrupt-Driven I/O)
- 장치 컨트롤러가 입출력 작업을 끝낸 뒤 CPU에게 인터럽트 요청 신호를 보내면 CPU는 하던 일을 잠시 백업하고 인터럽트 서비스 루틴을 실행
- CPU는 장치 컨트롤러에 입출력 작업을 명령하고, 장치 컨트롤러가 입출력장치를 제어하며 입출력을 수행하는 동안 CPU는 다른일을 처리
- 폴링(polling): 입출력장치의 상태는 어떤지, 처리할 데이터가 있는지를 주기적으로 확인하는 방식
- 인터럽트보다 CPU의 부담이 더 큼
- NMI(Non-Maskable Interrupt): 플래그 레지스터 속 인터럽트 비트가 활성화되어 있거나, 인터럽트 비트를 비활성화해도 무시할 수 없는 인터럽트. 높은 우선순위를 의미
- 프로그래머블 인터럽트 컨트롤러(Programmable Interrupt Controller)
- 우선순위를 반영하여 다중 인터럽트를 처리하는 하드웨어
- 여러 장치 컨트롤러에 연결되어 장치 컨트롤러에서 보낸 하드웨어 인터럽트 요청들의 우선순위를 판별한 뒤, CPU에게 가장 먼저 처리할 인터럽트를 알려주는 장치
- 과정
- PIC가 장치 컨트롤러에서 인터럽트 요청 신호를 수신
- PIC는 인터럽트 우선순위를 판단한 뒤 CPU에 처리해야 할 인터럽트 요청 신호를 전달
- CPU가 PIC에 인터럽트 확인 신호를 전달
- PIC는 데이터 버스를 통해 CPU에 인터럽트 벡터를 전달
- CPU는 인터럽트 벡터를 통해 인터럽트 요청의 주체를 알고, 해당 장치의 인터럽트 서비스 루틴을 실행
- PIC 여러 개로 더 많은 하드웨어 인터럽트를 관리할 수 있음
- NMI는 우선순위를 판별하지 않음
DMA 입출력
프로그램 입출력과 인터럽트 기반 입출력에서 입출력장치와 메모리 간의 데이터 이동은 CPU가 주도하며 데이터는 반드시 CPU를 거침
- 입출력장치 데이터를 메모리에 저장할 떄
- CPU가 장치 컨트롤러에서 입출력장치 데이터를 하나씩 읽어 레지스터에 적재
- 레지스터에 적재한 데이터를 메모리에 저장
- 메모리 속 데이터를 입출력장치에 내보낼 때
- CPU가 메모리에서 데이터를 하나씩 읽어 레지스터에 적재
- 적재한 데이터를 하나씩 입출력장치에 내보냄
DMA(Direct Memory Access): 직접 메모리에 접근할 수 있는 입출력 기능
DMA 컨트롤러: DMA 입출력을 하기 위해 필요한 하드웨어
- 과정
- CPU는 DMA 컨트롤러에 입출력장치의 주소, 수행할 연산, 읽거나 쓸 메모리의 주소 등 정보가 담긴 입출력 작업을 명령
- DMA 컨트롤러는 CPU 대신 장치 컨트롤러와 상호작영하며 작업 수행
- 필요시 메모리에 직접 접근하여 정보를 읽거나 씀
- 입출력 작업이 끝나면 DMA 컨트롤러는 CPU에 인터럽트를 걸어 작업 종료를 알림
- CPU는 입출력의 시작과 끝에만 관여하면 되어 작업 부담을 훨씬 줄일 수 있음
- 시스템버스는 공용자원
- DMA 컨트롤러는 CPU가 시스템 버스를 이용하지 않을때만 쓰거나 허락을 구해 사용
- CPU 입장에서 사이클 스틸링(cycle stealing)
입출력 버스
- DMA 컨트롤러는 시스템 버스를 두 번 사용
- 메모리에 접근할 떄 + 데이터를 장치 컨트롤러로 옮길 때
- DMA 컨트롤러가 시스템 버스를 사용하는 만큼 CPU가 이용할 수 없음
- 시스템 버스는 공용자원
- 입출력 버스(input/output bus)
- 장치 컨트롤러들이 시스템 버스가 아닌 입출력 버스로 DMA 컨트롤러에 연결
- PCI(Peripheral Component Interconnect) 버스, PIC Express(PCIe) 버스 등
- PCIe 슬롯: 여러 입출력장치들을 PCIe 버스와 연결해주는 통로
- 입출력 프로세서(IOP; Input/Output Processor), 입출력 채널(Input/Output Channel)
- 입출력 명령어의 인출, 해석, 실행을 담당하는 입출력 전용 CPU