От няколко дни мъча един буут сектор, който подкарвам под бокс. Проблемът е, че след като добавих зареждането на втори сектор, в който държа таблицата на векторите на прекъсванията, всяко извикване на такова води до CPU_LOOP 1
Подобен проблем срещнах веднъж в нета и нямаше отговор
Ето сорса:
Примерен код |
;----------------------------------------------------------------------------- ; First sector ;----------------------------------------------------------------------------- org 0x07c00 ; Start address 0000:7c00 jmp short begin_boot; Jump to start of boot routine & skip other data bootmesg db "Our OS boot sector loading ......" pm_mesg db "Switching to protected mode ...." dw 512; Bytes per sector db 1; Sectors per cluster dw 1; Number of reserved sectors db 2; Number of FATs dw 0x00e0; Number of dirs in root dw 0x0b40; Number of sectors in volume db 0x0f0; Media descriptor dw 9; Number of sectors per FAT dw 18; Number of sectors per track dw 2; Number of read/write sectors dw 0; Number of hidden sectors print_mesg: mov ah, 0x13; Fn 13h of int 10h writes a whole string on screen mov al, 0x00; bit 0 determines cursor pos,0->point to start after ; function call,1->point to last position written mov bx, 0x0007; bh -> screen page ie 0,bl = 07 ie white on black mov cx, 0x20; Length of string here 32 mov dx, 0x0000; dh->start cursor row,dl->start cursor column int 0x10; call bios interrupt 10h ret ; Return to calling routine dd 0x66600666 get_key: mov ah, 0x00 int 0x16; Get_key Fn 00h of 16h,read next character ret clrscr: mov ax, 0x0600; Fn 06 of int 10h,scroll window up,if al = 0 clrscr mov cx, 0x0000; Clear window from 0,0 mov dx, 0x174f; to 23,79 mov bh, 0; fill with colour 0 int 0x10; call bios interrupt 10h ret begin_boot: call clrscr ; Clear the screen first mov bp, bootmesg; Set the string ptr to message location call print_mesg ; Print the message call get_key ; Wait till a key is pressed bits 16 call clrscr ; Clear the screen mov ax, 0xb800 ; Load gs to point to video memory mov gs, ax ; We intend to display a brown A in real mode mov word [gs:0], 0x641; display call get_key ; Get_key again,ie display till key is pressed mov bp, pm_mesg ; Set string pointer call print_mesg ; Call print_mesg subroutine mov ah, 0x00 ; Init floppy mov dl, 0x00 int 0x13 jnc pass1 ;hlt pass1: mov ax, 0x0201 ; Read second sector xor bx, bx mov es, bx mov bx, idtr mov cx, 0x0001 mov dx, 0 int 0x13 jnc pass2 ;hlt pass2: call get_key ; Wait till key is pressed call clrscr ; Clear the screen cli ; Clear or disable interrupts lgdt [gdtr] ; Load GDT lidt [idtr] ; Load IDT mov eax, cr0 ; The lsb of cr0 is the protected mode bit or al, 0x01 ; Set protected mode bit mov cr0, eax ; Mov modified word to the control register jmp codesel:go_pm bits 32 go_pm: mov ax, datasel mov ds, ax ; Initialise ds & es to data segment mov es, ax mov ax, videosel; Initialise gs to video memory mov gs, ax ;mov al, 0x11 ;out 0x20, al ;mov al, 0x11 ;out 0xA0, al ;mov al, 0x20 ;out 0x21, al ;mov al, 0x28 ;out 0xA1, al ;mov al, 0x04 ;out 0x21, al ;mov al, 0x01 ;out 0xA1, al ;mov al, 0x01 ;out 0x21, al ;mov al, 0x01 ;out 0xA1, al ;sti xor ecx, ecx div ecx spin: jmp spin ; Loop printMsg: mov word [gs:0], 0x0941 ag:;mov word [gs:ecx], 0x0941 ;cmp ecx, 40 ;jne ag ;xor ax, ax ;div ax ;add ecx, 2 noz: ret timer: call printMsg ;mov al, 0x20 ;out 0x20, al iret bits 16 nop nop nop nop gdtr: dw gdt_end-gdt-1; Length of the gdt dd gdt ; physical address of gdt gdt nullsel equ $-gdt; $->current location,so nullsel = 0h gdt0 ; Null descriptor,as per convention gdt0 is 0 dd 0; Each gdt entry is 8 bytes, so at 08h it is CS dd 0; In all the segment descriptor is 64 bits codesel equ $-gdt; This is 8h,ie 2nd descriptor in gdt code_gdt ; Code descriptor 4Gb flat segment at 0000:0000h dw 0x0ffff; Limit 4Gb bits 0-15 of segment descriptor dw 0x0000; Base 0h bits 16-31 of segment descriptor (sd) db 0x00; Base addr of seg 16-23 of 32bit addr,32-39 of sd db 0x09a; P,DPL(2),S,TYPE(3),A->Present bit 1,Descriptor ; privilege level 0-3,Segment descriptor 1 ie code ; or data seg descriptor,Type of seg,Accessed bit db 0x0cf; Upper 4 bits G,D,0,AVL ->1 segment len is page ; granular, 1 default operation size is 32bit seg ; AVL : Available field for user or OS ; Lower nibble bits 16-19 of segment limit db 0x00; Base addr of seg 24-31 of 32bit addr,56-63 of sd datasel equ $-gdt; ie 10h, beginning of next 8 bytes for data sd data_gdt ; Data descriptor 4Gb flat seg at 0000:0000h dw 0x0ffff; Limit 4Gb dw 0x0000; Base 0000:0000h db 0x00; Descriptor format same as above db 0x092 db 0x0cf db 0x00 videosel equ $-gdt; ie 18h,next gdt entry dw 3999; Limit 80*25*2-1 dw 0x8000; Base 0xb8000 db 0x0b db 0x92; present,ring 0,data,expand-up,writable db 0x00; byte granularity 16 bit db 0x00 gdt_end times 510-($-$$) db 0; Fill bytes from present loc to 510 with 0s dw 0x0aa55; Write aa55 in bytes 511,512 to indicate that ; it is a bootable sector. ;----------------------------------------------------------------------------- ; Second sector ;----------------------------------------------------------------------------- nop nop nop nop idtr: dw idt_end-idt-1; Length of the gdt dd idt ; physical address of gdt idt dw timer dw codesel dw 0x8E00 dw 0 times 240 db 0 int_clock: dw timer dw codesel dw 0x8E00 dw 0 idt_end times 1024-($-$$) db 0 times 2878 * 512 db 0 |