Начит начал писать я что-то типа своей оси загрузчик, переход в pm и прочее ручками естественно ) но тут возник вопрос о распределении памяти под gdt, idt и системный код сделал так: addr len dscr 100000h 64kb gdt 101000h 64kb idt 102000h - system code тоесть входил в pm размещял эти структуры в памяти выше метра и продолжал работу уже с ними потом решил сделать страничную адресацию, так чтобы адрес 0 указывал на 100000h байт памяти и распределил память так: addr len dscr 100000h 4mb 1kb PDE & PTE 501000h 64kb gdt 511000h 64kb idt 521000h - system code заливаю PDE & PTE нужными значениями ставлю cr3 делаю gdt с виртуальными адресами ставлю бит pg в cr0 - релоад в чём может быть проблема ?
Без кода сказать что-то трудно. Уточню лишь: учтено ли, что CR3, PDE & PTE содержат физические адреса, а не линейные? Есть ли очищающий jmp после установки CR3? Обработчиков прерываний, как я понимаю, пока нет? При их наличии определить причину перезагрузки намного проще (чаще всего). Был ли код выполнен в Bochs? С помощью логов Bochs часто можно диагностировать причину проблемы. В общем, стоит выложить очищенный код, который вызывает перезагрузку, дальше видно будет.
http://rdi.mirgames.ru/tmp/code.7z нету ) Bochs выдаёт ошибку чтения, т.е. не хочет читать с флопаря перезагрузку вызывает mov cr0, eax где eax = cr0 or 80000000h
Прогнал код в Bochs. Перезагрузка происходит не на инструкции 'mov cr0, eax', а дальше, полсе дальнего прыжка 'jmp 0x20:0x0000000'. Пятый дескриптор имеет базу 0x420000. Это первый PDE, тридцать третий PTE. В cr3 лежит адрес 0x100000. Первый PDE имеет значение 0x00102003. Тридцать третий PTE имеет зачение 0x00408003. Значит, физический адрес после прыжка 'jmp 0x20:0x0000000' будет 0x00408000. По этому адресу располагается: Думаю, это явно не ваш код -- ошибка происходит при попытке считать значение по адресу, который лежит в еах. В общем, таблицы PDE/PTE построены некорректно.
Ещё один вропрос дабы кучу тем не разводить после установки бита PG в CR0, eip работает как виртуальный адрес или как физический ?
нет, но вот посматри )) http://rdi.mirgames.ru/tmp/code.7z после установки бита выполняеться нужный код мистика ?
EIP для защищенного режима (если конечно это не 64-разрядный longmode) содержит внутрисегментное смещение в кодовом сегменте. Во FLAT-модели внутрисегментное смещение и линейный адрес совпадают. Линейный адрес совпадает с физическим, когда пэйджинг отключен, а также когда трансляция виртуальных адресов в физические выполняется один в один, в противном случае не всегда.
Phantom_84 я это знаю поверь проблема в том что EIP будет в диапозоне от 600h до 105FFh и при трансляции не будет достигать памяти где у меня храниться нужный код, но это происходит
Если знаешь, то зачем спрашиваешь? Если у сегмента кода установлена подходящая база, то даже при небольших смещениях в EIP можно достичь любого участка памяти. Если бы процы работали как им вздумается, а не по строго определенным правилам, программеры всегда бы все свои ошибки сваливали на аппаратуру
Phantom_84 Код (Text): 00053339887i[CPU0 ] | SEG sltr(index|ti|rpl) base limit G D 00053339887i[CPU0 ] | CS:0008( 0001| 0| 0) 00000000 000fffff 1 1
Значит благодаря страничной переадресации физическая память с программным кодом отображается по "нужным" адресам. Я не смотрел твои исходники, а всего лишь ответил на один из прозвучавших вопросов...
Кстати в самом первом посте я не понял, почему в твоей карте памяти 64-килобайтная GDT занимает диапазон 100000h...101000h и нафиг для IDT отводить 64-килобайтный участок?
Phantom_84 да в первом посте в одном месте очепятка но заметь в коде этого нету зафиг отводить 64кб участки ? глупый вопрос, сам над ним подумай в том то и дело что такого быть не может EIP не привысит отметки в 4 mb 1kb
EIP здесь не причем, если включена страничная адресация т. е если база = 0, то любое значение EIP может отображаться на любой физический адрес
В том-то и дело, что тут разумное объяснение трудно придумать, поэтому я у тебя и спросил. См. сообщение rei3er'а. Кстати по поводу карты памяти могу дать один хороший совет. Для каталога страниц (термин PDE не совсем корректен, т.к. он обозначает лишь один элемент каталога страниц) вообще не нужно выделять отдельную страницу памяти. Его можно совместить с одной из страниц всей 4-мегабайтной таблицы страниц. Совмещать нужно с той страницей, которая отвечает за отображение таблицы страниц в виртуальное адресное пространство. Правда, это возможно, когда таблица страниц выровнена на 4-мегабайтную границу (в твоей карте памяти это не так).
Phantom_84 да стоило прочитать п. 5.10 про IDT я говорю что EIP выше 401000h не будет, а следовательно будет указывать куда-то в таблицы страниц, но выполняеться мой код вот я и не пойму почему такое происходит