s3dworld писал(а):
Я тоже подумал про то, что 4 МБ будет очень много (просто попусту буду память не использовать). 4 КБ в самый раз, однако больше заполнять (ведь тогда нужно делать табличку двухуровневую).
Я тебе больше скажу. В длинном режиме "нужно делать табличку" четырехуровневую: PML4, PageDirTabs, PageDirs, PageTabs.
Цитата:
Пускай там длины нет (я про регистр CR3), но ведь я же не обязан заполнять в таблице каталога таблиц все 1024 элемента. И ведь не обязан в таблице страниц заполнять все 1024 элемента. Ведь если программа обратится к индексу, который не существует, то вызовется исключение (не знаю какое, но вроде бы общей защиты). Так ведь?
Так. Только длина от этого не перестает быть равной 1024-м. Исключение #PF (пэйдж фолт).
Цитата:
Хотя как вариант, заполнить все 1024 элемента в таблице первого уровня и в каждой такой таблице по 1024 элемента, с той разницей, что все не нужные пока для меня элементы будут ссылаться на одну и туже физическую область памяти ОЗУ в 4 КБ.
Предыдущий вариант значительно лучше.
Цитата:
1. Современные операционные системы (3-е издание);
Дай ссылку на 3-е издание (у меня 2-е). Какой формат?
Цитата:
Адреса в диапазоне 0xFFC00000 - 0xFFFFFFFF у меня будут отведены под код ядра ОС. В этом диапазоне лежит 4194304 байта (4096 КБ, 4 МБ). То есть в CR3 попадёт такой адрес таблицы описания страничек, где в таблице первого уровня под индексом 0 будет указан адрес таблицы, где будут описаны 1024 элемента, как раз указывающие на диапазон 0xFFC00000 - 0xFFFFFFFF.
Последние 4 мега. Последний вход каталога. Разве что только для кода ядра. Для таблиц ядра и для большого количества подгружаемых драйверов не хватит. Я делаю сборки с 1- и 2-гигабайтной областью ядра. Кстати в последнем входе у меня циклическая ссылка на каталог, поэтому последние 4 мега занимает таблица страниц.
Цитата:
Когда код ядра ОС сделает своё чёрное дело, он передаёт управление программе пользователя, но до этого кое что сделав. Сначала он определяет в какую область физических адресов (страничного кадра) нужно будет засунуть код программы. На основании этих данных он строит таблицу страниц для регистра CR3. Вот он по определённым адресам скопировал код и данные программы пользователя. В таблице каталога таблиц под индексом 1023 будет идти указатель на таблицу страниц, где будет описан диапазон 0xFFC00000 - 0xFFFFFFFF (то есть код ядра ОС). И теперь ядро ОС записывает в CR3 адрес таблицы каталога страниц для текущей программы и передаёт управление по адресу 0x00000000 (Каталог 0, таблица 0, смещение 0), и программа уже выполняется.
Чтобы управлять пэйджингом, таблицы страниц также нужно отображать в вирт. адр. пространство.
Цитата:
Ну что-то типа такого. Хотя это только первая задумка, которую стоит перенести на листок бумаги и просмотреть все нюансы: что, куда, откуда и зачем. Я вот не знаю, правильной ли практикой является для каждой задачи изменять CR3 (то есть подстраивать каталог для каждой задачи). Разумеется для задачи может понадобиться всего 2 странички, поэтому чтобы ядро ОС анализировало служебную информацию в исполняемом файле программы и на основании этого составляло для программы верную таблицу каталога таблиц. В общем как-то так или я вообще не в ту сторону плясать начал?
Каталоги будут разные, но уже начиная со второго уровня глобальные фрагменты можно не дублировать.
Цитата:
Про таблицу прерываний я не беспокоюсь, её адрес будет храниться в регистре IDTR (ведь этот адрес не участвует в преобразовании, он ведь и так является физическим).
Он не является физическим.