딩굴댕굴

운영체제의 기초 - 3. Review of Computer Hardware

by jennysgap

BOX

Computer Systems Architecture


운영체제는 하드웨어와 제일먼저 interaction하는 소프트웨어임

그래서 하드웨어 대한 기본적인 이해와 지식이 필요함

프로그래머의 관점에서 하드웨어에 대한 이해가 있어야 함



목차

- 전체적인 하드웨어 시스템 Architecture를 살펴보고

- 하드웨어 메커니즘 중이 가장 중요한 interrupt에 대해 알아보고

- OS이 정부의 역할을 한다면 그 재산이 바로 하드웨어

   하드웨어를 안전하게 운영하는 법이 중요하기 때문에

   하드웨어의 protection(보호)관점에서 interaction(사호작용)이 하드웨어와 OS간에 있는지 살펴보겠음


[컴퓨터의 기본적인 구성 요소]


컴퓨터의 가장 기본적인 구성 요소 (CPU, Memory, I/O device) - 3대 요소

이것들은 따로 있는 것이 아니고 연결이 되어있어야 함

그 하드웨어 요소들을 연결시키는 기법 그런 요소가 system bus가 됨


위 그림에서 눈여겨 볼 점은 I/O device는 자기와 bus간에 controller를 갖고 있음

controller가 CPU를 대신해서 I/O device를 권장하고 실제로 I/O Operation을 해주는 부분임

이런 것들이 system bus에 연결 됨



System bus: CPU와Memory or CPU와I/Odevice or Memory와I/Odevice 간에 데이터 전송을 담당하는 부분

System bus는 Data bus와 Address bus로 나눠짐

실제로 bus를 이용해서 데이터가 전송이 되려면 데이터의 source/destination이 지정되어야 됨

Address bus: 데이터의 source/destination을 지정하는 것. 

                      Address 정보는 Address bus라고 하는 특정한 bus line에 의해서 전달됨

Data bus: 실제 데이터는 Data bus에 의해서 전송이 됨


system bus가 있으면 bus로 할 수 있는 Operation(연산)은 크게 2가지가 있음 (Read / Write)

CPU의 관점에서 보면 Memory에서 데이터를 load하는 것이 Read

Memory로 데이터를 store하는 것이 Write



Bus Operation/transaction(처리)을 하려면 누군가 시작하는 요소가 있어야 함

Bus master: Bus transaction을 시작할 수 있는 요소 

Read/Write transaction을 시작하려면 먼저 bus를 장악해야 함

(Why? 시스템에는 bus transaction을 시작할 수 있는 bus master가 많이 존재하기 때문)

Bus Arbiter: 여러 Bus Master들이 서로 Bus를 장악하려고 할 때, 특정 Bus Master에게 Bus를 제공해주는 조정자

- Bus master한테 bus request signal을 받음 (그 중 우선순위가 높은 bus master를 선정)

- 그 bus master한테 bus grant signal을 돌려줌으로써 bus를 제공함


Q. 대표적인 Bus Master에는 어떤 하드웨어들이 있을까?

A. CPU, I/O Controller, DMA Controller 등이 있다.


대표적인 Bus Slave는 Memory가 됨.

Bus Slave는 데이터를 담고있는 장치. 메모리니까

그렇다면 I/O Controller는 데이터를 담고있는 장치일까?

정확하게 말하면 I/O Controller가 Bus slave라기 보다는 I/O Controller 안에 들어있는

Buffer memory나 Register들이 Bus slave역할이 되는 것임


여기서 주목해야 할 점! (2가지)

1. Bus slave는 데이터를 담고있는 장치다. 

2. 그리고 데이터를 여러개 담고 있으니  Address를 가지고 있어야 한다.


I/O device Controller를 자세히 살펴보겠음

어떤 경우에는 Bus master가 될 수 있고 어떤 경우에는 Bus slave 역할을 할 수 있음

I/O device Controller는 어떤 역할을 할까?

자기 Register(or Buffer) 안에 데이터가 있으면 그것을 실제 I/O device로 출력하는 역할을 함

또 다른 역할은 자기 Input register가 비어있으면 I/O device 에서 데이터를 읽어오는 일을 할 수도 있음


Interrupt-Driven I/O: I/O 동작이 완료되면 I/O Controller가 CPU에게 비동기적으로 완료되었음을 알려주는 방식

Polling I/O: I/O 동작이 완료될때까지 CPU가 반복해서 I/O Controller의 Register 상태를 확인하는 방식 

                   (여기서는 Interrupt가 개입하지 않음) 단점: I/O Operation과 CPU의 동작이 overlap 될 수 없음


메모리에 대한 공간의 주소가 필요할 뿐만 아니라

I/O Controller 안에도 여러개의 register가 있기 때문에 I/O register들에 대한 Addressing도 필요하게 됨.

이런 Address를 I/O Address라고 한다.


I/O Address를 구현하는 방법에는 2가지가 있음

1. Port-mapped I/O

   I/O Controller에 있는 register를 다른말로 port register라고도 함.

   device register들을 위해서 별도의 주소공간을 할애 해줌

   memory address space와는 별도의 port address space를 가지게 된다.

   Port-mapped I/O를 구현할 때는 Input, Output을 할 때 별도의 instruction(명령)이 필요함

   그리고 그 instruction의 타겟 주소는 register의 주소가 됨.

2. Memory-mapped I/O

    메인메모리의 주소공간 일부를 할애해서 거기에 I/O register들을 매핑하는 방법

    즉, 메모리 주소 버스 라인의 일부를 따와 그것을 통해 I/O device에 있는 register들이 select되게 만드는 방식

    이것을 사용하면 I/O Operation을 하기위해서 별도의 instruction이 필요 없음

    메모리에 load하거나 store하는 instruction을 사용하면 그대로 I/O operation을 할 수 있음



지금까지 설명했던 Interrupt-Driven I/O, Polling I/O는 Character I/O operation(data transfer의 unit이 한 byte를 의미)을 말함

가끔 block device에 I/O를 할 때는 block data를 전송할 필요가 있음. 그럴 경우 1byte씩 전송하면 너무 느려지기 때문에 만들어 진 것이 DMA operation

누가 initiation(가입) 하냐? CPU가 DMA controller에게 DMA operation initiation 하려면 몇가지 데이터와 커맨드를 제공해 줘야 함

어떤 데이터? 전송되야될 block의 메모리상의 시작점(시작주소), block의 사이즈, 그리고 read/write 커맨드를 제공해줘야 함.


DMA(Direct Memory Access)

- CPU의 개입 없이 I/O Controller가 메모리에 직접 접근하여 Data를 읽거나 쓸 수 있도록 하는 기능

- Block Data를 옮길 때 CPU Intervention(개입)을 최소한으로 줄이기 위해 사용


DMA가 Block data를 옮기는 방식은 2가지가 있음

1. Cycle Stealing: CPU가 Bus를 사용하고 있지 않을 때만 DMA Controller가 Bus를 사용하는 방식

   CPU의 성능에 영향은 미치지 않지만 DMA시간이 오래 걸림

2. Block Transfer: CPU와 DMA Controller가 대등하게 경쟁하여 Bus를 사용하는 방식


Q. Cycle Stealing  기법을 사용할 때에는 Interrupt가 필요 없는가?

A. 그렇지 않다. DMA 역시 I/O가 완료되면 Interrupt를 사용해서 I/O를 요청한 프로세스에게 CPU를 넘겨준다.


Interrupt Mechanism


하드웨어적인 메커니즘 관점에서 interrupt를 생각해 보면 비동기적인 메커니즘임

CPU가 어떤일을 하고 있을 때, 갑자기 연락이 오면 그것을 처리하기 위해서 다른일을 해야 한다는 것임


소프트웨어적인 메커니즘 관점에서 interrupt를 생각해보면 주로 현재 수행해야 하는 프로그램의 문제가 발생했을 때

그 문제를 해결해야 하는 function(기능)으로 분기하기 위해서 발생한다.

어떤 문제냐? 더이상 그 프로그램을 실행시킬 수 없는 오류가 발생한 문제

이러한 소프트웨어 인터럽트를 Trap이라고 부르기도 한다.

- 코드 분석을 통해서 어디에서 소프트웨어 인터럽트가 발생했는지 예측할 수 있다.

- 그래서 동기적 인터럽트라고 한다.



interrupt 메커니즘의 세부 operation을 알아보겠습니다.

먼저 하드웨어 interrupt가 동작하려면 마이크로프로세서에 interrupt signal을 받을 수 있는 핀이 있어야 함

그리고 그 중간에 interrupt sourcer가 있어야 함


Q. Interrupt Source가 될 수 있는 것에는 어떤 것이 있는가?

A. I/O Controller, DMA Controller 등이 있다.



Interrupt의 처리 과정

1. 현재 Instruction을 완료하고 마이크로 프로세서의 프로그램 카운터(PC) 값을 안전한 곳에 저장

2. 현재 수행 중인 프로그램을 중단

3. Interrupt Request Number(IRQ 번호)를 통해 Interrupt Source를 확인

4. Interrupt Vector Table을 검색해서 Interrupt Service Routine(ISR)의 주소를 확인하고 수행



Programmable: 소프트웨어적으로 동작을 변형할 수 있다는 의미 (즉, 동작에 영향을 미칠 수 있다는 의미)

Interrupt Mask: 특정 Interrupt Source가 발생시키는 Interrupt를 무시하거나 향후에 처리할 수 있도록 하는 기술

앞부분 내용과 연관 시킨다면 PIC안에 있는 Register들은 전부 I/O address range안에 매핑이 되어있고 다 port address들을 부여받고 있다.

그  port address를 이용해서 특정 mask register에 특정 bit를 끄거나 킬 수 있다.


CPU는 interrupt를 받으면 어떤 interrupt source가 어떤 interrup를 발생시켰는지 Interrupt request number(IRQ 번호)를 찾음

이 IRQ 번호를 어디서 얻어올까? PIC안에 있는 register에서 얻어 옴

이 여러개의 interrupt source들이 interrupt를 걸면 그 중에서 어떤 특정한 interrupt source만 선택이 됨

특정한 interrupt source가 signal를 발생시키면 그 interrupt source의 IRQ 번호를 PIC가 generation(발생)해서 자기 register에다 저장을 함

그러면 CPU는 interrupt를 받으면 I/O address bus를 통해서 그 IRQ 번호 register를 지정하고 그 값을 읽어오는 역할을 하게 됨



Hardware Protection Mechanisms


Protection(보호)에 대해 배웠음. OS의 introduction할 때 


멀티프로그래밍을 할 때 메모리 안에 Active Job이 여러개 있음

어떤 Job이 자기에게 할당된 메모리가 아니라 다른 메모리 영역을 access하게 되면 문제가 생기기 때문에 

Protection 문제를 해결하기 위해 base register와 bound register를 사용함

그리고 base register와 bound register는 job이 바뀔 때마다 OS이 정확한 값으로 셋팅을 해줘야 함

bound register를 이용한 하드웨어적 메모리 Protection에 대해서 우리가 공부했음


MMU에 있는 register들 base register나 bound register들을 access하는 것은 아무나 하면 안된다. OS만 해야 한다.

Privileged Instruction: Operation System만 수행할 수 있는 Instruction

왜 필요한지는 알겠는데 그렇다면 어떻게 구현할까?



각각에 하드웨어 unit에 대한 protection이 필요함. 그런것들을 공부하겠음

그 전에 Privileged Instruction이 어떻게 구현될 수 있는지 Dual Mode Operation을 통해서 살펴보겠음



컴퓨터의 Mode는 마이크로 프로세서 안에 들어가있는 Register가 결정함



마이크로 프로세서의 특정 상태를 나타내는 그런 Register가 있음

그것을 Processor status register라고 함

이 마이크로 프로세스 레지스터는 어떤 정보를 기억하고 있느냐? 

여러가지 상황 정보를 flag형태로 기억하고 있는데 그 중에 한 bit가 있고 그 bit를 mode bit라고 함

0: OS를 수행하는 mode (=Privileged mode, kernel mode, monitor mode)

1: 난 User 프로그램을 수행하는 mode 


Kernel Mode(Privileged mode or Monitor mode): Privileged instruction들을 수행시킬 수 있는 모드

User Mode: Privileged Instruction들을 수행시킬 수 없는 모드


그렇다면 마이크로 Architecture 안에 Privileged instruction이 어떻게 구현하면 될까?

CPU가 어떤 instruction을 수행하게 하기 위해서 instruction 패치를 했음

패치한 instruction을 디코드해야 하는데, 디코드하는 과정에서 mode bit를 체크함

만약 Privileged Instruction인데 mode bit가 1이면 안되니 이것은 Trap을 발생시켜 그 프로그램의 수행을 abort(중단)시킴

이런식으로 구현됨


이제 마이크로 프로세스의 수행모드에 대해서 알았음

커널모드와 유저모드가 있다는 사실을 알게 됐음

어떤 instruction은 커널모드에서만 수행할 수 있고 그런 instruction을 Privileged instruction 이 됨


그러므로 왜 듀얼 모드로 동작해야 하는지 알겠죠?

컴퓨터 시스템은 기본적으로 유저프로그램은 전혀 신뢰하지 않음 (이것이 기본 가정)

OS는 무조건 신뢰함 그래서 듀얼모드operation이 필요함


OS이 커널모드일 때는 뭔가 특수한 권한을 제공해 줘야 함 

Operating System이 Kernel Mode에서 수행될 때 부여받는 주요 권한

- Privileged instruction을 수행시킬 수 있는 권한

- 모든 Memory 영역에 접근할 수 있는 권한


유저프로그램은 자기에게 부여받은 공간만 Memory에 접근할 수 있음

그런 차이점이 존재함


모드가 있다는 것도 알겠다 모드가 왜 필요한지도 알겠다.

그렇다면 모드가 바뀌어야 하는데 어떻게 모드가 바뀔 수 있을까????

Mode change를 어떻게 허용해야 하는가?? 어떻게 통제할 것인가??


Mode change를 kernel mode에서 수행하고 있는 OS이 권장하게 만들면 됨

왜냐하면 OS은 무한 신뢰의 대상이기 때문

그런데 예를 들어서 User mode에서 Kernel mode로 넘어간다 이 얘기는 뭘까?

어떤 유저프로그램이 큰 권한을 받게 되는 거죠?

그것을 통제하려면 약간 모순된 상황인데 이 시스템이 Kernel mode에 있어야 함


그래서 소프트웨어적인 방법으로는 모순적인 상황을 해소할 수 없음

어떻게 하느냐 유저프로그램이 수행을 하다가

예를들어 I/O operation이 필요하다 I/O register를 접근해야 한다면

대부분의 I/O register 접근은 Privileged instruction임.

그럼 Kernel Privileged가 필요하다 = 하드웨어적 메커니즘이 필요하다는 의미임


그 메커니즘이 바로 interrupt 메커니즘

내가 Kernel Privileged가 필요하면 interrupt instruction을 수행시키는 것임

하드웨어적으로 무조건 mode bit를 1에서 0으로 바꿔줌. (무조건 커널모드로 change를 수행시킴)


interrupt instruction은 소프트웨어 interrupt지만 그것도 interrupt니까

interrupt handler(조력자)가 떠야 함

그 handler가 바로 이 user의 권한을 바꿔주는 그런 잘 정의된 역할을 하는 함수가 되는 것임


mode change는 하드웨어적인 메커니즘을 통해서 일어난다.

그래서 그 메커니즘은 interrupt다 

다시 얘기해서 interrupt가 발생하면 무조건 모드가 kernel mode가 된다.

그리고 커널모드로 바뀌는 순간 그 mode change를 관할 할 수 있는 interrupt service routine이 시스템을 장악한다


그렇기 때문에 유저가 mode change를 요청했지만 

굉장히 잘 정의된 통제된 환경에서 통제된 방식으로 시스템이 여전히 관리되고 있다.



mode change를 관할하는 것은 interrupt service routine 라고 말했는데

interrupt라는 것은 굉장히 낮은 수준의 프로그래밍 인터페이스임 (특정 명령을 수행해야하기 때문)

그런데 프로그램을 작성하다 보면 수준이 높은 함수호출을 하기때문에 

그런 체계화된 privileged 한 변환을 얻을 수 있도록 system Call 기능을 OS가 지원함

이것은 프로세스를 공부할 때 자세히 공부하고 여기서는 넘어 가겠음


이와같이 듀얼모드를 통해서 I/O protection도 해야하고 메모리도 protection해야하고 CPU도 protection해야 함

각각에 대해서 보도록 하겠음


I/O protection이 왜 필요하냐?

I/O device나 메모리를 다른 말로 resource(자원)이라는 말을 많이 씀. 자원이 있으면 서로 가지려고 하기 때문에

어떤 job이 자원을 독점하면 시스템을 효율적으로 사용하지 못하기 때문에 이것을 막기위해서다


I/O protection하는 방법

I/O register 들 Port register 을 접근하는 것을 모두 Privileged instruction으로 만들면 됨

I/O 내부에 관한 함수는 모드 커널내부로 들어가야 한다는 의미임

우리가 OS의 5가지 서브시스템이 있다고 했는데 I/O system이 왜 서브시스템에 포함되는지를 잘 설명하는 내용임


Memory protection 한다는 것은 MMU register들을 통제하는 것임

주로 메모리가 다른 job에 의해서 call up 되지 않게 막는 것임


CPU도 I/O나 memory처럼 자원임

왜냐하면 어떤 프로그램이 수행하려면 반듯이 CPU가 필요하기 때문 

이때 뭐가 문제가 되느냐? monopolize(독점)하는 것이 문제가 됨

그래서 어떤 한 job이 CPU를 monopolize하지 않게 하려면

그 job 에게 허용한 만큼의 시간을 time으로 셋팅해 두는 것

타이머가 다 종료하게 되면 interrupt가 발생하여 mode change가 발생하여 

OS이 제어권을 확보하게 되고 그 프로그램은 더 이상 CPU를 monopolize하지 못하게 빼놓을 수 있게됨


CPU protection의 중요한 entity는 timer interrupt가 됨

그래서 counter register와 같은 것들을 access하는 것도 Privileged instruction이 되는 것임





출처 - http://snui.snu.ac.kr/ocw/index.php?mode=view&id=630

출처 - http://snui.snu.ac.kr/ocw/index.php?mode=view&id=632

출처 - http://snui.snu.ac.kr/ocw/index.php?mode=view&id=633

반응형

블로그의 정보

jennysgap

jennysgap

활동하기