2014-01-15 4 views
3

Я читаю код дизассемблера кода ядра mit os. Я думаю, что код ядра должен следовать тому же правилу.физический адрес глобальной таблицы дескрипторов?

Я видел инструкцию в ядре, загрузки глобальной таблицы дескрипторов следующим образом: lgdtl 0x10f018

Я знаю, что lgdt принимает длину GDT (16bit) и адрес GDT (32bit) как операнд. Тем не менее, я не могу определить, из чего состоит адрес GDT.

Я изучаю содержимое памяти из 8 слов, начиная с 0x10f0 и 0xf018. Все 8 слов, начинающихся с обоих этих двух адресов, равны нулю.

Мой вопрос: Что такое адрес GDT от lgdtl 0x10f018? Как вы это рассказали? Аппарат Intel 32bit.

Есть ли какой-либо реестр, держащий адрес GDT? Я использую bochs для запуска ОС, поэтому, если я знаю регистр, возможно, я могу просто распечатать содержимое реестра.

Большое вам спасибо за помощь!

[МОДИФИКАЦИЯ] Я посмотрел вокруг и обнаружил, что ADSL ADSL означает загрузку содержимого в ADDR в GDTR. Таким образом, содержимое в ADDR является лимитом и адресом GDT. Я распечатать содержимое памяти на 0x10f018:

<bochs:24> x /8wx 0x10f018 
[bochs]: 
0x0010f018 <bogus+  0>: 0xf0000017 0x00000010 0x32311b00 0x36353433 
0x0010f028 <bogus+  16>: 0x30393837 0x09083d2d 0x72657771 0x69757974 

Ниже приводится набор вверх из GDT

################################################################### 
# setup the GDT 
################################################################### 
     .p2align  2    # force 4 byte alignment 
mygdt: 
     SEG_NULL        # null seg 
     SEG(STA_X|STA_R, -KERNBASE, 0xffffffff) # code seg 
     SEG(STA_W, -KERNBASE, 0xffffffff)  # data seg 
mygdtdesc: 
     .word 0x17     # sizeof(mygdt) - 1 
     .long RELOC(mygdt)   # address mygdt 

Мой вопрос: как я могу интерпретировать

0x0010f018 <bogus+  0>: 0xf0000017 0x00000010 0x32311b00 

, чтобы получить адрес GDT?

BTW, содержание 0x00f01000 заключается в следующем. Я думал, что это может быть GDT, но нет. :(Любой может помочь

<bochs:31> x /16wx 0x00f01000 
[bochs]: 
0x00f01000 <bogus+  0>: 0x00000000 0x00000000 0x00000000 0x00000000 
0x00f01010 <bogus+  16>: 0x00000000 0x00000000 0x00000000 0x00000000 
0x00f01020 <bogus+  32>: 0x00000000 0x00000000 0x00000000 0x00000000 
0x00f01030 <bogus+  48>: 0x00000000 0x00000000 0x00000000 0x00000000 

Решено:

<bochs:29> x /6bx 0x10f018 
[bochs]: 
0x0010f018 <bogus+  0>: 0x17 0x00 0x00 0xf0 0x10 0x00 

Основываясь на небольшой edian, регистр имеет 0010f000 0017 Таким образом, адрес GDT является 0010f000, его длина составляет 0017; Это подтверждено, глядя на содержании в 0010f000:

<bochs:32> x /8wx 0x0010f000 
[bochs]: 
0x0010f000 <bogus+  0>: 0x00000000 0x00000000 0x0000ffff 0x10cf9a00 
0x0010f010 <bogus+  16>: 0x0000ffff 0x10cf9300 0xf0000017 0x00000010 

Кроме того, первоначальные особенно направлен на 0x0010f000, который является начальным адресом GDT, когда Т. вызывается его первая функция, стек увеличивается с более высокого адреса на нижний адрес.

Карта памяти выглядит следующим образом (слева ниже адрес):

--- стек программы --- | GDT

ответ

3

GDT в основном структура, которая содержит различные элементы GDT. lgdtl - это инструкция для загрузки таблицы глобальных дескрипторов в регистр gdt. Итак, чтобы ответить на ваш вопрос: 0x10f018 - это базовый адрес GDT.Если вы посмотрите на код, вы обнаружите, что GDT определяется как структура, а 0x10f018 - это адрес этой структуры (согласно вашей разборке), внутри структуры GDT может быть до 8192 записей.

Итак, да, регистр GDT имеет базовый адрес структуры GDT. lgdt используется для настройки gdt и имеет формат: lgdt maddr. И ваш план распечатки содержимого регистра не будет работать до установки GDT, потому что единственным способом настройки GDT является использование lgdt.

Надеюсь, это поможет! См. Также рекомендации по устранению неполадок GDT и LGDT

+0

Привет, @rakib, большое вам спасибо за ваш ответ. Тем не менее, я огляделся, 0x10f018 должен быть адресом, где хранится адрес и лимит GDT. Не могли бы вы взглянуть на мою модификацию вопроса. Я думаю, что контент 0x10f018 не является GDT – Mike

Смежные вопросы