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