[운영체제] 14. 입출력 하드웨어

임호연·2021년 5월 21일
0

기록

목록 보기
15/20
post-thumbnail

입출력하드웨어

PC버스의 일반적인 구조

  • 각 입출력 장치들 간의 기본 통로가 된다.(PCI버스)

컨트롤러

  • 입출력 장치 제어기

    status register, control register, dataregister, input/output 레지스터 등등이 있다.

    control 비트에 쓰면 그게 곧 제어다.

I/O 방법

메모리 맵드

  • 그냥 쓰던 명령어 쓴다.

  • 실제 메모리라기 보다는, 메모리 영역에 가상적으로 사상하는 것이다.

  • 만약, 해당 주소공간이 입출력 장치였다면, 해당 입출력 장치에 상응하는 일을 수행하게끔 한다.

  • 코딩을 아예 동일하게 할 수 있다.

  • 만약 별도의 메모리 버스를 가지면, I/O 장치에서 어떻게 확인을 하겠는가,,?

    메인보드의 칩에서 주소공간을 확인하여 PCI 버스로 보내주거나,

    스누핑을 달아서, 메모리 공간이 만약 실패하면 자연스럽게 PCI 버스 쪽으로 넘어오도록.

포트 맵드

관계 없는 두 공간을 참조한다.

코드를 짤 때, C언어 만으로는 이런 하드웨어적 연산을 수행할 수 없기 때문에 어셈블리를 추가해야 한다.

입출력 장치들의 특성

DMA

  • 버퍼를 쓰는 이유

    항상, 비트단위로 막 들어오는데 이걸 바로 메모리에다가 쓰라고 할 수는 없잖아.

    또한, 체크섬이 필요할 수 있잖아

폴링 방식

상황은, I/O 장치에 쓰려는 상황

  1. cpu가 계속 비지비트를 확인한다.
  2. 비지가 빠지면, CPU가 control 레지스터를 바꾸고, 인풋 레지스터에 데이터를 써놓는다.
  3. controller는 자기 control 비트를 보고,비지를 바꾼다.
  4. 입출력을 수행한다.
  5. 다시 비지를 바꾼다. 또한 상태레지스터를 통해 이전 입출력이 어떻게 진행되었는지 확인해준다.

인터럽트 방식

API(장치 드라이버)

과정

  • 실제 사용

    1. open된 파일 디스크립터에 read 시스템 콜
    2. 버퍼캐시에 있는지 확인, 있으면 return
    3. 없으면, 실행큐에서 대기큐로 프로세스를 옮기고, 입출력이 실행
    4. 장치 가동(제어레지스터 입력) 및 데이터를 커널메모리로 옮기기
    5. DMA를 사용할 수 있다.
    6. 인터럽트
    7. 커널에게 알린다
    8. 커널 → 프로세스로 메모리 복사
    9. 웨이팅 큐에서 레디 큐로 옮긴다
  • 엄청나게 많은 종류의 장치들이 존재하고, OS에서 일일이 이거를 다 컨트롤 할 수는 없다.

  • 그러니까, OS의 API 규격(인터페이스)에 맞게 장치들을 매핑하도록, 장치드라이버를 제조사마다 만들도록 해라.

  • ioctl콜

    각자의 드라이버가 사용하는 임의의 명령을 실행할 수 있게 해준다.

  • 내부구현은 다를지라도 사용자에게 파일형태로(/dev) 존재한다.

메이저, 마이너 넘버

  • 메이저 : 장치 종류메이저 : 장치 종류
  • 마이너 : 장치 개별 고유 식별자

캐릭터 디바이스의 구조

  • open
    1. read minor
    2. init apropriate device(major)
    3. increase usage count ++
  • close
    1. usage count —
    2. free
  • device table에는 major 넘버 단위로 관리할듯
  • minor 넘버를 실제 fetch할 때 쓰겠지

  • 당연히 메이저 넘버로 인덱싱하고당연히 메이저 넘버로 인덱싱하고
  • open systemcall → file path name 을 열면, 거기서 major number fetch하고, minor number fetch해서 읽는다.
  • 막상 저 엔트리로 가면 포인터가 있다. 그 포인터로 가면 실제 디바이스 드라이버에 대한 정보가 담긴다.
  • 실제로, 코드 단에서 open 을 호출하면 저 디바이스 드라이버의 open 함수를 실행하겠지, 그리고 그 argument는 물론 마이너 넘버다.

블록 디바이스 구조

  • 요청 시 버퍼캐쉬를 뒤지고, 없으면 그제서야 리퀘스트 큐에 저장
  • 스케줄링이 중요할 듯

명령어 별 하는 일

  • count를 저장해놓으면, 이후에 디바이스드라이버를 커널에서 뺄 지 넣을 지 결정할 수 있다.

메모리 mapped I /O

  • 메모리 상에 요구페이징 방식으로 하는 일
  • 가상메모리 상에 올리면, 그게 이제 페이지 폴트 처리가 되고
  • 그렇게 되면, 페이지 폴트 처리 루틴에 따라 파일시스템에서 가져오는 구조

타이머

  • 인터벌 타이머

    시간이 지난 후 인터럽트를 발생

동기와비동기

장치상태 테이블

  • 스케줄링을 위함이다.

버퍼링

필요성

  • 맨날 쓰는게 아니라, 모아서 쓰면 효율적

스풀링

  • 모든 프린터로 가능 명령을 fetch해서, 대기큐에 넣는다.
  • 멀티플렉스 할 수 없는 장치들에 대한 대안
  • open 할 수 있는 장치를 하나만 놓는 것도 방법.

커널에서 프로세스가 파일을 열고 있는 모양세

  • open을 하면, 장치에 맞는 자료구조가 생긴다.

드라이버(커널 입출력 서브시스템)이 결과적으로 하는 일

컴퓨터간 통신

스트림

  • 모듈이 상황에 따라 바뀌며, 호환성을 제공 할 수 이싿.
profile
해탈하자

0개의 댓글