Несколько вопросов начинающего

Тема в разделе "WASM.BEGINNERS", создана пользователем s3dworld, 6 окт 2010.

  1. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Вроде бы с созданием таблиц разобрался, но не понятно следующее: везде говорится про сегменты, сегменты...например: чтобы из кода на уровне PL3 вызвать код (процедуру) на уровне LP0, нужно использовать шлюз вызова (можно и подчинённый сегмент, но опять же сегмент, да и не очень мне этот способ понравился по описанию). Делаем CALL, указав сегмент и смещение (правда смещение игнорируется). Это всё понятно, но опять же - одни сегменты. А если я не хочу использовать сегменты (сделаю их там 2-4 на всю адресную память в 4 ГБ) и буду использовать страницы, то как же тогда мне передавать управление на код страницы через шлюз? Вообще мне не понятно как вообще использовать эти страницы. Как их составлять и для чего они нужны - это я понимаю. А как фактически их использовать на практике, то есть обращения и прочее...это я не понимаю. Да, в CR3 у меня будет лежать адрес каталога страниц, ну и что? А как мне обращаться к определённой странице. Да и ещё в них всего два уровня привилегий: супервизор (0, 1 и 2) и пользователь (3). Вот не понятно мне это всё.

    Если кому-то не трудно, объясните, пожалуйста!
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    s3dworld
    Сегментные регистры содержат селекторы, индексирующие дескриптор соответствующего сегмента. Из дескрипторной таблицы выбирается(точнее из теневой части селектора, но это не важно) виртуальный адрес сегмента, обращение происходит к этому сегменту плюс смещение. Адрес транслируется в физический, тоесть BPBR(Cr3) -> PDE -> PTE -> PAGE. Это очень обобщенно.
     
  3. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Вот я объявил два дескриптора (нулевой не будем сейчас учитывать): один для кода, другой - для данных. Оба дескриптора описывают 4 ГБ адресного пространства памяти. Далее я составляю таблицу страниц (1024 элемента по 4 байта, в каждом 1024 элемента по 4 байта - это мне 16 МБ памяти понадобится, ну разумеется всё я заполнять не буду). Загружаю в регистра CR3 адрес начала каталога страниц и включаю страничное преобразование. И как дальше получается? Я для данных всегда буду в DS хранить индекс 2-го дескриптора (0 - нулевой, 1 - код, 2 - данные), а на основании указанного смещения у меня уже будет выбираться определённая страница?

    То есть если у меня в PDE третий элемент, указывающий на каталог страниц...в свою очередь в нём PTE будет описывать адрес от 0x00A10000 и с размером 4096 байт, то когда я сделаю mov EAX,[DS:0x00A10005], то у меня пойдёт обращение к описанной выше странице? А если напишу mov EAX,[DS:0x00A10005]+4096, то к следующей странице?
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    s3dworld
    Не обязательно чтоб память была линейной. Физический адрес страницы определён в PTE/PDE.
    Смотрите в манах, там всё расписано, в частности Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3A, 3.6 и далее.
     
  5. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Понятно, значит мы ничего и не знаем об страничках. Всё это без нашего участия перенаправляется, мы лишь загружаем и выгружаем их (заполняем данными).

    А на практике лучше использовать странички по 4 КБ или по 2 МБ?
     
  6. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    В 64-битной архитектуре отказались от аппаратной мультизадачности, то есть значит ли это что там нет дескриптора TSS? То есть не нужно заполнять такое:

    [​IMG]

    Я всё это к чему: моя цель - программирование под x64. А если в x64 нет аппаратной многозадачности, то и не стоит мне её использовать в x86. Или аппаратная многозадачность - это что-то другое?
     
  7. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    В инструкции дальнего вызова/перехода указывается селектор шлюза. В дескрипторе шлюза указывается логический адрес обработчика, т.е. селектор сегмента кода (это будет один из плоских сегментов нулевого кольца) и смещение в этом сегменте, на которое будет передано управление уже с другим уровнем привилегий. Страницы тут ни при чём, они обеспечивают трансляцию линейного адреса в физический. Для плоской модели памяти смещение логического адреса, понятное дело, совпадает с линейным адресом.

    Насчёт размера страниц — по вкусу. Для 2 MiB страниц придётся освоить PAE, а четырёх(кило/мега)байтные можно есть и так.
     
  8. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    baldr
    То есть даже есть страницы по 4 МБ? А как же тогда заполняется каталог таблиц и каталог страниц? Ведь это уже не 1024 элемента.
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    s3dworld
    Маны, там все ответы. Или вам тут их цитировать.
     
  10. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Clerk
    Ну не дружу я с английским, иначе бы не регистрировался тут. Тем более я написал, у кого есть время, кому не жалко, тот чтобы помог. Это же не значит что вот все сразу чтобы бросились мне помогать. Вы не хотите, я Вас и не прошу.
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    s3dworld
    Раз не знаете английский, то и говорить неочем.)
     
  12. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Clerk
    Ну ё-моё. Я читаю книгу на русском. А что не понятно, вот и спрашиваю здесь.
     
  13. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Бит PDE.PS говорит о том, является ли физический адрес в этом дескрипторе адресом 4 MiB страницы (PS=1) или это ссылка на каталог страниц (PS=0).
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    s3dworld
    Интеловские маны на камень такие толстые, что можно вместо подушки их юзать. А вы хотите чтоб вам разжевали их содержимое в некольких предложениях. Имхо это невозможно.
     
  15. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    baldr
    Так от этого меняется количество элементов и в каталоге таблиц и в каталоге страниц?
     
  16. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    А всё, понял. То есть тогда получается каталог только первого уровня?
     
  17. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Нет. Просто биты 21…12 линейного адреса не проходят трансляцию через каталог страниц (его просто нет) а используются напрямую в смещении в 4 MiB странице вместе с битами 11…0.
     
  18. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    baldr
    Получается, что если странички занимают по 4 КБ, то делается двухуровневая таблица. Первый уровень - каталог таблиц, второй уровень - каталог страниц. А если использовать странички по 4 МБ, то у нас только одноуровневая таблица.

    А что касается многозадачности? Переключение задач, TSS и прочее - это всё уже устарело? В x64 этого же нет? А то я где-то читал что в x64 аппаратной многозадачности нет и все реализуют её программным способом. Так вот и думаю, тогда и не стоит мне её вообще изучать. Или я что-то не так понял?
     
  19. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Вопрос про многозадачность для меня всё ещё актуален.

    Вот ещё кое что:
    Нашёл в справочнике:
    [​IMG]

    Если честно, так и не понял. Если я пишу свой загрузчик и пользователь нажимает отмену, то как мне прервать выполнение своей программы и передать управление дальше BIOS'у, чтобы он продолжил искать загрузочный сектор уже на дальнейших устройствах из списка?
     
  20. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Погодь маленько, пороюсь у себя в голове. :derisive:

    Дык, если у BIOS (конкретно у обработчика int 0x19) не получилось загрузить бут-сектор, она вызывает int 0x18. Раньше при этом запускался Бэйсик из ПЗУ (чтобы уж совсем скучно не было), теперь BIOS распознаёт вызов int 0x18 из загрузчика как сигнал облома (и команду продолжить поиск загрузочного устройства, ибо Бэйсик почил в бозе). Есть ещё нюансы относительно наглых expansion ROM'ов на сетевых картах и SCSI-контроллерах, которые хватают int 0x18, но это уже специфика.

    Так что смело вызывай int 0x18, нехай загрузка идёт дальше. Для полного комфорта (в случае сменного носителя) можно спросить у юзера, хочет ли он сменить носитель и загрузиться с него, если нет — по рецепту.