OSDev

для всех
Текущее время: 09 май 2024, 17:31

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




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
СообщениеДобавлено: 27 фев 2010, 20:40 

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


Последний раз редактировалось Driusha 27 фев 2010, 22:05, всего редактировалось 1 раз.
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 27 фев 2010, 21:12 

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 27 фев 2010, 22:11 

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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 28 фев 2010, 01:48 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Driusha писал(а):
Это нормально?

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 28 фев 2010, 11:37 

Зарегистрирован: 27 фев 2010, 19:53
Сообщения: 6
Чудесно, я, кажется, прозрел! :) Спасибо!


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

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


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

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


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

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