по мануалам.
Всё более-менее понятно, но затык в переключении на код ядра после перехода в long mode.
В этом чате уместно будет уточнить некоторые аспекты этого процесса?
Уместно, но с другой стороны зачем тебе загрузчик, пиши сразу ядро.
Хотелось досконально разобраться в работе процессора с момента запуска загрузчика. В ядре возникли проблемы именно с управлением памятью (реализация malloc/free для поддержки c++), так что решил копать с самого начала. Вероятно, разобравшись с загрузчиком, я его выброшу :) Насколько я понял, при переходе в long mode у нас в распоряжении пачка предопределенных сементов, в частности 0x08 и 0x10. Эти сегменты "смотрят" на страницы виртуальной памяти, которая "смотрит".. да, куда угодно в физической памяти смотрит? Мой boot0 подгружает с диска остальные секторы, это вроде стандартно для legacy. Когда ассемблерный код доходит до перехода к x64 (код на с), он делает jump CODE_SEG:c_main. Бинарник собирался так, чтобы c_main оказался по смещению 0x8000, так что по факту происходит jump 0x8:0x8000. И тут самое интересное, потому что мой код вызывается, дебажится (qemu+gdb) и вообще всё работает как хотелось. Но разве должно? Я имею в виду, что происходит переход в новое адресное пространство, а нём (по-моему) должно быть пусто, ну или там хлам какой-нибудь. И мне, по идее, надо было бы сперва загрузить туда код моего ядра, начиная со смещения 0, и прыгать в этот 0, а не в 8000, но почему-то работает без этого. Единственная мысль, что виртуальная память сегмента замаплена 1:1 на физическую память, но тогда зачем все эти танцы? Вот и хотел тут спросить, как в "чужом" сегменте появился мой код? А там ещё есть сегмент данных, что в нём пока не ясно, но до него тоже доберусь :)
Обсуждают сегодня