
운영체제를 설명하기에 앞서, 하드웨어적인 것을 설명

CPU와 메모리로 구성된 컴퓨터와 그 외 I/O Device로 구성
컨트롤러들이 각 디바이스에 붙어있어서 작은 CPU 역할을 함
이 역할을 하는데 필요한 작은공간 → local buffer라고 함
CPU는 메모리로부터 하나의 instruction 가져와 실행시키는 역할(program counter 주소에서 가져와 명령 실행)
register: CPU 안에 메모리보다 더 빠르면서 정보를 저장할 수 있는 작은 공간
mode bit: 사용자의 프로그램인지 OS인지 구별하는 역할
Interrupt line: CPU는 항상 메모리에 있는 instruction을 실행시키는데, 키보드나 디스크와 같이 I/O Device에서 어떤 요청이 들어왔을 때, 이를 인터럽트 라인에 세팅하고 마이크로 프로세서에게 알려 처리하도록 함
timer: 사용자 프로그램중 무한루프틑 도는 것과 같은 프로그램이 있을 때, 타이머를 이용하여 CPU를 선점할 수 있는 시간을 설정하여 이를 방지함. (추가적인 하드웨어, Time sharing을 위한 것)
프로그램에서 키보드 입력 요구(트랩이라는 소프트웨어 인터럽트를 발생시켜 시스템 콜을 함)을 이용하여 인터럽트 벡터가 가리키는 서비스 루틴실행
⬇️
I/O Controller가 요청한 작업이 끝남(키보드를 두드려서 입력한 데이터가 버퍼에 들어옴)
⬇️
키보드 컨트롤러가 CPU에 인터럽트(하드웨어 인터럽트)를 검
⬇️
인터럽트가 들어오면 CPU 제어권이 프로그램에서 OS로 넘어감
⬇️
운영체제가 인터럽트가 왜 들어왔는지 살펴보고, 입력된 키보드 값을 요청한 프로그램의 메모리공간에 카피
⬇️
방금까지 CPU를 점유하고 있던 프로그램에게 다시 제어권 양도(timer값이 남아 있다면)
디스크를 읽는 과정도 동일함(디스크 컨트롤러가 다 읽으면 인터럽트걸고 순차적으로 진행)
사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호장치
즉, 현재 권한이 커널모드냐, 사용자 모드냐에 따라 자원에 접근할 수 있는 권한을 부여
Mode bit을 통해 하드웨어적으로 두 가지 모드의 operation 지원
1 사용자 모드: 사용자 프로그램 수행
0 모니터 모드: OS 코드 수행
Interrupt나 Exception 발생 시 하드웨어가 mode bit을 0으로 바꿈모니터모드: 커널모드, 시스템 모드

이 타이머는 time sharing을 구현하기 위해 널리 이용된다. 또한 현재 시간을 계산하기 위해서도 사용된다.
I/O device controller
control register, status register를 가짐local buffer를 가짐(일종의 data register)I/O는 실제 device와 local buffer 사이에서 일어나고, Device controller는 I/O가 끝났을 경우 interrupt로 CPU에 그 사실을 알림
device driver(장치 구동기): OS 코드 중 각 장치별 처리루틴 → software
device controller(장치 제어기): 각 장치를 통제하는 일종의 작은 cpu → hardware
CPU에 인터럽트가 많이 걸리면 효율적으로 동작할 수 없음. 그래서 DMA(Direct Memory Access) controller가 생김
원칙적으로 메모리에 CPU만 접근할 수 있지만, DMA를 두게 되면 CPU도 접근할 수 있고 DMA도 접근 가능.
둘이 접근하는 것을 중재하는 역할을 memory controller가 제어
DMA 컨트롤러의 역할은 I/O Device의 인터럽트가 발생했을 때, 로컬 버퍼에 있는 내용을 메모리에 복사하여(메모리에 block 단위로 직접 전송) 그 작업이 다끝나면 CPU에 인터럽트 한번만 걸어서 보고를 함.
모든 입출력 명령은 특권 명령이다.
사용자 프로그램은 그럼 어떻게 I/O를 하는가?
인터럽트
Interrupt (넓은 의미)
인터럽트 관련 용어
→ 인터럽트의 종류가 여러개 있고, 각각 해야할 일이 다르기 때문에 각 인터럽트가 처리해야할 일을 인터럽트 처리 루틴에 담아둠
어디에 있는 함수들을 실행해야 하는지? → 인터럽트 벡터에 명시해둠
현대의 운영체제는 인터럽트에 의해 구동됨
동기식 입출력 (synchronous I/O)
비동기식 입출력 (asynchronous I/O)

두 경우 모두 I/O의 완료는 인터럽트로 알려줌
special instruction에 의해Memory Mapped I/O에 의해
좌측에 있는 그림은 메모리 접근하는 instruction따로, I/O를 위한 special instruction을 위한 것 따로를 구분해놓은것
우측에 있는 그림은 I/O 장치도 메모리의 연산주소를 붙여서 같이 접근(ex: 100번대 메모리 주소, 1000번대 I/O 주소) → 이를 memory Mapped I/O라고 부름

위 3가지는 바이트 단위로 접근이 가능하기 때문에 CPU가 실행시킬 수 있음. 세컨더리 부분은 섹터 단위로 접근

프로그램은 파일형태로 파일시스템에 존재
프로그램을 실행시키게 되면 가상메모리를 거쳐 물리적인 메모리로 올라감(메모리 주소 변환이라는 하드웨어 계층을 통해)
어떤 프로그램을 실행시키게 되면 주소공간 형성 → 프로세스 A의 Address space (stack, data, code)
이를 물리적인 메모리에 올려서 사용하는데, 다 올리면 메모리가 부족하기 때문에 당장 필요한 부분만 올려서 사용
스왑 공간이라는 disk에 나머지 저장하고, 전원이 나가면 안에 있는 데이터가 의미없어짐(파일 시스템은 영구 보존의 목적!)

code: 커널 자체의 코드
data: 하드웨어 관리를 위한 자료구조, PCB(현재 실행중인 프로그램을 관리하기 위한 자료구조)
stack: 운영체제도 함수 구조로 짜여있기 때문에 stack을 이용
함수(function)
사용자 정의, 라이브러리 함수는 프로세스의 주소 공간에 있고, 커널 함수는 커널 주소 공간에 있음
커널 함수를 실행하려면 system call을 통해 실행시켜야 함!

프로세스 A의 관점에서 본 프로그램 실행 과정