각각의 io device들은 디바이스들을 조정하는 device controller가 작업을 해준다.
디바이스 콘트롤러들도 작업공간이 필요한데, local buffer라 이야기한다.
cpu 내에는 memory보다 빠른 register라는 저장공간이 있다.
mode bit은 Cpu에서 실행중인 명령어가 사용자프로그램인지, 운영체제인지 구분해주는 것이다.
interrupt line : cpu의 실행 중인 명령을 멈추는 입력신호가 있는지 확인하기 위한거(지금 이해한거)
ex ) i/o에서 오는 신호가 왔을때
timer에서 지정된 시간을 썼다고 왔을때
time : 특정 프로그램이 CPU를 독점하는것을 막기 위한 하드웨어
사용자 프로그램은 I/O에 직접적으로 instrunction을 할 수 없고, 운영체제에게 위임을 한다.
보안상의 이유와 다른이유 때문에 사용자프로그램이 직접 요청을 금지시켰다.
키보드 입력이 사용자 프로그램이 있다고 하면, 이 프로그램은 운영체제에 키보드 입력이 필요하다고, 요청을 보내고, 운영체제는 키보드 입력을 받을 수 있도록 작업을 한다.
작업을 요청을 한뒤 이 프로그램은 키보드 입력이 들어올때까지는 다음 작업을 수행할 수 없으므로, 다른 사용자프로그램에게 제어권을 넘겨준다.
그러다가, 키보드에서 입력이 들어오게 되면 interrupt line을 통해 cpu에 알려주게 되고, CPU에서는 다른 프로그램이 실행중이더라도 인터럽트가 들어왔기 때문에, 잠시 프로그램 실행을 멈추고, 제어권을 운영체제가 가지고 와, 키보드의 입력을 카피해서 키보드입력을 요구했던 프로그램에게 카피를 해준 뒤, 보통은 인터럽트를 당한 프로그램에게 제어권을 넘겨준다.
Mode bit
mode bit은 0일때에는 모니터모드(커널모드) 1일때에는 사용자모드(사용자 프로그램 수행)
보안을 해칠 수 있는 중요한 멍령은 모니터모드에서만 수행가능
interrupt나 Exception 발생시 하드웨어가 mode bit을 0으로 바꿈
사용자 프로그램에게 CPU를 넘기기전 mode bit을 1로 세팅
사용자가 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않기 위한 보호장치
Timer
정해진 시간이 흐른 뒤 운영체제에게 제어권이 넘어가도록 인터럽트 발생
타이머는 매 클럭 1틱마다 1씩 감소
타이머 값이 0이되면 타이머 인터럽트 발생
CPU가 특정프로그램이 독점하는 것으로부터 보호
타이머는 timer sharing을 구현하기 위해 이용이 되고, 현재시간을 계산하기위해서도 사용한다.
Device Controller
I/O device controller
해당 i/o 장치유형을 관리하기 위한 일종의 작은 CPU
제어 정보를 위해 control register, status register를 가짐
이 register는 CPU에서 해야할 작업들에 대한 내용이 담기는 것
local buffer를 가짐
I/O의 실행결과에 대한 데이터들을 저장하거나 출력을 위한 데이터를 저장하는 저장소
I/O는 device와 locl buffer 사이에 일어남
Device controller는 I/O가 끝났을 경우 interrupt로 CPU에 그 사실을 알림
device driver : OS 코드 중 각 장치별 처리루틴 software
device controller : 각 장치를 통제하는 일종의 작은 CPU hardware
DMA Controller
direct memory access controller
메모리에 직접적으로 접근할 수 있는 컨트롤러
I/O 장치의 빈번한 인터럽트를 줄여주기 위한 장치
I/O 장치의 저장된 데이터를 메모리에 직접 적재를 해주고, 모와서 CPU에 알려주는 역할
입출력의 수행
모든 입출력 명령은 특권 명령
사용자 프로그램이 I/O을 하는법
시스템 콜
사용자 프로그램이 운영체제에게 I/O 요청을 하는 거
일반적인 함수는 사용자프로그램이 자기가 할당된 메모리 내에서 주소를 바꿔가면서 실행이 되지만, I/O 요청은 사용자 프로그램 메모리를 벗어난 OS의 메모리에 요청을 보내야하기 때문에 직접적으로 점프를 하는것이 불가능
그렇기 때문에 사용자프로그램은 소프트웨어적으로, CPU에게 I/O 요청이 있음을 interrupt신호를 보냄
이 interrupt 신호를 받은 CPU은 interrupt가 왔기 때문에 mode bit을 0으로 전환 후 OS모드 실행
trap을 사용하여 인터럽트 벡터의 특정위치로 이동
제어권이 인터럽트 벡터가 가리키는 인터럽트 서비스 루틴으로 이동
올바른 I/O 요청인지 확인후 I/O 수행
I/O 완료시 제어권을 시스템콜 다음명령으로 옮김
인터럽트
인터럽트 당한시점의 레지스터와 program counter를 save 한 후 CPU의 제어를 인터럽트 처리 루틴에 넘긴다.