OSDev

для всех
Текущее время: 29 мар 2024, 00:11

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: загрузка ядра 1000h настройка pm
СообщениеДобавлено: 04 сен 2016, 03:04 

Зарегистрирован: 04 сен 2016, 02:49
Сообщения: 6
Кто знает как правильно настроить 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'


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: загрузка ядра 1000h настройка pm
СообщениеДобавлено: 04 сен 2016, 15:48 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Так у вас всё настроено.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: загрузка ядра 1000h настройка pm
СообщениеДобавлено: 04 сен 2016, 20:15 

Зарегистрирован: 04 сен 2016, 02:49
Сообщения: 6
да это код рабочий но с загрузчиками(бутсекторы) которые грузят по адресу 1000h:0000 не работает. вот есть статья https://habrahabr.ru/post/118881/ в этих случаях просто так не переходится в защищенный режим, пробывал выставлять такие же значение gdt но неработает, там пример hello worda он рабочий но приспособить к этому коду не получается его.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: загрузка ядра 1000h настройка pm
СообщениеДобавлено: 04 сен 2016, 21:00 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Base меняли?
GDT трогать не надо она у вас настроена на 0 базу и размером в 4 ГБ. Т.е дескриптор у вас покрывает любое расположение.
И вообще что отладчик показывает, где ошибка?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: загрузка ядра 1000h настройка pm
СообщениеДобавлено: 05 сен 2016, 12:57 
Аватара пользователя

Зарегистрирован: 14 мар 2011, 12:31
Сообщения: 970
Откуда: Дагоба
Andrzp писал(а):
Кто знает как правильно настроить gdt, если загрузчик загружает ядро по адресу 1000h(как в колибри и др.), ниже код nasm который работает с загручиком osboot tools. но он не загружает ядра больше 620 кб

Andrzp писал(а):
да это код рабочий но с загрузчиками(бутсекторы) которые грузят по адресу 1000h:0000 не работает.

Я не понял, какова ваша цель? Загружать по адресу 1000h:0000? Загружать больше 620 кб? Использовать загрузчик Kolibri?
Если вас ограничивают 620 кб, – никаким первичным загрузчиком вы не загрузите больше. Это максимум, который можно выжать, сохраняя совместимость между разными BIOS и файловыми системами. Загрузчик от Колибри не загрузит больше. Чтобы загрузить больше, вам нужно либо самостоятельно писать вторичный загрузчик, работающий в защищённом режиме (и, соответственно, драйверы необходимых файловых систем), либо использовать существующий, например, GRUB.
Если нужно загружать по определённому адресу, то можно перенести код на новое место после загрузки.
Если хотите использовать загрузчик от колибри, то придётся изучать его код, т.к. он не предназначен для использования другими ОС.

_________________
Yet Other Developer of Architecture.
The mistery of Yoda’s speech uncovered is:
Just an old Forth programmer Yoda was.

<<< OS Boot Tools. >>>


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: загрузка ядра 1000h настройка pm
СообщениеДобавлено: 05 сен 2016, 14:04 

Зарегистрирован: 04 сен 2016, 02:49
Сообщения: 6
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 $


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: загрузка ядра 1000h настройка pm
СообщениеДобавлено: 05 сен 2016, 19:52 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Цитата:
pavia Да пробывал менять на 1000h и jmp 1000h делал не переходит в pm

Если вас загружают по адресу 1234h:5678h то вы должны написать org 5678h и никаких jmp.
В org указывается смещение от начала сегмента.
Если вас грузят в 1000h:0000h, то надо написать org 0.

jmp используется в первичном загрузчике, так как в спецификации задан линейный адрес, а сегмен:смещение не определено
И может быть 07с0h:0000h, а может быть 0000h:7с00h. Вот чтобы избавится от неопределённости и используют jmp.

Надеюсь теперь понятно почему вам jmp не нужен.

Цитата:
Есть загрузчик с cd, котрый работает не в режиме эмуляции флопика, а именно как cd поддерживает формат iso9660 Joliet. он позволяет читать большие файлы.
Приведенный мною код является вторичным загрузчиком ниже его часть, mov ecx, 0x80000 с помощью этого можно грузить ядра больше 620кб т.к. это уже 32 битный код защищенного режима.

Какая прелесть. :lol:.
В реальном режиме базовая память 640 кб, поэтому больше 618 кб загрузить не выйдет.

mov ecx, 0x80000 - ничего не грузит. А только присваивает ячейке ecx, число 0х80000.
rep movsd - просто копирует данные из памяти в память. Если ваше ядро не влезло в базовую память, то и этот код уже не сможет скопировать ваше ядро из нижней памяти в верхнюю.
Запоминаем первичный загрузчик не может загрузить более 618 кб, для загрузки более нужен вторичный загрузчик.

Что-бы загрузить ядро более 618 кб надо написать кучу функций. Определение объема памяти, разбор файловой системы. Переход в защищенный режим и обратно. И периодически прыгать между режимами. Загружая с жёсткого небольшие кусочки в базовую память переключаться в защищенный режим копировать данные выходить в реальный режим и подгружать следующую порцию.
Лично я что-бы не прыгать сделал нереальный режим. Но всё равно такой загрузчик у меня занял 10-15 кб, а когда перешёл на страницы стало в 2 раза больше.


А так советую вам освоить bochs with debug - стимулятор компьютера с возможностью пошаговой отладки.
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: загрузка ядра 1000h настройка pm
СообщениеДобавлено: 06 сен 2016, 12:35 
Аватара пользователя

Зарегистрирован: 14 мар 2011, 12:31
Сообщения: 970
Откуда: Дагоба
Andrzp писал(а):
Yoda если есть у вас ссылки на вторичные загруз. даже с флопи
которые могут загружать больше 620 кб. киньте пожалуйста

Наберите в любом поисковике "GRUB".
Вторичные загрузчики GRUB Legacy, GRUB4DOS и SYSLINUX есть в архиве OS Boot Tools, который вы скачали.

_________________
Yet Other Developer of Architecture.
The mistery of Yoda’s speech uncovered is:
Just an old Forth programmer Yoda was.

<<< OS Boot Tools. >>>


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB