본문 바로가기

전체 글

[OS만들기] day18: protection 콜게이트 낮은 특권 레벨의 프로그램이 실행 도중 높은 특권 레벨로 변경되는 수단은 대표적으로 인터럽트, 예외, 콜게이트가 있습니다. 이 중 하드웨어 인터럽트와 예외에서는 낮은 특권 레벨 프로그램이 자신의 의지와는 상관없이 특권 레벨의 변경이 이루어지고, 소프트웨어 인터럽트와 콜게이트는 낮은 특권 레벨의 프로그램이 자신의 의지에 의해 높은 특권 레벨의 루틴을 잠깐 사용하는 것입니다. 우리가 호적등본을 발급받으려 할 때 동사무소에 갑니다. 간단한 신청서를 작성하여 창구에 제출하면 동사무소 직원은 귀중한 서류들이 있는 곳으로 다녀와서 서류를 복사하고, 도장을 찍어 우리에게 건네줍니다. 우리는 정부기관에 접근할 때에는 항상 각각의 창구를 이용합니다. 동사무소는 정부기관 루틴의 일부이며, 거기에 있는 서류들은 귀.. 더보기
[OS만들기] day17: protection day 17: 보호(2) Protected Mode로 넘어온 후에는 CPU는 각 명령어마다 아래와 같은 체크를 하고, 합당한 명령만 실행시키고, 합당하지 않다면 폴트를 발생시켜 커널이나 유저 프로그램이 자신이 이 에러를 다시 조정하도록 합니다. Limit 체크 Type 체크 특권 레벨 체크 명령 세트 체크 CPU의 체크 포인트 Limit 체크 세그먼트 디스크립터의 Limit은 프로그램 또는 프로세스가 세그먼트 외의 메모리 위치를 오프셋으로 지정하지 못하게 합니다. 세그먼트 디스크립터 내의 G 비트가 0일 때에는 Limit을 0~0xFFFFF(1MB)까지 선택할 수 있습니다. 이 의미는 세그먼트 영역의 크기를 0으로 지정해도 되고, 0xFFFFF로 지정해도 된다는 뜻입니다. 세그먼트 영역에서 유효 Limi.. 더보기
[OS만들기] day 16: CALL 명령에 의한 Task Switching 오늘의 결과 jmp를 사용한 task switching인 day 12에서의 결과와 같습니다. jmp 명령에 의한 Task Switching과 다른 점은, 컨텍스트 스위칭을 할 때 JMP 명령 => CALL 명령 task를 처리하는 루틴에서 JMP 명령으로 컨텍스트 스위칭 => IRET 이 두 가지입니다(단 두 줄). 소스코드 kernel.asm ; src\kernel.asm %include "src/init.inc" [org 0x010000] [bits 16] start: cld ; Advance = inc mov ax, cs mov ds, ax xor ax, ax mov ss, ax xor ebx, ebx lea eax, [tss1] ; EAX에 tss1의 물리 주소를 넣습니다. add eax, 0x1.. 더보기
[OS만들기] day15: Task Switching (4) day 13의 코드를 계속 파악하고 있습니다. 지금 이해한 흐름은 jmp TSS2Selector:0 위의 구문으로 task switching을 한다는 것입니다. TSS2Selector라는 것은 src\init.inc 에 정의된 값인데 0x28로 정의되어 있습니다. 즉, GDT의 offset 기준으로 0x28만큼 떨어진 곳에 존재하는 GDT Descriptor라는 의미입니다. GDT + 0x28의 주소에는 descriptor5라는 것을 저장해 놓았고, (초기에는 0으로 값을 주고, 프로그램 실행 시에 tss2의 주소를 BASE_ADDRESS로 넘겨 줍니다.) segment limit의 값으로는 0x68(10진수 104)이 저장되어 있습니다. TSS Descriptor의 사이즈가 0x68이기 때문에 이 값이.. 더보기
[OS만들기] day14: Task Switching (3) TSS 세그먼트 디스크립터 TSS 디스크립터도 GDT에 들어갑니다. TSS 세그먼트 디스크립터에 포함된 Type 필드 TSS 디스크립터의 Type field에서는 1과 0으로 고정된 부분과 B 비트가 있습니다. B비트는 현재 현재 이 태스크가 실행 중 혹은 실행을 기다리고 있는 중이라는 표시입니다. CPU는 이 비트를 사용하여 실행 중 인터럽트가 걸린 태스크를 다시 CALL 했는지 아닌지를 검사합니다. 처음에는 0으로 클리어 해두면 됩니다. 소스코드의 descriptor4 부분에서 0x89를 대입해 보면 P 비트가 1, DPL이 00, 고정된 0, Type이 1001이라는 것을 알 수 있습니다. 태스크 스위칭은 항상 커널 레벨에서 이루어지도록 하는 것이 보통이므로 DPL은 00으로 해둡니다. LTR 명령.. 더보기
[OS만들기] day 13: Task Switching과 TSS Intel 80286 이상의 CPU에서는 Protected Mode에서의 Task switching을 CPU레벨에서 지원해 줍니다. 우리는 먼저 CPU가 지원해 주는 기능을 사용한 태스크 스위칭 방식에 대해 배우고, 이후 현재 OS 커널들이 구현한 방식에 따라 CPU가 지원하는 방식을 사용하지 않고 태스크 스위칭을 하는 방법을 알아보겠습니다. 선점형 task switching 방식 프로그램이 수행되는 동안 어떤 상황에 있든지 관계없이 그 프로그램을 일단 정지시키고, 다른 프로그램이 이전에 실행했던 곳부터 다시 실행되도록 하는 방식입니다. 이러한 구현을 위해서는 CPU에서 수행되는 프로그램의 모든 레지스터 값을 일단 보존 시키고, 이전에 수행되었다 저장되었던 프로그램의 모든 레지스터 값들을 CPU에 옮겨놓.. 더보기
[OS만들기] day12: task switching 오늘의 결과물 오늘 학습 내용 task switching 방법에는 call으로 스위칭 하는 방법, jmp로 스위칭 하는 방법 두 가지가 있습니다. 오늘은 코드를 따라 치면서, 감을 익혔고, 다음 시간에 원리를 이해하도록 하겠습니다. 새로 배운 nasm assembly LTR: Load Task Register 피연산자로 주어지는 segment selector에 의해 선택된 GDT 또는 LDT descriptor의 세그먼트의 base와 limit을 참조합니다. 그리고 그것들을 task register로 가져 옵니다. LTR r/m16 ; 0F 00 /3 [286,PRIV] 오늘까지의 진도 p. 165 더보기
[OS만들기] day11: 키보드 인터럽트 핸들러, exception 오늘의 결과물 keyboard 인터럽트 핸들러 - 아무 키나 누르면 키보드 인터럽트 라는 문구가 뜸(key down, key up 두 가지 경우에 다 인터럽트 걸림) 예외(Exception) zero divide Exception의 ISR(Interrupt Service Routine) 실행 중에는 다른 interrupt가 걸리지 않았습니다. 키보드 인터럽트 핸들러 코드 kernel.asm ; src\kernel.asm % include "init.inc" [org 0x010000] [bits 32] PM_Start: mov bx, SysDataSelector mov ds, bx mov es, bx mov fs, bx mov gs, bx mov ss, bx lea esp, [PM_Start] mov ed.. 더보기