Кто знает как правильно настроить 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'