✅ 컨트롤러에게 데이터/커맨드를 보내기 위해서는 ?
Direct IO vs Memory Mapped IO
✅ IO 데이터가 많은 경우
DMA(Direct Memory Acess)
✅ IO가 준비되었는지는 어떻게 알아?
Interrupt - driven IO vs Polling
✔️ IO Controller
는 Input device와 Output device를 버스 시스템을 통해서 CPU와 연결해주는 역할을 함
✔️ Device Controller
는 port, bus, device에서 실행 가능한 electronics(ex. 프로세서, 레지스터, 메모리.. ) 의 컬렉션임
✔️ IO device가 동작하는 방법은 한가지 : 레지스터에 쓰여 있는 값을 읽어서 동작함
근데 동작시키는 방법(레지스터에 접근하는 방법)은 여러가지 🔽
CPU가 장치의 레지스터에 직접 명령을 작성해서 I/O 명령을 내림
✔️ CPU가 디바이스한테 Direct IO정보를 넘겨줌
✔️ 데이터를 전송하는 데 느리다
예시) Port Mapped Instruction (Special Instruction)
⚠️ 특정 IO 레지스터에 접근하기 위한 명령어가 따로 존재 ⚠️
Device control 레지스터가 메모리 주소 공간에 mapping 된 것. 따라서 CPU는 메모리의 mapping된 위치에서 읽기/쓰기를 통해 I/O 요청을 실행합니다.
✔️ 메모리의 주소 중 일부를 IO 레지스터한테 부여함
✔️ 메모리에서 데이터를 읽는 명령어와 메모리에 데이터를 쓰는 명령어를 그대로 사용하여 특정 I/O 레지스터에 접근하는 방식
✔️ large address space에서 빠르다!
IO device가 메모리에 직접 접근하여 읽거나 쓸 수 있도록 하는 기능
🔥 CPU의 개입 없이 🔥 IO 장치와 기억 장치 사이의 데이터를 접근하는 전송 방식인 것
CPU가 데이터를 주고 받는 방식임. 효율 🔽
하드디스크에서 데이터를 꺼낸 후 버스를 통해서 CPU 레지스터에 옮겨지고 다시 시스템을 통해서 CPU 레지스터에서 메모리로 이동함
+) 폴링 사용함
PIO단점을 제거한 것이 DMA
✔️ DMA Controller를 사용 : 하드디스크와 메모리를 직접 연결하여 CPU는 제어신호만 주고받을 뿐 데이터 전송에서 제외시킬 수 있다. 따라서 입출력 시 CPU는 제어를 위해 데이터 전송 시작과 완료에만 할당되어 CPU 자원의 낭비가 제거된다.
IO device가 준비 상태인지를 CPU가 지속적으로 확인하는 방법
✔️ IO port의 status 레지스터의 값( busy bit )을 수시로 확인: 해당 장치의 준비 상태를 검사할 수 있다.
✔️ Polling Cycle
☝🏻 CPU가 IO Operation 요청
✌🏻 busy bit가 0이 되면 IO 컨트롤러가 작업 수행
🤟🏻 IO 작업 완료!
✔️ 간단하지만
✔️ CPU가 너무 오래 기다리게 될 수도 있음
그래서 사용하는 것이 인터럽트
➡️ 기다리면서 다른 일 할 수 있음
준비가 되면 IO device가 준비되었다고 알려주는 방법
CPU가 I/O 장치를 기다리지 않고 다른 작업을 수행하다가, I/O 장치가 준비되었다고 Interrupt 신호를 보내면 그때서야 인터럽트 루틴을 호출함으로써 해당 입출력 요청을 처리하게 된다.
✔️ 실행 순서
1. CPU가 리퀘스트를 받음
2,3. IO 컨트롤러가 CPU가 다른 일을 할 동안 데이터를 얻는다
4. IO 작업이 끝나면 IO 컨트롤러가 CPU한테 인터럽트 를 건다
5. 인터럽트 핸들러가 인터럽트 루틴을 호출하면서 요청 처리
6,7 CPU는 다시 resume
IO 장치에 의해 CPU의 하드웨어인 interrupt-request line이 트리거되면서 발생
✔️ 사용되는 곳
✔️ 예시
출처 : https://hydroponicglass.tistory.com/283
https://it-eldorado.tistory.com/24