cr PDE PTE

Тема в разделе "WASM.OS.DEVEL", создана пользователем 0136, 14 дек 2008.

  1. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    Привет, делаю код для создания тождественной таблицы преобразования, но он почему то виснет. Картина такая -
    есть битовый массив, установленый бит в массиве говорит о том что страницу можно юзать, полная физическая база массива в регистре edi;
    есть последний установленый бит в битовом массиве, он находится в edx;
    в eax стартовое значение страницы памяти из массива битов, которое будет проверяться - можно ли в нём создать PTE таблицу;
    в ebx смещение для битового массива для создания PTE
    и есть база PDE каталога в еsi.
    Ко всем этим данным обращаюсь через дескриптор с базой 0 и лимитом максимальным.
    Вот этот код (ещё на всякий случай дополнительно креплю весь исходник):

    cr_PDE_PTE:
    ; создание тождественной таблицы преобразования
    xor ebx, ebx ; начальное смещение в битовом массиве
    mov eax, 110h ; первая страница для поиска элемента PTE (стартовая)
    cr_t:
    cmp eax, edx ; страница больше максимальной страницы?
    ja yes_maks_page ; переход если больше (если больше максимальной страницы)

    bt es:[edi], eax ; проверим, можно ли использовать страницу для таблицы PTE?

    jc page_ok ; переход, если страницу можно использовать под таблицу PTE
    inc eax ; поиск следующей страницы для таблицы PTE
    jmp cr_t
    page_ok: ; страница подходит для таблицы PTE
    bts es:[edi], eax ; установим бит в массиве битов, так как страницу больше нельзя использовать, потому что страница будет таблицей PTE
    mov ebp, eax ; сохраним
    shl eax, 12 ; создадим физ адр страницы
    ; AVL 00 D A 00 U R P
    or ax, 0000000000000011b ; установим биты для PDE элемента
    mov es:[esi], eax ; передадим в таблицу PDE её элемент (физ адрес и биты AVL 00 D A 00 U R P таблицы PTE)
    and ax, 1111111111111100b ; обнулим биты и это будет физ адр таблицы PTE
    mov ecx, 1024 ; организуем цикл в 1024 раза для создания таблицы PTE
    cr_t_PTE:
    cmp ebx, edx ; максимальная страница?
    ja yes_maks_page ; переход если больше (если страница больше максимальной)
    bt es:[edi], ebx ; проверить байт в битовом массиве
    jc page_os ; переход, для настройки страницы доступной ос (которую можно юзать)
    shl ebx, 12 ; создать физ адр страницы
    ; AVL 00 D A 00 U R P
    or bx, 0000001000000011b ; установить биты элемента PTE не доступного для ос (страницу которую нельзя юзать, бит 9=1)
    wr_PTE:
    mov es:[eax], ebx ; передать элемент PTE в таблицу PTE (база сегментного регистра должна быть 0)
    shr ebx, 12 ; преобразовать для дальнейшего использования в качестве смещения в битовом массиве
    inc ebx ; следующая страница
    add eax, 4 ; следующий элемент таблицы PTE
    ; цикл, пока не встретиться страница больше максимальной или пока не заполнится таблица PTE (1024 элемента)
    loop cr_t_PTE

    add esi, 4 ; следующий элемент в таблице PDE
    mov eax, ebp ; поиск в битовом массиве следующей страницы для таблицы PTE
    inc eax
    jmp cr_t
    page_os:
    shl ebx, 12 ; создать физ адр страницы
    ; AVL 00 D A 00 U R P
    or bx, 0000000000000011b ; установить биты элемента PTE доступного для ос (страницу которую можно юзать, бит 9=0)
    jmp wr_PTE
    yes_maks_page:

    Без этого кода всё работает, подскажите пожалуйста ошибку.
     
  2. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    Привет всем ещё раз! Мне нашли две ошибки (add eax, 32 ; следующий элемент таблицы PTE - нужно +4, и тоже самое с add esi, 32 ; следующий элемент в таблице PDE - нужно +4) но обнаружились другие, такие как виснет при выходе в дос, а также ребутится если задать стартовую страницу 110h (это было сделано с целью не разрушать нимемсис). В посте выше исправил ошибки те что обнаружены, может кто то ещё подскажет? А также файлы заменил, теперь код ребутиться, в коде стартовая страница 110h
     
  3. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    Привет всем, сразу благодарю за помощь Садко! Выше приведённый код по созданию тождественной таблицы преобразования работоспособен, но в бою ещё не проверен. Комп ребутиться потому что разрушаются структуры дос, поэтому нужно запускать в чистом досе, что бы никто не юзал верхнюю память, попробывал на чистом дос 6.22 - всё работает. Ну и всем кто обратил внимание - большое спасибо.
     
  4. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    Ещё раз всем привет! Обнаружил ещё один прикол, код работает, вернее выходит в дос нормально если загружен химем сис, а без него виснет где то на моv ax, 4c00h int 21h !!! А с химем сис всё ок! Кто знает в чём дело?
     
  5. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    и в чистом досе без химем сис всё работает! Тема закрыта (а неплохо я тут сам с собой поговорил).
     
  6. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Plz call me SadKo, not Садко.