Пишу свое ядро на Си, и ассемблере.
Для сборки "проекта: "использовал скрипты из данной статьи
https://xakep.ru/2018/06/18/lets-write-a-kernel/
Проблема заключалась в том что когда я запускал ядро в qemu через ключ -kernel, все работало отлично, но запуская через easyBCD на реальном железе, исчез весь весь текст, и вовсе оно слегка поломалось.
Случайно выяснил что дело в дескрипторной таблице, когда я менял селектор на сегмент кода для шлюза прерывания, то код начинал работать на реальном железе но в тот-же момент прекращал работать на виртуалке.
Решил что просто задам свою дескрипторную таблицу ( хотя-бы попытаюсь ), и первым делом решил её считать, используя код ниже получил адрес таблицы, в качестве аргумента передавал указатель на структуру ( структуры ниже.
_getGDTR:
mov eax,[esp+4]
sgdt [eax]
ret
И когда я считал сегменты, я получил какой-то мусор, причем даже когда я решил перезаписать их значениями 0xFF, произошло НИЧЕГО, код выполнился дальше, на экране я получил вывод, так будто-то бы я и не затронул никакой важной информации.
Пример того что лежит в дескрипторах ( что в нулевом, что в следующем, итд там различий не много )
У меня есть догадка насчет того что мой сегмент кода\данных не покрывает полностью 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;
};
Так-же приложу дамп памяти по "адресу"( я не уверен что это действительно дамп с нужного адреса ) таблицы:
Буду рад любым подсказкам.