проблема с paging, перезагруз при установке бита pg в чём проблема ?

Тема в разделе "WASM.OS.DEVEL", создана пользователем MegaI2, 30 сен 2007.

  1. MegaI2

    MegaI2 Евген

    Публикаций:
    0
    Регистрация:
    15 сен 2007
    Сообщения:
    17
    Адрес:
    Рязань
    Начит начал писать я что-то типа своей оси
    загрузчик, переход в 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 - релоад
    в чём может быть проблема ?
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Без кода сказать что-то трудно. Уточню лишь: учтено ли, что CR3, PDE & PTE содержат физические адреса, а не линейные? Есть ли очищающий jmp после установки CR3?

    Обработчиков прерываний, как я понимаю, пока нет? При их наличии определить причину перезагрузки намного проще (чаще всего). Был ли код выполнен в Bochs? С помощью логов Bochs часто можно диагностировать причину проблемы.

    В общем, стоит выложить очищенный код, который вызывает перезагрузку, дальше видно будет.
     
  3. MegaI2

    MegaI2 Евген

    Публикаций:
    0
    Регистрация:
    15 сен 2007
    Сообщения:
    17
    Адрес:
    Рязань
    http://rdi.mirgames.ru/tmp/code.7z

    нету )
    Bochs выдаёт ошибку чтения, т.е. не хочет читать с флопаря

    перезагрузку вызывает mov cr0, eax где eax = cr0 or 80000000h
     
  4. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Прогнал код в Bochs. Перезагрузка происходит не на инструкции 'mov cr0, eax', а дальше, полсе дальнего прыжка 'jmp 0x20:0x0000000'. Пятый дескриптор имеет базу 0x420000. Это первый PDE, тридцать третий PTE. В cr3 лежит адрес 0x100000. Первый PDE имеет значение 0x00102003. Тридцать третий PTE имеет зачение 0x00408003. Значит, физический адрес после прыжка 'jmp 0x20:0x0000000' будет 0x00408000. По этому адресу располагается:
    Думаю, это явно не ваш код -- ошибка происходит при попытке считать значение по адресу, который лежит в еах.

    В общем, таблицы PDE/PTE построены некорректно.
     
  5. MegaI2

    MegaI2 Евген

    Публикаций:
    0
    Регистрация:
    15 сен 2007
    Сообщения:
    17
    Адрес:
    Рязань
    точно не правильно расчитал базы сегментов и pte :)
    вот уже подправил работает )
    спасибо
     
  6. MegaI2

    MegaI2 Евген

    Публикаций:
    0
    Регистрация:
    15 сен 2007
    Сообщения:
    17
    Адрес:
    Рязань
    Ещё один вропрос дабы кучу тем не разводить :)

    после установки бита PG в CR0, eip работает как виртуальный адрес или как физический ?
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    а ты в винде наблюдал в ольке когдато физические адреса в EIP?
     
  8. MegaI2

    MegaI2 Евген

    Публикаций:
    0
    Регистрация:
    15 сен 2007
    Сообщения:
    17
    Адрес:
    Рязань
    нет, но вот посматри ))
    http://rdi.mirgames.ru/tmp/code.7z
    после установки бита выполняеться нужный код ;) мистика ?
     
  9. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    EIP для защищенного режима (если конечно это не 64-разрядный longmode) содержит внутрисегментное смещение в кодовом сегменте. Во FLAT-модели внутрисегментное смещение и линейный адрес совпадают. Линейный адрес совпадает с физическим, когда пэйджинг отключен, а также когда трансляция виртуальных адресов в физические выполняется один в один, в противном случае не всегда.
     
  10. MegaI2

    MegaI2 Евген

    Публикаций:
    0
    Регистрация:
    15 сен 2007
    Сообщения:
    17
    Адрес:
    Рязань
    Phantom_84
    я это знаю поверь ;)
    проблема в том что EIP будет в диапозоне от 600h до 105FFh и при трансляции не будет достигать памяти где у меня храниться нужный код, но это происходит
     
  11. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Если знаешь, то зачем спрашиваешь? Если у сегмента кода установлена подходящая база, то даже при небольших смещениях в EIP можно достичь любого участка памяти. Если бы процы работали как им вздумается, а не по строго определенным правилам, программеры всегда бы все свои ошибки сваливали на аппаратуру ;)
     
  12. MegaI2

    MegaI2 Евген

    Публикаций:
    0
    Регистрация:
    15 сен 2007
    Сообщения:
    17
    Адрес:
    Рязань
    Phantom_84
    Код (Text):
    1. 00053339887i[CPU0 ] | SEG sltr(index|ti|rpl)     base    limit G D
    2. 00053339887i[CPU0 ] |  CS:0008( 0001| 0|  0) 00000000 000fffff 1 1
     
  13. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Значит благодаря страничной переадресации физическая память с программным кодом отображается по "нужным" адресам. Я не смотрел твои исходники, а всего лишь ответил на один из прозвучавших вопросов...
     
  14. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Кстати в самом первом посте я не понял, почему в твоей карте памяти 64-килобайтная GDT занимает диапазон 100000h...101000h и нафиг для IDT отводить 64-килобайтный участок?
     
  15. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Если ты также внимательно пишешь код, как посты, то происходящая "мистика" вполне объяснима...
     
  16. MegaI2

    MegaI2 Евген

    Публикаций:
    0
    Регистрация:
    15 сен 2007
    Сообщения:
    17
    Адрес:
    Рязань
    Phantom_84
    да в первом посте в одном месте очепятка :)
    но заметь в коде этого нету
    зафиг отводить 64кб участки ? глупый вопрос, сам над ним подумай ;)

    в том то и дело что такого быть не может EIP не привысит отметки в 4 mb 1kb
     
  17. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    256 * 8 = 2K
    зачем 64K?
     
  18. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    EIP здесь не причем, если включена страничная адресация
    т. е если база = 0, то любое значение EIP может отображаться на любой физический адрес
     
  19. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    В том-то и дело, что тут разумное объяснение трудно придумать, поэтому я у тебя и спросил. См. сообщение rei3er'а.

    Кстати по поводу карты памяти могу дать один хороший совет. Для каталога страниц (термин PDE не совсем корректен, т.к. он обозначает лишь один элемент каталога страниц) вообще не нужно выделять отдельную страницу памяти. Его можно совместить с одной из страниц всей 4-мегабайтной таблицы страниц. Совмещать нужно с той страницей, которая отвечает за отображение таблицы страниц в виртуальное адресное пространство. Правда, это возможно, когда таблица страниц выровнена на 4-мегабайтную границу (в твоей карте памяти это не так).
     
  20. MegaI2

    MegaI2 Евген

    Публикаций:
    0
    Регистрация:
    15 сен 2007
    Сообщения:
    17
    Адрес:
    Рязань
    Phantom_84
    да стоило прочитать п. 5.10 про IDT :)
    я говорю что EIP выше 401000h не будет, а следовательно будет указывать куда-то в таблицы страниц, но выполняеться мой код вот я и не пойму почему такое происходит