It is just my opinion, so don't you attack me. please!
But if this posting has some incorrect informations, you comment about that
Please!!
2. 컴퓨터와 OS 연계
- device driver & controller
포스팅하기에 앞서 device driver에 대한 설명이 필요할 것 같습니다.
· 표준 API - device driver는 커널의 일부분으로 동작하는 프로그램이므로 무언가 응용 프로그램이 동작하기 위해서는 명령어가 같아야겠죠? 대표적으로 많이 실행하는 Open, Close, Read, Write, Seek등의 함수들이 있습니다. 이 명령어를 일치시키기 위한 표준 ! 그것이 표준 API인 것입니다. 즉 응용프로그램과 커널에 있는 device driver와의 interface역할을 하는 것이죠.
· H/W interface - 응용프로그램으로 부터 API를 통해 명령을 전달받은 device driver는 H/W interface를 통해 하드웨어가 알아들을 수 있는 명령을 번역하여 controller에 전달을 하게 됩니다.
- Register 접근 방식
· 격리형: 제어기 레지스터 접근을 위한 특수한 입출력 명령 사용
장치 주소를 변수로 하는 입출력 명령(주변 장치를 위하여 별도주소공간필요)
상태 점검: CPU 레지스터와 제어기의 상태 레지스터 사이에 상태정보 전이
· 메모리 사상형: 메모리 상의 주소공간을 레지스터와 직접 매핑, 모든 입출력에 관한 명령은 해당 메모리에 대한 LOAD명령과 STORE명령으로 수행한다.또한 기존의 명령을 사용, 명령 개수를 줄이고 사용하는 것이 장점이다. - 자료 이동 방식
· 직접 방식: CPU가 모든 I/O에 관여함.
· DMA: CPU 도움 없이 독자적으로 메모리에 접근하여 Interrupt 없이 많은 많은 자료를 전송, 또한 한번의 실행으로 여러 입출력을 할 수 있기 때문에 병렬성이 있다.
Process에서 Input command를 내리면 구동기가 제어기의 명령 레지스터에 명령어를 적재하고, 장치를 가동시킨다. 이후 제어기의 상태가 busy에서 done으로 바뀔 때까지 대기한다. done 상태가 되면 제어기의 자료 레지스터에 있는 값을 Process의 공간으로 복제한다.
항상 polling의 문제는 기다리면서 상태를 체크해야한다는 것이다. 이것은 CPU의 낭비를 초래한다.
Interrupt에 우선순위를 가해 순서를 제어한다. (마스크를 이용, 낮은 우선순위는 일시 정지)
인터럽트 발생 → ISR 수행 중지 → PC 및 레지스터 값 보존(PCB에 context가존재한다.) → 현재의 인터럽트에 해당하는 마스크를 설정하여 하위 인터럽트 발생 억제 → ISR로 제어 넘김(PC를 해당 ISR의 첫 주소로 셋팅) → Interrupt 처리 → 인터럽트 처리가 끝나면 원래 프로세스 또는 수행중이던 하위 ISR을 계속 실행키기 위해 보존된 레지스터 내용복구(OS의 결정이 필요)
* IDT에 장치번호 순서대로 ISR의 번지가 기록되어있음(table address + 장치번호로 간접분기)
- System call 루틴
· 위의 그림에 대략적인 루틴을 다 적어놨기 때문에 그림에 대한 설명은 안하는 것이 좋을 것 같습니다.
· 여기서 가장 중요한 포인트는 5번인데요, Interrupt가 일어날 때, CPU가 다른 프로그램에 할당되어 있다가 I/O interrupt를 처리하기 위해 I/O process에 할당을 되게 됩니다.
시스템 보호의 필요성
· 만약 커널영역과 유저영역의 구분이 없다면 어떻게 될까요? 만약 저도 모르는 사이에 악의적인 프로그램이 설치되어 실행된다면, 시스템이 엉망이 될 수도 있겠죠. 이런 경우를 막기위해 시스템을 보호할 필요성이 있게 되었습니다.
· 하드웨어(불법 I/O)에 대한 보호: 보호를 위해 CPU의 모드 비트, 즉 User mode, Kernel mode 이 두가지 모드가 생기게 되었습니다. 이에따라 User Application에서 System call 같은 OS 코드영역의 명령어가 실행되는 경우 Kernel mode의 특권이 필요하게 됩니다. 특권이 없는 User Application의 경우는 오작동을 일으키겠지만, 이 것이 시스템의 안정성을 위해 좋다는 것입니다.
· 메모리 보호: Base, Limit 레지스터를 두어 메모리의 접근 범위를 지정하는 방법입니다.
· CPU 보호(무한 루프): 타이머 또는 클럭으로 고정된 빈도로 인터럽트를 발생시켜서 무한루프를 방지 시킵니다.용어 정리
· 부트스트래핑(부팅을 하는 방식): ROM에 약간의 코드, MBR은 디스크의 0번 섹터에 존재 이 롬로더가 DMA를 실행 Bootstrap-Roader의 첫 번째 블록을 적재 → 이 첫 번째 블록으로 점프하고 MBR은 역할을 끝냄 → 첫 번째 블록이 수행되면서 부트스트랩 로더의 나머지 부분 적재 → 자신은 메모리의 상위 장소로 옮긴 후 kernel을 하위 기억 장소에 적재
· 캐시(메모리와 CPU 사이의 속도 완충): cache안에는 레지스터로 구성됨. 메인메모리가 느리기 때문에 캐시를 사용한다. 알고리즘에 따라 캐시에서 데이터를 갖고 있을 확률은 90%이상 개선이 가능하다.
· Kernel(OS의 핵심 부분): 주로 자원 관리 및 자원 사용에관한 서비스, 시스템 호출 형태로 제공
· 시스템 호출 POSIX : 프로세스 제어, 파일 조작, 주변장치 조작, 정보관리, 통신
· Asynchronous & synchronous for I/O: 비동기의 경우 I/O를 시작하고 바로 계속 프로세스를 실행하고 종료를 알리는 callback함수가 존재하여 이벤트 발생시 알려준다. 동기의 경우 I/O를 시작한 후, sleep 상태에 빠지고 CPU 할당을 해제 당한다.
· Slow Interrupt를 위한. top-half & bottom-half: H/W interrupt는 비동기적이므로 여러 개가 동시에 Interrupt를 보낼 수 있다. 따라서 이과정중 급한 Interrupt와 그렇지 않은 Interrupt를 구분하여 급한 부분을 먼저 처리하고 그렇지 않은 부분을 나중에 처리하는 방식이다. top-half의 시간이 길면 무시되는 Interrupt가 많아지기 때문에 top-half는 되도록 짧게 설정해야한다.
· 모노리틱 커널: 커널이 하는 모든 기능을 내부에 포함. 계층 구조를 따름, 장점: 이식에 유연하고 용의 함, 또한 시스템 호출 서비스가 빠름, 단점: 인터럽트 처리기가 커널 내부에 있어서 커널 전체가 recompiling되어야 함.
· 마이크로 커널: 시스템 호출, 인터럽트 처리에 필요한 것만 가지고 있음. 나머지는 사용자 프로세스로 존재 인터럽트로 처리를 함. 잠점: 유연성이 좋고 소형의 내장형 시스템에 활용하기 유리, 우선 순위에 따른 실사건 프로세스의 수행 기회가 많아진다. 단점: 파일 서비스 등에서 프로세스가 메시지가 빈번해져 속도가 하락.