# I/O Hardware

# Device Drivers

# Colision



# I/O Hardware

CPU, Memory, HardDisk, Network card, ...


<Bus>

- System Bus, I/O Bus, 

- Address Bus, Data Bus, Control Bus 

- ISA, PCI, EISA, SCSI ...


> I/O Device 

- Controller, logic

- Register set


> I/O Device 내부의 Registers

- Status Register : 장치의 상태를 보여주는 Register

- Control Register : 장치의 동작을 결정하는 Register

- Data Register : 입출력할 데이터를 잠시 보관하는 Register

- Instruction Register ...


> I/O Device의 Register에 접근하는 두가지 방법

- Memory-Mapped I/O : 별도의 I/O address space를 갖지 않고, Physical address space의 일부를 할당하여 사용

* register를 access 하기위해 load/store 명령어를 사용 (모토롤라...),

- Port-Mapped I/O : 메모리의 주소와는 다른 방식의 주소를 할당하여 사용

* register를 access 하기위해 in/out 명령어를 사용 (Intel processor...), 


> Device Control

- device control = device의 register들을 프로그래밍

- OS는 I/O Bus의 address line에 특정 register의 address를 보낸 후 read/write같은 명령을 보내 수행하게 함


# I/O Devices의 분류

: unix OS는 굉장히 단순화 시키려고 노력하였으며 이런 환경에서 I/O Devices를 특성에따라 모델을 나누게 됨


- Character Devices : 입출력을 Character 단위로 수행. mouse, terminal, ...

- Block Devices : 입출력을 block이라는 임의의 단위로 수행. Disk Drive, Flash Drive, ...

- Network Devices : NIC, ...


> Character Devies


* ex. 


<Mouse driver의 역할 요약>

- Mouse Interrupt 발생 시, Mouse의 Data Register에서 값을 읽어오는 역할

- interrupt를 Event로 바꾸어 주는 역할


<Keyboard Driver의 역할>

- 키보드로부터 들오오는 각 캐릭터들을 Line buffer에게 순서대로 저장

- End-of-Line Character가 들어오면 전체 Line Buffer에 있는 데이터를  OS에게 전달


> Block Devices

- spindle

- arm assembly, arm, read-write head

- Track : 한 디스크 표면에서 스핀들로부터의 거리가 동일한 환형의 저장 공간

- cylinder : 여러장의 디스크를 수직으로 쌓여있는 동일한 반지름의 Track들의 집합

* cylinder 단위의 데이터 접근이 중요한 이유 (왜 cylinder라는 개념이 있는건가?)

: Arm Assembly가 고정된 상태에서 여러 platter에 걸쳐있는 한, 실린더의 트랙들을 동시에 읽을 수 있기 때문

- sector : 각각의 track을 분할하는 디스크 read/write 단위의 영역


> Disk Operation


* Sector : 디스크를 읽을 때 data transfer가 일어나는 최소 unit.

Sector에 접근하기 : cylinder number, track number in the cylinder, sector number in the cylinder


1. read/write head 선택

2. "seek", arm assembly를 해당 cylinder로 이동. (Move heads to the correct track)

* seek time : arm을 목표한 지점(해당 cyliner)까지 이동하는데 걸리는 시간

3. 해당 sector가 돌아올때까지 기다림 (spindle의 회전수에 비례, RPM-Rotation Per Minute)

* Rotational Delay : 디스크가 회전하여 목표한 지점(해당 섹터)이 head에 도착하는 시간


> Disk Performance

- seek time : 0-50 ms (avg 10-20 ms)

- rotational delay : 0-16ms

- typical drive spins at 3600-5400 RPM



> Flash Drive

- NAND flash memory : RAM과 Access pattern이 굉장히 다름. data tranper가 bytes단위가 아닌 block 단위로 일어남

- Page : Read/Write를 수행할 때 대상이되는 Data block. 2KB, 4KB, 8KB

* Page의 일부분은 Data를 저장하는 공간과 Spare Area라는 패리티, 에러처리 등 부수적인 정보 등을 저장하는 공간으로 나뉨

- Block : 64 pages, 128 pages


* Flash Memory > Blocks in a Flash Memory > pages in a Block > Spare areas in a page


* Flash Operations

- read : 하나의 페이지를 통째로 읽어옴

- write/program : flash의 해당 영역을 굽기

- erase : block 지우기. flash는 rom이므로 rewrite할 수 없음. 우선 지우고 다시 써야함.


<특성, 제약사항>

* Erase-before-write : NAND Flash 메모리는 데이터의 덮어쓰기가 불가능 하기 때문에 먼저 Erase로 초기화 한 후 write 해야 함.

* Worn-out : Erase 가능한 횟수가 제한적임

* Wear-leveling : NAND Flash의 한 영역에 Erase가 집중되어 worn-out이 발생하는 것을 막기위해 전체 영역을 고루 사용하도록 조절하는 기술

* read/write의 단위는 page, erase의 단위는  block


- Flash Memory를 Storage로 사용해 file system 구성하려면, Erase-before-write라는 제약조건 때문에 

반드시 Log Structure Architecture가 필요함


> Page단위로 write를 수행하다가 Erase를 수행할 때, 단위가 block으로 page보다 크므로 지우려는 page 외에도 다른 page의 데이터가 모두 지워짐

> 로그를 남겨 관리를 해야함. page remapping after update.

=> Log-structured file system


# Device Drivers

:  I/O Devices의 Control다른 프로그램들이 어떤 하드웨어 디바이스를 잘 사용할 수 있게 컨트롤 해주는 컴퓨터 프로그램

- 하드웨어 적인 측면을 관리하며, 기능을 사용자에게 추상화 시켜 사용하기 편하게 도와주는 역할을 함

Application과 Device, OS와 Device  사이에 위치하며, User들이 Device를 사용하기위해 함수들을 제공


* SW System의 구성

- 정적인 구성요소 : structure(process)

- 동적인 구성요소 : behavior(program)


- Device Drives의 요소

정적 구성요소 : Device Drives를 User Program이 사용하기 위해 호출하는 APIs, Operations...

동적 구성요소 : Interrupt Service Routin. 

=> 즉, Device Drives는 라이브러리이며 어떤 구성요소는 Interrupt에 의해 호출되며, 어떤 구성요소는 User Programs에 의해 호출됨


- UNIX 계열의 Device Drivers


* Unix 

- 시스템의 단순화, portability 높이기.

portability를 높이기
 : machine dependent 
한 부분을 정형화 시켜서 정리해야 함

 : micro processor에 micro architecture specipy한 부분(MMU, context)이나, Memory layout, system bus architecture, Device관련 부분 들


* Unix Device Drivers의 대표적인 5가지 함수

- Open : 디바이스를 initialization. OS관점에서 레지스터와 디바이스 드라이버가 필요한 데이터 스트럭쳐를 잡아주는 역할 등

- Close : release

- read/write

- I/O CTL : I/O Contol


* Type of Unix/Linux Device

- Character Devices : data transfer unit이 캐릭터 단위. 시퀀셜 엑세스에 사용

일반적으로 사람과 상호작용 하므로 보통 slow device.

- Block Devices : 데이터 트랜스퍼 유닛이 블럭단위. 랜덤 엑세스에 사용

* block buffer cache : Large scale의 볼륨을 단위로 high speed가 필요함. 캐시로 CPU에 비해 상대적으로 속도가 느린 block device의 성능을 보완한 것.

- Network Devices


> File System의 역할

1. 디스크에에 있는 데이터를 읽거나 쓸 쑤 있는 여러 기능을 제공

2. File이나 Device 같은 시스템에 존재하는 자원에게 Name Space(simbolic name)를 제공(Unix/Linux에서는 path와 같은 형태..)


> Device File : 일종의 스페셜 파일을 생성하여 파일과 디바이스를 연결시키기

- 일반 데이터 파일로 관리

- /dev 밑에 file의 형태로 존재

- 하나의 디바이스에 여러 이름의 파일을 붙일 수 있음

ex. /dev/psaux, /deb/psmouse = serial mouse


* File의 데이터

- Real Data

- Metadata : file의 특성을 표현하는 부가적인 데이터

: 생성일, 수정일, 엑세스 권한 등


- Device File의 metadata

- Device Type : block, charactor

- Major Number : 어떤 타입의 디바이스인지 나타내는 필드. tty, 

- Minor Number : 대상이 되는 디바이스를 구별하기 위해 디바이스 드라이버에게로 보내는 argument. (Kernel don't care)





+ Recent posts