OSDev
http://osdev.su/

Адресация в защищенном режиме, непонятка
http://osdev.su/viewtopic.php?f=6&t=312
Страница 1 из 1

Автор:  Driusha [ 27 фев 2010, 20:40 ]
Заголовок сообщения:  Адресация в защищенном режиме, непонятка

Добрый день!
Принялся разбираться с работой в защищенном режиме. Вопрос у меня, я думаю, достаточно простой, аналогичный кусок кода можно встретить во многих операционках (это фрагмент запускалки ядра, написанного на Си, ОС 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.

Вложения:
Комментарий к файлу: Собственно запускалка ядра. (Plain text!).
start.zip [3.08 КБ]
Скачиваний: 890

Автор:  KIV [ 27 фев 2010, 21:12 ]
Заголовок сообщения:  Re: Адресация в защищенном режиме, непонятка

Значения для сегментов не определены в спецификации Multi-boot. Нельзя изменять значения сегментных регистров пока не будет созданна сообственная таблица дескрипторов сегментов, т. к. неизвестно какие они селекторы будут иметь. И вообще таблицы дескрипторов может уже не быть в памяти. Да, после она требуется только для изменения сегментных регистров. В остальных ситуациях обращения к ней не производятся. При перезагрузке сегментных регистров параметры сегмента из дескриптора загружаются в теневую часть сегментного регистра и теперь уже используются не дескрипторы в памяти, а в теневой части. По спецификации Multi-boot сегментные регистры уже настроенны как надо и необходимость их изменить до создания своей таблицы дескрипторов (а её обязательно надо создать) возникнуть не должна.

Автор:  Driusha [ 27 фев 2010, 22:11 ]
Заголовок сообщения:  Re: Адресация в защищенном режиме, непонятка

А как тогда работает кусок кода выше? Там определяется таблица дескрипторов:
  • Первый — нулевой.
  • Второй и третий — два сегмента с одинаковыми физическими адресами [0, 4Gb].
В селектор данных помещается селектор второго дескриптора.
В селектор кода посредством джампа помещается селектор третьего дескриптора.
Как получается, что мы сменили кодовый сегмент, а код продолжает выполняться? Получается, старый кодовый сегмент совпал с новым?

И еще пара вопросов:
Как будет выглядеть память после того, как ядро в формате ELF будет загружено GRUB`ом? Куда поместитятся секции .text, .data, .bss?

В примере в аттаче таблица дескрипторов описывается в секции .data, а сами дескрипторы (оба) указывают на память по адресу ноль с лимитом 4Гб, получается, что таблица дескрипторов находится в сегменте, который описывают дескрипторы в этой таблице ( %) )? Это нормально?

Автор:  Himik [ 28 фев 2010, 01:48 ]
Заголовок сообщения:  Re: Адресация в защищенном режиме, непонятка

Driusha писал(а):
Это нормально?

Это нормально, потому что на самом деле здесь отдельных сегментов нет. Наверно вы слышали про плосую модель памяти (Flat model)? Сегментные регистры настраиваются так, что адресация идёт линейно, как при отсутствии сегментов. Grub тоже настраивает плоскую модель, поэтому все адреса можно считать как физические.

Автор:  Driusha [ 28 фев 2010, 11:37 ]
Заголовок сообщения:  Re: Адресация в защищенном режиме, непонятка

Чудесно, я, кажется, прозрел! :) Спасибо!

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/