운영체제에 대한 하드웨어 동작 프로그램 하드웨어 위에서 어떻게 돌아가는지 (하드웨어적 동작)
Interrupt Line
CPU안에 interrupt line이라는게 붙어 있는데 인스트럭션 하나가 실행되고 나면 다음 실행할 인스트럭션 주소값이 증가하고(PC or IP값 증가) interrupt line에서 interrupt가 들어온게 있는지 확인한다. (I/O device들의 작업이 끝난걸 알기위해서 혹은 SIGNAL)
다음 사이클에서는 다음인스트럭션을 수행하는 역활 만한다.
IP(instruction pointer) == PC(program counter)
프로그램 카운터는 마이크로프로세서 내부에 있는 레지스터 중의 하나로서, 다음에 실행될 명령어의 주소를 가지고 있어 실행할 인스트럭션의 위치를 지정한다. 때문에 명령어 포인터라고도 한다. 인텔의 x86계열의 CPU에서는 IP라고 한다.
Timer
처음에는 컴퓨터를 켰을 때 운영체제가 CPU를 가지고 있다가 사용자 프로그램이 실행되면 그 프로그램한테 (mode bit == 1) 사용자 모드로 설정하고 타이머에다가 1초보다 작은(수십 ms정도) 셋팅하고 CPU 넘겨줌 이는 사용자 프로그램이 독점적으로 사용하지 못하게 하기위해서 이다.
셋팅된 시간이 되면 타이머가 CPU한테 인터럽트를 보낸다(시간끝났어!!라고) 그러면 계속해서 CPU가 clock 에맞춰서 instruction을 수행하다가 하나의 instruction 끝나면 interrupt line을 체크하는데 interrupt 들어온게 있으면 cpu는 하던일을 잠시 멈추고 CPU제어권이 사용자 프로그램으로 부터 자동으로 운영체제로 넘어가게 되어있다. (mode bit == 0 커널모드)
타이머가 있는 이유
- 운영체제가 사용자가 CPU한테 줄때는 자유롭게 주지만 한번 넘어가면 뺏을 수 없음 그이유는 OS도 뺏으려면 본인이 CPU를 가지고 있으면서 뭔가 인스트럭션을 실행을 해야 제어권을 뺏을 수 있을텐데 CPU가 사용자 프로그램에서 인스트럭션 수행하면서 돌고 있기 때문이다.
- 무한루프 도는 프로그램으로 CPU가 한번 들어가면 다른 프로그램으로 넘어가지 못해서 time sharing(시분할)을 구현할 수 없다. 그래서 컴퓨터 안에는 timer라는 하드웨어를 두고 있다. timer에 하드웨어 역활은 특정 프로그램이 cpu를 독점하는것을 막기위한것이다.
Device Controller
각각의 I/O 디바이스 들은 그 디바이스를 전담하는 작은 CPU인 device controller가 존재한다. CPU와 I/O device 들은 속도차이가 많이나기 때문에 사용한다. (디스크는 CPU에 100만배 정도 느리다) + (하드디스크를 보조기억장치라고 하지만 IO장치라고도 할 수 있다.)
Device Controller하는 일은?
- Disk 에서 헤드가 어떻게 움직이고 어떤데이터를 읽을지 디스크에 내부를 통제하는 것은 CPU에 역활이 아니고 Disk에 붙어있는 disk에 controller가 작업을 한다.
- CPU가 메모리에서 인스트럭션을 계속 수행하다가 프로그램 A가 디스크에서 뭘 읽어와야되면 CPU에서 디스크를 직접 접근하는게 아니라 Disk Controller가 특정데이터를 어딘가에서 읽어오라고 일을 시킨다. (일을 시키는 인스트럭션을 수행해서)
- 그러면 디스크는 디바이스 컨트롤러한테 지시를 받아서 읽어오게 되고 자신의 local buffer에다가 요청한 데이터를 넣으면 device controller에서 cpu에 알리기 위해 인터럽트를 발생시킬 것이다.
- device controller에서 오래걸리는 I/O작업을 해주기 때문에 cpu는 놀지않고 메모리 인스트럭션 수행할 수 있다. 만약 사용자에 입력이 있어야지만 수행할 수 있는 코드를 만날경우 cpu가 다른 프로그램으로 넘어가게 된다. 여러가지 프로그램을 빠르게 돌릴 수 있는 이유
정리
- 사용자 프로그램이 I/O에서 입출력을 해야 된다면 자진해서 cpu를 운영체제한테 넘겨주게 되어있다. (사용자 프로그램은 본인이 직접 I/O장치로 접근할 수없다. (System call을 통해서 I/O 작업을 할 것이다.) 보안에 이유로 모두 운영체제를 통해서만 접근할 수 있도록 막아놨기 때문에 Trap을 통해서 mode bit을 커널모드로 변경하고 운영체제가 해당하는 작업을 I/O 컨트롤러한테 시키게 된다.
- 시키고 나서 작업들이 오래걸리니까 속도가 빠른 CPU가 놀지않게 I/O작업 요청한 프로그램한테 CPU를 넘기는 것이 아니라 다른 프로그램한테 CPU를 넘겨주게 된다.
- I/O컨트롤러가 요청한 작업이 끝나서 자신의 버퍼에 저장하면 각각의 I/O device 컨트롤러가 CPU 한테 인터럽트를 걸게된다. 그렇게되면 인스트럭션을 수행하고 interrupt line을 체크하는 타이밍에 인터럽트를 확인하고 CPU 제어권을 운영체제한테 주게된다. (mode bit == 0)
- 그러면 운영체제가 무슨 인터럽트인지 확인하고 예를들어 그전에 들어온 키보드 입력에 요청이 들어온경우 요청한 키보드 값을 그 프로그램에 메모리 공간에 복사해주고 키보드값이 자신의 메모리 공간에 복사된 사용자 프로그램은 언젠가 계속해서 사용자 프로그램이 왔다갔다 돌다가 키보드입력이 들어와서 준비된 사용자 프로그램 한테 CPU를 주게된다
I/O작업은 오래걸리기 때문에 다른 사용자 프로그램으로 CPU를 제어하고 있을텐데 인터럽트가 발생해서 제어권이 운영체제로 넘어갔다면 보통은 그 프로그램한테 다시 CPU 제어권을 주게된다. 아직 타이머 시간이 남았다면 그시간동안 계속 인스트럭션 수행하다가 타이머 끝나면 아까처럼 운영체제한테 CPU를주면서 시분할 되는방식 그러면 키보드값이 복사된 사용자 프로그램은 언젠가 계속해서 사용자 프로그램이 왔다갔다 돌다가 키보드입력이 들어와서 준비된 사용자 프로그램 한테 cpu를 주게된다.(인터럽트가 들어온 사용자 프로그램으로 CPU 제어권을 바로 주는건 아니다.
추가 정리
- 데이터를 담은 local buffer는 메모리 쪽으로 정보를 넘겨주거나 출력일경우 메모리에 정보를 local buffer에 가져와서 화면에 출력한다거나 혹은 file들의 정보를 담는건 local buffer에다가 저장하는것이고 출력을 하라는 지시는 제어 레지스터를 통해서 한다.
- 키보드 프린트 등등 각각의 device controller 처리함
- local buffer→ device controller들의 작업 공간
Device Driver
- 소프트웨어를 말하는데 운영체제에 있는 코드중에서 각 디바이스를 처리하기 위해서 디바이스 인터페이스가 있는데 거기에 맞게 이것을 접근할 수 있게하는 소프트웨어 모듈
- 예를들어 I/O장치중에 마우스를 붙이면 마우스를 접근하기 위한 device driver를 설치를 해야된다.
- device driver도 운영체제 제일 아래단 까지가서? 하드웨어를 접근하게 되면 디바이스 드라이버단을 접근할 수 있게 된다.
- device driver가 예를들어 디스크에서 실제로 헤드를 움직여서 디스크를 읽고쓰는 코드는 아니다 그 코드는 device controller가 보고 지시를 받아서 일을 수행한다.
- device driver도 뭔가 본인이 일을 하기위해서는 메뉴얼이 있는데 그것을 device driver라고 하는게 아니라 디스크안에 펌웨어 라고해서 디스크를 동작하기 위해서는 무슨일을 해야되는지 디스크가 실행되는 인스트럭션은 따로있다. device driver는 cpu가 실행하는 디스크 장치를 수행하기 위해서 필요한 코드를 담고있다.
mode bit
CPU에서 실행되는게 운영체제인지 사용자 프로그램 인지 구분하기 위해서 CPU안에 modebit이 존재한다.
사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호 장치
mode bit | 모드 | 내용 |
0 | 커널 모드 | OS 코드 수행 |
1 | 사용자 모드 | 사용자 프로그램 수행 |
- mode bit 이 0인 커널모드 일때 cpu에서 운영체제가 실행중일 때는 메모리접근 부터 I/O device접근 인스트럭션까지 mode bit이 0일때는 실행할 수 있게 되어있다.
- 사용자 모드일때는 보안상에 목적으로 자기 프로그램에 메모리 공간만 사이 가능하다. 그렇기 때문에 바뀔 때 mode bit 바꾸고 넘겨야됨 만약 mode bit이 1인데 다른 사용자 프로그램, 커널 메모리, I/O device로 접근하면 수행할 때 mode bit을 확인하는데 하드웨어적으로 수행이 안되게 구성되어있다.
운영체제가 사용자 프로그램한테 cpu제어권을 넘길 때 mode bit 1로 바꿔서 넘겨주기 때문에 한정된 인스트럭션만 수행 인터럽트가 발생되면 cpu제어권이 운영체제로 넘어가면서 mode bit도 자동으로 0으로 바뀐다.
DMA(Direct Memory Access)
- 빠른 cpu장치가 I/O 장치가 많아져 인터럽트가 많이 들어오는 것을 효율적으로 처리하기 위한 Controller
CPU만 메모리접근하면 편할텐데 DMA를 넣은 이유
- I/O 장치가 많아질 수록 인터럽트를 너무 자주 걸어서 cpu의 방해를 막기위해서 중간중간에 I/O작업이 끝나고 local buffer에 저장된 후 device controller가 인터럽트 걸어서 local buffer에 저장된 데이터를 CPU가 메모리에다가 copy 하는것은 너무 오버헤드가 크다.
CPU가 인터럽트 당하는 빈도가 줄어들어서 좀 더 효율적으로 처리
- CPU는 자기일을 하고 있고 local buffer에 저장되어 있는걸 DMA가 직접 메모리를 복사하는 일까지 하고 그 과정까지 끝나면 DMA controller가 cpu한테 인터럽트를 걸어서 메모리에 다 올라왔다고 보고를 해준다.
메모리를 접근할 수 있는 장치 원래는 메모리 접근할 수 있는 장치는 cpu만 이다. local buffer에 보통 block 이나 page라고 말하는데 특정 사이즈의 데이터가 쌓이게 되면 DMA가 memory에다가 local buffer에 데이터를 카피하고 인터럽트 걸어준다.
1byte 키보드 입력 받아놓고 인터럽트 걸면 cpu가 낭비되기 때문에 block, page 특정 사이즈 만큼 local buffer에 쌓이면 데이터 처리하기
Memory controller
직접 메모리를 접근할 수 있는 컨트롤러 원래 메모리는 cpu만 접근할 수 있었는데 DMA를 둬서 DMA도 접근할 수 있도록 한다. 둘이서 특정 메모리 영역을 동시에 접근하게 되면 문제가 발생할 수 있다. (Memory controller는 이런것을 중재하는 역활을 한다. (교통정리))