Добрый день!
Принялся разбираться с работой в защищенном режиме. Вопрос у меня, я думаю, достаточно простой, аналогичный кусок кода можно встретить во многих операционках (это фрагмент запускалки ядра, написанного на Си,
ОС flick, а собственно саму запускалку запускает GRUB):
Код:
; load our own GDT
; GRUB sets up one only temporarily
lgdt [gdt_ptr] ; now load the GDT...
mov ax,DS_SELECTOR ; ...and update segment registers
mov ds,ax
mov es,ax
mov ss,ax
mov fs,ax
mov gs,ax
jmp CS_SELECTOR:go_on ; do a JMP to initialize CS register
; Вот здесь мне не понятно <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
go_on:
;разные командочки
;[ВЫРЕЗАНО]
; Global Descriptor Table
gdt:
; NULL descriptor
dw 0
dw 0
db 0
db 0
db 0
db 0
[global DS_SELECTOR]
DS_SELECTOR equ $ - gdt
dw 0FFFFh
dw 0
db 0
db 92h ; present, ring 0, data, expand-up, writable
db 0CFh ; page-granular (4 gig limit), 32-bit
db 0
[global CS_SELECTOR]
CS_SELECTOR equ $ - gdt
dw 0FFFFh
dw 0
db 0
db 9Ah ; present,ring 0,code,non-conforming,readable
db 0CFh ; page-granular (4 gig limit), 32-bit
db 0
gdt_end:
gdt_ptr:
dw gdt_end - gdt - 1
dd gdt
section .bss
resb 8192 ; 8 kilobytes for stack
stack_top: ; top of our stack here
Собственно вопросы:
Как выглядит глобальная таблица дескрипторов, созданная GRUB`ом?
Отличается-ли она от описанной выше?
Если отличается, то как может выполняться этот код:
Код:
jmp CS_SELECTOR:go_on ; do a JMP to initialize CS register
go_on:
Ведь граб поместил его в память в одно конкретное место (или я не прав?)!
Прошу прощения за, вероятно, тупой вопрос и невнятную формулировку.
P.S. В аттаче текстовый файл с расширением zip.