Вроде бы с созданием таблиц разобрался, но не понятно следующее: везде говорится про сегменты, сегменты...например: чтобы из кода на уровне PL3 вызвать код (процедуру) на уровне LP0, нужно использовать шлюз вызова (можно и подчинённый сегмент, но опять же сегмент, да и не очень мне этот способ понравился по описанию). Делаем CALL, указав сегмент и смещение (правда смещение игнорируется). Это всё понятно, но опять же - одни сегменты. А если я не хочу использовать сегменты (сделаю их там 2-4 на всю адресную память в 4 ГБ) и буду использовать страницы, то как же тогда мне передавать управление на код страницы через шлюз? Вообще мне не понятно как вообще использовать эти страницы. Как их составлять и для чего они нужны - это я понимаю. А как фактически их использовать на практике, то есть обращения и прочее...это я не понимаю. Да, в CR3 у меня будет лежать адрес каталога страниц, ну и что? А как мне обращаться к определённой странице. Да и ещё в них всего два уровня привилегий: супервизор (0, 1 и 2) и пользователь (3). Вот не понятно мне это всё. Если кому-то не трудно, объясните, пожалуйста!
s3dworld Сегментные регистры содержат селекторы, индексирующие дескриптор соответствующего сегмента. Из дескрипторной таблицы выбирается(точнее из теневой части селектора, но это не важно) виртуальный адрес сегмента, обращение происходит к этому сегменту плюс смещение. Адрес транслируется в физический, тоесть BPBR(Cr3) -> PDE -> PTE -> PAGE. Это очень обобщенно.
Вот я объявил два дескриптора (нулевой не будем сейчас учитывать): один для кода, другой - для данных. Оба дескриптора описывают 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, то к следующей странице?
s3dworld Не обязательно чтоб память была линейной. Физический адрес страницы определён в PTE/PDE. Смотрите в манах, там всё расписано, в частности Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3A, 3.6 и далее.
Понятно, значит мы ничего и не знаем об страничках. Всё это без нашего участия перенаправляется, мы лишь загружаем и выгружаем их (заполняем данными). А на практике лучше использовать странички по 4 КБ или по 2 МБ?
В 64-битной архитектуре отказались от аппаратной мультизадачности, то есть значит ли это что там нет дескриптора TSS? То есть не нужно заполнять такое: Я всё это к чему: моя цель - программирование под x64. А если в x64 нет аппаратной многозадачности, то и не стоит мне её использовать в x86. Или аппаратная многозадачность - это что-то другое?
В инструкции дальнего вызова/перехода указывается селектор шлюза. В дескрипторе шлюза указывается логический адрес обработчика, т.е. селектор сегмента кода (это будет один из плоских сегментов нулевого кольца) и смещение в этом сегменте, на которое будет передано управление уже с другим уровнем привилегий. Страницы тут ни при чём, они обеспечивают трансляцию линейного адреса в физический. Для плоской модели памяти смещение логического адреса, понятное дело, совпадает с линейным адресом. Насчёт размера страниц — по вкусу. Для 2 MiB страниц придётся освоить PAE, а четырёх(кило/мега)байтные можно есть и так.
baldr То есть даже есть страницы по 4 МБ? А как же тогда заполняется каталог таблиц и каталог страниц? Ведь это уже не 1024 элемента.
Clerk Ну не дружу я с английским, иначе бы не регистрировался тут. Тем более я написал, у кого есть время, кому не жалко, тот чтобы помог. Это же не значит что вот все сразу чтобы бросились мне помогать. Вы не хотите, я Вас и не прошу.
Бит PDE.PS говорит о том, является ли физический адрес в этом дескрипторе адресом 4 MiB страницы (PS=1) или это ссылка на каталог страниц (PS=0).
s3dworld Интеловские маны на камень такие толстые, что можно вместо подушки их юзать. А вы хотите чтоб вам разжевали их содержимое в некольких предложениях. Имхо это невозможно.
Нет. Просто биты 21…12 линейного адреса не проходят трансляцию через каталог страниц (его просто нет) а используются напрямую в смещении в 4 MiB странице вместе с битами 11…0.
baldr Получается, что если странички занимают по 4 КБ, то делается двухуровневая таблица. Первый уровень - каталог таблиц, второй уровень - каталог страниц. А если использовать странички по 4 МБ, то у нас только одноуровневая таблица. А что касается многозадачности? Переключение задач, TSS и прочее - это всё уже устарело? В x64 этого же нет? А то я где-то читал что в x64 аппаратной многозадачности нет и все реализуют её программным способом. Так вот и думаю, тогда и не стоит мне её вообще изучать. Или я что-то не так понял?
Вопрос про многозадачность для меня всё ещё актуален. Вот ещё кое что: Нашёл в справочнике: Если честно, так и не понял. Если я пишу свой загрузчик и пользователь нажимает отмену, то как мне прервать выполнение своей программы и передать управление дальше BIOS'у, чтобы он продолжил искать загрузочный сектор уже на дальнейших устройствах из списка?
Погодь маленько, пороюсь у себя в голове. Дык, если у BIOS (конкретно у обработчика int 0x19) не получилось загрузить бут-сектор, она вызывает int 0x18. Раньше при этом запускался Бэйсик из ПЗУ (чтобы уж совсем скучно не было), теперь BIOS распознаёт вызов int 0x18 из загрузчика как сигнал облома (и команду продолжить поиск загрузочного устройства, ибо Бэйсик почил в бозе). Есть ещё нюансы относительно наглых expansion ROM'ов на сетевых картах и SCSI-контроллерах, которые хватают int 0x18, но это уже специфика. Так что смело вызывай int 0x18, нехай загрузка идёт дальше. Для полного комфорта (в случае сменного носителя) можно спросить у юзера, хочет ли он сменить носитель и загрузиться с него, если нет — по рецепту.