- toc {:toc}
I/O Hardware
- I/O 하드웨어는 signal을 보내면서 OS와 소통한다.
- Port : 장치간 연결 지점
- Bus : PCI or PCIe bus, Expansion bus, Serial-Attached SCSI (SAS) for disks
- Controller : 컨트롤러를 이용해 device에 접근한다.
- 데이터를 디스크에 쓰는 역할, Error collection 역할
- 메인 메모리 사용하도록 만들어줌
- Direct I/O : I/O port number를 사용하여 할당 (메인 메모리 주소체계에 속하지 않음)
- Memory-Mapped I/O : Direct I/O와 반대로 메인 메모리 주소체계와 I/O device를 통합해서 사용
- 주소를 통해서 메인 메모리 주소인지 I/O 주소인지 구분 가능
Polling
- 각 I/O byte에 대해 디바이스에 변화가 있는지 지속적으로 감시하는 방식 (busy waiting 발생)
- Busy bit를 state register로 부터 읽는다. (0 될 때 까지)
- Host(CPU)가 read write bit를 설정하고 write면 data-out register에 데이터를 복사한다.
- Host가 command-ready bit를 1로 설정한다.
- Controller가 busy bit을 1로 설정하고 전송을 시작한다.
- 전송이 끝나면 controller는 bit들을 다시 초기화한다.
Interrupts
-
CPU가 모든 instruction을 실행하고 난 후 interrupt-request line을 확인
- Interupt 탐지되면 CPU가 메모리의 고정된 주소에 위치한 interrupt request routine으로 이동
-
CPU → 2개의 interrupt request line을 갖는다.
- Nonmaskable : 회복 불가한 메모리 오류에 대한 매우 중요한 인터럽트 (즉시 처리되어야 한다.)
- Maskable : 요청된 컨트롤러에 의해 처리되는 인터럽트
-
Interrupt vector → 올바른 handler로 interrupt 전송
- 해당 handler에 대한 memory address 포함
- OS는 boot time에 관련된 interrupt handler를 설치한다.
-
예외처리를 위해서도 사용된다.
-
Multi-CPU는 인터럽트를 동시에 처리할 수 있다.
-
빈번하고 시간에 민감한 처리에 사용하고 빠르다.
Direct Memory Access
-
I/O가 발생하는 경우 device에서 CPU로 polling, interrupt방식을 통해 신호를 보내고 CPU가 다음의 signal을 처리
-
DMA 방식에서는 CPU를 거치지 않고 바로 Main memory로 접근한다.
-
DMA controller 필요
-
작동 방식
- CPU는 DMA command block을 메모리에 작성
- CPU가 DMA command block 주소를 DMA controller에 기록하고 다른 작업을 진행
- DMA contoller는 직접 메모리 버스를 운영해 한 워드씩 전송
Kernel I/O Structure
- I/O system call은 device behavior들을 캡슐화한다.
Block and Character Devices
-
Block device : Block 단위로 데이터를 주고 받는 것.
-
Block device는 disk drive를 포함한다.
- Command : read(), write(), seek()
- Raw I/O, direct I/O(buffering, locking 없이), 또는 file-system 접근을 말한다.
- Demand paging 통해 가져온 virtual memory, cluster에 파일 mapping ⇒ Block 단위
-
Character device : Character 단위로 주고 받는 것
- Command : get(), put()
Clocks and Timers
- Basic function
- 현재 시간
- 경과 시간
- X 연산에 의해 발생된 시간 T
Clock signal 만들어 사용
Nonblocking and Asynchronous I/O
- Blocking : I/O 요청이 완료될 때까지 프로세스 중단
- Nonblocking : I/O 요청 후 기다리지 않고 프로세스 진행.
- Asynchronous : I/O 요청 후 I/O 처리 완료되었다고 interrupt callback오면 받는다.