📑 본 글은 <혼공컴운>을 읽고 정리한 글입니다.

1. 장치 컨트롤러와 장치 드라이버
까다로운 입출력장치..
- 입출력장치에는 종류가 너무너무 많다.
- 다양한 입출력장치와 정보를 주고받는 방식을 규격화하기 어렵다.
- 사용하는 언어가 다 다르다고 생각해보자.
- CPU와 메모리의 데이터 전송률은 높지만, 입출력장치의 데이터 전송률은 낮다.
- 전송률(transfer rate) : 데이터를 얼마나 빨리 교환할 수 있는지
- 전송률의 차이로 CPU와 메모리 - 입출력장치 간의 통신이 어렵다.
1-1. 장치 컨트롤러
장치 컨트롤러(device controller)
- 모든 입출력장치는 장치 컨트롤러를 통해 컴퓨터 내부와 정보를 주고받는다.
- 직접 연결 X, 이 하드웨어로 연결됨
- 얘는 시스템 버스와 연결됨
- = 입출력 제어기, 입출력 모듈
- 장치 컨트롤러는 하나 이상의 입출력장치와 연결되어 있다.
장치 컨트롤러의 역할
- CPU와 입출력장치 간의 통신 중계
- 오류 검출
- 데이터 버퍼링
- 전송률이 높은 장치와 낮은 장치 사이에 주고받는 데이터를
- 버퍼(임시 저장 공간)에 저장하여 전송률을 비슷하게 맞춘다.
장치 컨트롤러의 구조
- 데이터 레지스터
- 버퍼 역할
- 최근에는 용량 때문에 레지스터 대신 RAM 사용하기도..
- 상태 레지스터
- 제어 레지스터
1-2. 장치 드라이버
새로운 장치를 컴퓨터에 연결하려면 장치 드라이버를 설치해야 한다.
장치 드라이버
- 장치 컨트롤러가 컴퓨터 내부와 정보를 주고받을 수 있게 하는 소프트웨어 프로그램
- 운영체제가 장치 드라이버를 인식하고 실행할 수 있다면 그 장치는 컴퓨터 내부와 정보를 주고받을 수 O
2. 다양한 입출력 방법
장치 컨트롤러는 어떻게 CPU와 정보를 주고받을까요??????????
2-1. 프로그램 입출력
프로그램 입출력(programmed I/O)
- 프로그램 속 명령어로 입출력장치를 제어한다.
- CPU가 장치 컨트롤러의 레지스터 값을 읽고 씀으로써 이루어진다.
- CPU가 컨트롤러의 제어 레지스터에 쓰기 명령 보냄
- 상태 레지스터의 값을 주기적으로 읽어서 준비됐는지 체크함
- 폴링(polling) : 입출력장치의 상태가 어떤지 주기적으로 확인하는 방식
- 데이터 레지스터에 값 싹 보내버린다. 알아서 버퍼링하거라.
- 상태 레지스터에 다 썼다 올라오면 확인.하고 끝
CPU가 장치 컨트롤러의 레지스터들을 어떻게 알고 read/write 할까?
- 메모리 맵 입출력(memory-mapped I/O)
- 메모리 안에 입출력장치를 위한 주소 공간을 매핑해둔다.
- CPU가 메모리 주소나 장치 컨트롤러의 레지스터를 걍 똑같이 대하면 됨.
- BUT! 메모리 주소 공간이 축소됨
- 고립형 입출력(isolated I/O)
- 메모리와 입출력장치를 위한 주소 공간 분리합니다.
- 제어 버스에 ‘메모리 r/w’랑 ‘입출력장치 r/w’선을 따로 둔다.
- 두 개에 접근하는 명령어가 달라진다…
- 메모리 주소 공간 굳건하다.
2-2. 인터럽트 기반 입출력
인터럽트 기반 입출력
- CPU는 장치 컨트롤러에 입출력 작업을 명령한다.
- 장치 컨트롤러가 입출력을 수행하는 동안 CPU는 딴 일 함
- 다 하면 CPU에 인터럽트 요청 신호를 보낸다.
- CPU는 하던 일을 잠시 백업하고 인터럽트 서비스 루틴을 실행한다.
여러 입출력 장치에서 인터럽트가 동시에 발생하면 어떡해?
⇒ 우선순위가 높은 인터럽트 순. ex) NMI(non-maskable interrupt)
using 프로그래머블 인터럽트 컨트롤러(PIC: programmable interrupt controller)
- 여러 장치 컨트롤러에 연결됨 HW
- 걔네가 보낸 인터럽트 요청들의 우선순위 판별함
- CPU에 뭘 먼저 해야하는지 알려줌.
- PIC가 데이터 버스에 인터럽트 벡터 태워보냄
- CPU가 그거 보고 인터럽트 서비스 루틴 실행함
2-3. DMA 입출력
CPU의 역할 DMA가 대신해드림. 원래 레지스터 맨날 거쳐가서 힘들었다구.
DMA(Direct Memory Access) 입출력
- 입출력장치와 메모리가 CPU를 거치지 않고도 상호작용할 수 있는 입출력 방식
- 시스템 버스에 연결된 DMA 컨트롤러 필요 HW
- DMA 입출력 과정
- CPU는 DMA 컨트롤러에 입출력 작업 명령을 내리고 딴 일함.
- DMA는 메모리와 직접 상호작용하며, 입출력 작업 진두지휘.
- 끝나면 CPU에 인터럽트 걸어.
Nevertheless! 시스템 버스는 한 번에 한 장치만 쓸 수 있음
DMA 컨트롤러와 CPU의 시스템 버스 쟁탈기.. to be continued
방법 1) CPU가 안 쓸 때 조금씩 쓰기
방법 2) CPU에게 양해를 구하고 부리나케 쓴다.
사이클 스틸링(cycle stealing)
: CPU 입장에서는 도둑맞은 심정
문제 상황
ㄱ. 원래 시스템 버스에 DMA 컨트롤러랑 장치 컨트롤러 줄줄이 연결됨
ㄴ. 그럼 메모리 접근, 장치 컨트롤러 접근 = 2번씩 시스템 버스 써야함
ㄷ. CPU 눈치보여요.
⇒ 입출력 버스
- 장치 컨트롤러들만의 버스 생성
- 메모리 --시스템 버스-- DMA 컨트롤러 —입출력 버스-- 장치 컨트롤러
- 시스템 버스 1회만 사용하겠음
- 요새 대부분의 입출력장치(장치 컨트롤러)는 시스템 버스가 아닌 입출력 버스와 연결됨