OSDev http://osdev.su/ |
|
загрузка ядра 1000h настройка pm http://osdev.su/viewtopic.php?f=6&t=1151 |
Страница 1 из 1 |
Автор: | Andrzp [ 04 сен 2016, 03:04 ] |
Заголовок сообщения: | загрузка ядра 1000h настройка pm |
Кто знает как правильно настроить gdt, если загрузчик загружает ядро по адресу 1000h(как в колибри и др.), ниже код nasm который работает с загручиком osboot tools. но он не загружает ядра больше 620 кб ; OS sample code ; (c) 2011-2012 Serge Goncharov, see EULA. ; NASM 2.09 used ; Download it from here: http://www.nasm.us/ ; Compile file with the following command line: ; nasm kernel.asm -o kernel.sys -Ox ; Multipush macro Base: equ 600h ; The standard base that OS kernel will be loaded to. cpu 386 bits 16 section .text org Base ;; Установка vesa jmp 0:Start Start: push ES mov AX,DS mov ES,AX mov AX,4F00h mov DI,VESAINFO int 10h cmp AX,4Fh cmp word[VESAINFO+4],200h mov BX,word[VESAINFO+0Eh] mov AX,word[VESAINFO+10h] mov ES,AX NextMode: mov CX,[ES:BX] cmp CX,0 cmp CX,0FFFFh push ES mov AX,DS mov ES,AX mov AX,4F01h mov DI,MODEINFO int 10h pop ES cmp word[MODEINFO+12h],maxX jne NotTrueColor32 cmp word[MODEINFO+14h],maxY jne NotTrueColor32 cmp byte[MODEINFO+19h],32 jne NotTrueColor32 cmp dword[MODEINFO+28h],0 jne SetMode NotTrueColor32: inc BX jmp NextMode SetMode: mov EAX,dword[MODEINFO+28h] mov [LVideoBuf],EAX mov EBP,dword[MODEINFO+28h] mov AX,4F02h mov BX,[ES:BX] or BX,4000h int 10h mov AX,4F06h xor BX,BX mov CX,word[MODEINFO+12h] int 10h pop ES jmp 0x0000:entry entry: xor ax,ax mov ds,ax ;; Отключим прерывания cli ;; Загрузка регистра GDTR: lgdt [gd_reg] ;; Включение A20: in al, 0x92 or al, 2 out 0x92, al ;; Установка бита PE регистра CR0 mov eax, cr0 or al, 1 mov cr0, eax ;; С помощью длинного прыжка мы загружаем ;; селектор нужного сегмента в регистр CS ;; (напрямую это сделать нельзя) jmp 0x8: _protected ;; Сюда будет передано управление ;; после входа в PM BITS 32 ;; Сюда будет передано управление ;; после входа в PM _protected: ;; Загрузим регистры DS и SS селектором mov ax, 0x10 mov ds, ax mov es, ax mov ss, ax ;; Наше ядро (kernel.bin) слинковано по адресу 2мб ;; Переместим его туда ;; kernel_binary - метка, после которой ;; вставлено ядро ;; (фактически - его линейный адрес) mov esi, kernel_binary ;; адрес, по которому копируем mov edi, 0x200000 ;; Размер ядра в двойных словах mov ecx, 0x80000 ;; Поехали rep movsd ;; Ядро скопировано, передаем управление ему jmp 0x200000 jmp $ SEGMENT .data ALIGN 4 VESAINFO times 512 db 0 MODEINFO times 256 db 0 maxX equ 1024 maxY equ 768 LVideoBuf dd 0 startpixel dd 0 gdt: dw 0, 0, 0, 0 ; Нулевой дескриптор db 0xFF ; Сегмент кода с DPL=0 db 0xFF ; Базой=0 и Лимитом=4 Гб db 0x00 db 0x00 db 0x00 db 10011010b db 0xCF db 0x00 db 0xFF ; Сегмент данных с DPL=0 db 0xFF ; Базой=0 и Лимитом=4Гб db 0x00 db 0x00 db 0x00 db 10010010b db 0xCF db 0x00 ;; Значение, которое мы загрузим в GDTR: gd_reg: dw 8192 dd gdt kernel_binary: incbin 'kernel.bin' |
Автор: | pavia [ 04 сен 2016, 15:48 ] |
Заголовок сообщения: | Re: загрузка ядра 1000h настройка pm |
Так у вас всё настроено. |
Автор: | Andrzp [ 04 сен 2016, 20:15 ] |
Заголовок сообщения: | Re: загрузка ядра 1000h настройка pm |
да это код рабочий но с загрузчиками(бутсекторы) которые грузят по адресу 1000h:0000 не работает. вот есть статья https://habrahabr.ru/post/118881/ в этих случаях просто так не переходится в защищенный режим, пробывал выставлять такие же значение gdt но неработает, там пример hello worda он рабочий но приспособить к этому коду не получается его. |
Автор: | pavia [ 04 сен 2016, 21:00 ] |
Заголовок сообщения: | Re: загрузка ядра 1000h настройка pm |
Base меняли? GDT трогать не надо она у вас настроена на 0 базу и размером в 4 ГБ. Т.е дескриптор у вас покрывает любое расположение. И вообще что отладчик показывает, где ошибка? |
Автор: | Yoda [ 05 сен 2016, 12:57 ] |
Заголовок сообщения: | Re: загрузка ядра 1000h настройка pm |
Andrzp писал(а): Кто знает как правильно настроить gdt, если загрузчик загружает ядро по адресу 1000h(как в колибри и др.), ниже код nasm который работает с загручиком osboot tools. но он не загружает ядра больше 620 кб Andrzp писал(а): да это код рабочий но с загрузчиками(бутсекторы) которые грузят по адресу 1000h:0000 не работает. Я не понял, какова ваша цель? Загружать по адресу 1000h:0000? Загружать больше 620 кб? Использовать загрузчик Kolibri? Если вас ограничивают 620 кб, – никаким первичным загрузчиком вы не загрузите больше. Это максимум, который можно выжать, сохраняя совместимость между разными BIOS и файловыми системами. Загрузчик от Колибри не загрузит больше. Чтобы загрузить больше, вам нужно либо самостоятельно писать вторичный загрузчик, работающий в защищённом режиме (и, соответственно, драйверы необходимых файловых систем), либо использовать существующий, например, GRUB. Если нужно загружать по определённому адресу, то можно перенести код на новое место после загрузки. Если хотите использовать загрузчик от колибри, то придётся изучать его код, т.к. он не предназначен для использования другими ОС. |
Автор: | Andrzp [ 05 сен 2016, 14:04 ] |
Заголовок сообщения: | Re: загрузка ядра 1000h настройка pm |
pavia Да пробывал менять на 1000h и jmp 1000h делал не переходит в pm mode, а 16 битный код без проблем работает, а 32 битный ни какой даже halloword без vesa, vesa без проблем устанавливает а вот вывести линию даже в 32 битном не выводит т.к. нету перехода в pm mode. В статье выше на которую ссылку давал есть фрагмент, как его реализовать на nasm не представляю. Может знаете как это сделать? пробывал делать jmp 0x10000h не помогло. virtual ;теперь, фактически, забиваем пространство до конца сегмента rb 10000h-$; end virtual ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;PM32 Entry;;;;;;;;;;;;;;;;;;; use32 org $+10000h;вот для чего: в PM мы работаем с Flat-сегментами, и если мы оставим код ;для PM перед org’ом, то ;внутрисегментный адрес не будет совпадать с Flat адресом. Так вот. Yoda Добрый день! Есть загрузчик с cd, котрый работает не в режиме эмуляции флопика, а именно как cd поддерживает формат iso9660 Joliet. он позволяет читать большие файлы. Приведенный мною код является вторичным загрузчиком ниже его часть, mov ecx, 0x80000 с помощью этого можно грузить ядра больше 620кб т.к. это уже 32 битный код защищенного режима. Yoda если есть у вас ссылки на вторичные загруз. даже с флопи которые могут загружать больше 620 кб. киньте пожалуйста : ;; kernel_binary - метка, после которой ;; вставлено ядро ;; (фактически - его линейный адрес) mov esi, kernel_binary ;; адрес, по которому копируем mov edi, 0x200000 ;; Размер ядра в двойных словах mov ecx, 0x80000 ;; Поехали rep movsd ;; Ядро скопировано, передаем управление ему jmp 0x200000 jmp $ |
Автор: | Yoda [ 06 сен 2016, 12:35 ] |
Заголовок сообщения: | Re: загрузка ядра 1000h настройка pm |
Andrzp писал(а): Yoda если есть у вас ссылки на вторичные загруз. даже с флопи которые могут загружать больше 620 кб. киньте пожалуйста Наберите в любом поисковике "GRUB". Вторичные загрузчики GRUB Legacy, GRUB4DOS и SYSLINUX есть в архиве OS Boot Tools, который вы скачали. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |