пример flat-дескриптора в gdt

tatianant

Подскажите, каким образом можно создать в gdt flat-дексриптор (base=0, limit=ffffffff etc.) для сегмента кода и передать туда управление? И как записать код в этот сегмент. Ведь если я не записываю в базу дескриптора базу cs при переходе в p-mode, то jmp после входа в p-mode происходит явно куда-то не туда. Как бы продолжить выполнять код, находясь уже в flat-сегменте?
Спасибо.

SPARTAK3959

jmp'ы относительны, поэтому flat или не flat сегмент им пофиг. При переходе в p-mode менять cs не надо. Нужно сделать jmp selector:offset после построения нужных дескрипторов и установки gdt. Примеры дескрипторов из MenuetOS/KolibriOS:
os_code_l: ;флат-дескриптор кода, 0 кольцо

dw 0xffff
dw 0x0000
db 0x00
dw 11011111b *256 +10011010b
db 0x00

os_data_l: ;флат-дескриптор данных, 0 кольцо.

dw 0xffff
dw 0x0000
db 0x00
dw 11011111b *256 +10010010b
db 0x00

Там же можно посмотреть полностью как происходит переключение в pm. Сурсы можно скачать с http://kolibrios.org

tatianant

Kolibri посмотрел, интересно...
А что значит jmp относительны? Относительны ведь только near-jmp'ы, да и то не все. А те, что jmp [selector:offset] - они не относительны, там cs<-selector, eip<-offset, разве нет?
Оставить комментарий
Имя или ник:
Комментарий: