Вот я добрался и до загрузчика в защищенный режим... Код (Text): ;-------------------------------------------- ;Сектор 1 ;-------------------------------------------- use16 org 0x7C00 jmp 0x0000:boot_code nop ;--------------------------------- ;ÏПроцедуры ;--------------------------------- PrintString: mov ah,0x0e mov bh,0x00 mov bl,0x07 @@: lodsb ; вывод строки на экран or al,al je .done int 0x10 jmp @b .done: ret read_sector: xor ax, ax mov es, ax ;буфер es:bs mov dl, 0 mov dh, 0 mov ch, 0 mov ah, 2 int 0x13 ;читаем с floppy ret ;--------------------------------- ;Данные ;--------------------------------- msg_loading db 'Loading Kernel...',13,10,0 kernel_ok db 'Kernel Loaded...',13,10,0 switch_ker db 'Switching Kernel...',13,10,0 press_msg db 'Press any key to continue...',13,10,0 boot_code: cli mov ax,cs mov ds,ax ;Настройка сегментов mov es,ax mov ss,ax mov sp,0x7C00 sti mov ecx,0x100 mov si,0x7C00 mov di,0x5000 ; копируемся из 0х7С00 в 0х5000 xor bx,bx xor dx,dx rep movsw jmp 0x0000:start start: mov si, msg_loading call PrintString mov al,0x01 ; Грузим ядро 0x0000:0x6000 mov cl,0x02 mov bx,0x6000 call read_sector mov si,kernel_ok call PrintString mov si,switch_ker call PrintString mov si,press_msg call PrintString mov ah,0x00 int 0x16 calc_entry: xor eax,eax mov ax,0x0000 ; вычисляем смещение для jmpа shl eax,4 add eax,0x6000 mov dword [vxod],eax switching_pmode: mov ax,3 int 0x10 mov ah, 1 ; очищаем экран и убераем курсор mov ch, 0x20 int 0x10 in al, 0x92 or al, 2 ; включаем 32битную адресацию (A20) out 0x92, al lgdt [GDTR] ; Загружаем GDTR cli ;отрубаем маскируемые прерывания in al,0x70 or al,0x80 ;отрубаем не маскируемые прерывания out 0x70,al mov eax, cr0 or al, 1 ; устанавливаем бит РЕ в CR0 mov cr0, eax db 0x66 ;префикс разрядности db 0xEA ; опкод far jmp (проблема именно в этом джампе) vxod dd ? ; 32 битное смещение dw 00001000b ; селектор id=1 ;--------------------------------- ;Таблица дискрипторов ;--------------------------------- GDT: null_desc db 0,0,0,0,0,0,0,0 code_desc db 0xFF,0xFF,0x00,0x00,0x00,10011010b,11001111b,0x00 data_desc db 0xFF,0xFF,0x00,0x00,0x00,10010010b,11001111b,0x00 video_desc db 0x00,0x80,0x00,0x80,0x0B,10010010b,01000000b,0x00 GDT_size equ $-GDT GDTR: dw GDT_size-1 dd GDT times 510-($-$$) db 0 dw 0xAA55 ;-------------------------------------------- ;Сектор 2 ;-------------------------------------------- file 'kernel.bin' Исходник kernel.bin Код (Text): use32 org 0x6000 l1: jmp l1 (чисто для теста) times 512-($-$$) db 0 Проблема в том что когда он джампит qemu зависает...В чем проблема?Помогите плз начинающему кодеру...
Имеятся виду что после этого шага qemu падает.Заменил на jmp 0x8: _protected ; _protected: use32 jmp $ Так не падает.Пытаюсь понять почему..Спрашиваю у знатаков))
db 0x66 ;префикс разрядности db 0xEA ; опкод far jmp (проблема именно в этом джампе) vxod dd ? ; 32 битное смещение dw 00001000b ; селектор id=1 ошибка: сначала сегмент потом смещеени тьфу.. сори, перекодил_)
vorobei99 1. нулевое количество секторов для чтения Код (Text): read_sector: xor ax, ax ... 2. теряем номер загрузочного устройства, который BIOS записывает в DL при переходе на 0000h:7C00h Код (Text): mov ecx,0x100 mov si,0x7C00 mov di,0x5000 ; копируемся из 0х7С00 в 0х5000 xor bx,bx xor dx,dx ... так что подозреваю, что kernel.bin не загружается
Еще один вопросик знатокам.Вот использую рассылку с lowlevel...Делал пробник своего ядра на сях ktty.c Код (Text): #define VIDEO_WIDTH 80 #define VIDEO_HEIGHT 25 #define VIDEO_RAM 0xb8000 void print(){ char *video = VIDEO_RAM; *(video)='h'; *(video+1)=07; *(video+2)='i'; *(video+3)=07; } kernel.c Код (Text): void kernel_main() { print(); for(;;); } startup.c Код (Text): void _start() { kernel_main(); } gcc -ffreestanding -c -o startup.o startup.c gcc -ffreestanding -c -o kernel.o kernel.c gcc -ffreestanding -c -o ktty.o ktty.c ld -Ttext 0x200000 -o kernel.bin startup.o ktty.o kernel.o objcopy kernel.bin -O binary Файл получается около 8кб..Откуда такой размер? Hex view: Код (Text): seg000:00000000 55 89 E5 83 EC 08 E8 35 00 00 00 C9 C3 90 90 90 UÉõÃüø5...ã+ÐÐÐ seg000:00000010 55 89 E5 83 EC 04 C7 45 FC 00 80 0B 00 8B 45 FC UÉõÃü¦E¹.À.ËE¹ seg000:00000020 C6 00 68 8B 45 FC 40 C6 00 07 8B 45 FC 83 C0 02 ¦.hËE¹@¦.ËE¹ÃL seg000:00000030 C6 00 69 8B 45 FC 83 C0 03 C6 00 07 C9 C3 90 90 ¦.iËE¹ÃL¦.ã+ÐÐ seg000:00000040 55 89 E5 83 EC 08 E8 C5 FF FF FF EB FE 90 90 90 UÉõÃüø+ û¦ÐÐÐ seg000:00000050 FF FF FF FF 00 00 00 00 FF FF FF FF 00 00 00 00 .... .... seg000:00000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ seg000:00000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ seg000:00000080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ seg000:00000090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ seg000:000000A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ seg000:000000B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ seg000:000000C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ seg000:000000D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ............... И так далее Зачем он такой файл создает кривой?Или может чего не понимаю...Подскажите..
Тоесть он выравнивает так что бы было кратен восьми адрес..так помойму в рассылки писали....Тоесть ни как не схитрить?
vorobei99 Код (Text): # script.ld OUTPUT_FORMAT("binary") SECTIONS { BASE = 2M ; .text BASE : AT(0) { *(.text) ; } } Код (Text): # ld -T script.ld startup.o ktty.o kernel.o -o image