basic 썸네일형 리스트형 [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.. 더보기 [OS만들기] day 10: PIC - 타이머 인터럽트 핸들러 kernel.asm mov edi, 8*0x20 lea esi, [idt_timer] mov cx, 8 rep movsb 타이머는 IRQ 0번입니다. 그러나 부트스트랩 프로그램에서 PIC를 리매핑했기 때문에 타이머 인터럽트가 발생했을 때 PIC는 CPU에게 0x20번의 인터럽트가 발생했다고 알려줄 것입니다. 그래서 IDT에 있는 디스크립터 중 0x20번째에 만들어 놓은 디스크립터를 복사해서 설정해 놓습니다. idt_timer 디스크립터 lidt[idtr] mov al, 0xFE ; 막아두었던 인터럽트 중 out 0x21,al ; 타이머만 다시 유효하게 합니다. sti jmp $ sti 명령어를 꼭 해줘야, CPU가 PIC로부터 인터럽트를 받아들이고, /INTA 신호를 되돌려줄 수 있습니다. cli 명령으.. 더보기 [OS 만들기] day9: PIC - 설명(2) day 09: PIC(Programmable Interrupt Controller)의 설명(2) day 08의 소스코드를 기준으로 설명합니다. 변경 또는 새로 추가된 코드 reset floppy disk ; src/boot.asm ... reset: ; 플로피 디스크를 리셋(controller에서 reset flag를 clear로 세팅하고, 헤드를 track 0로 가져 가는 것) mov ax, 0 mov dl, 0 ; drive=0 A: int 13h jc reset ; 에러가 나면 다시 합니다. 트랙이란...? cylinder => track => sector 순으로 차원이 작아짐 그림 출처: https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&.. 더보기 [OS만들기] day8: PIC - 설명(1) PIC(Programmable Interrupt Controller)의 초기화 - 설명(1) 오늘의 결과물 설명 INTEL i/o ports i/o ports는 메모리와 주소공간을 공유합니다. https://wiki.osdev.org/I/O_Ports 아래의 표에서 PIC 는 0x20 ~ 0x21의 주소를 가지고 있습니다. second PIC의 주소는 0xA0 ~ 0xA1의 주소를 가지고 있습니다. PIC의 비트의 의미 https://stackoverflow.com/questions/282983/setting-up-irq-mapping // PICM => master, PICS => slave outportb(0x20, 0x11); /* write ICW1 to PICM, we are gonna writ.. 더보기 이전 1 2 3 4 5 ··· 8 다음