Как мне правильно считать дескрипторную таблицу?

Пишу свое ядро на Си, и ассемблере.
Для сборки "проекта: "использовал скрипты из данной статьи https://xakep.ru/2018/06/18/lets-write-a-kernel/

Проблема заключалась в том что когда я запускал ядро в qemu через ключ -kernel, все работало отлично, но запуская через easyBCD на реальном железе, исчез весь весь текст, и вовсе оно слегка поломалось.
Случайно выяснил что дело в дескрипторной таблице, когда я менял селектор на сегмент кода для шлюза прерывания, то код начинал работать на реальном железе но в тот-же момент прекращал работать на виртуалке.

Решил что просто задам свою дескрипторную таблицу ( хотя-бы попытаюсь ), и первым делом решил её считать, используя код ниже получил адрес таблицы, в качестве аргумента передавал указатель на структуру ( структуры ниже.
_getGDTR:
mov eax,[esp+4]
sgdt [eax]
ret


И когда я считал сегменты, я получил какой-то мусор, причем даже когда я решил перезаписать их значениями 0xFF, произошло НИЧЕГО, код выполнился дальше, на экране я получил вывод, так будто-то бы я и не затронул никакой важной информации.

Пример того что лежит в дескрипторах ( что в нулевом, что в следующем, итд там различий не много )
60560becb68e9610830559.png

У меня есть догадка насчет того что мой сегмент кода\данных не покрывает полностью 4 гига, и мои обращения по адресу получаются смещены из за смещения самого сегмента. Но я не уверен, может я где-то накосячил.

Структуры в Си коде:
struct GDTR{
    unsigned short limit;
    unsigned long addr;
};

struct SegmentDescription {
	unsigned char limit_low_low;
	unsigned char limit_low_hi;
	unsigned char	address_low_low;
	unsigned char	address_low_hi;
	unsigned char address_middle;		
	unsigned char access_rights;		
	unsigned char limit_hi_and_flags;
	unsigned char address_hi;	
};


Так-же приложу дамп памяти по "адресу"( я не уверен что это действительно дамп с нужного адреса ) таблицы:
60560da4e346b880803247.png

Буду рад любым подсказкам.
  • Вопрос задан
  • 157 просмотров
Пригласить эксперта
Ответы на вопрос 1
MegaCraZy6
@MegaCraZy6 Автор вопроса
Юзерь
Вероятнее всего проблема связана с тем как компилятор Си упаковывает структуры.

Пока действия происходят внутри сишного кода это не так важно. Но если структура используется для хранения данных в каком нибудь строгом формате следования байтов, или же не явно используется извне, это уже вызывает проблемы.

Подробнее:
https://m.habr.com/ru/post/142662/

PS: Сам задал вопрос, сам ответил. Помечать ответ не буду, как-то не красиво получается, да и я не уверен что я прав. Но мне вроде помогло, используя знания из ссылочки выше, смог сделать работающий костыль ( удача? ).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы