Собственно, вопрос содержится в заголовке темы. Режим адресации - страничный, у каждой задачи - свой контекст и свое 4Гб виртуальное адресное пространство.. Как добраться из ядра в Ring0 к данным задач, кроме как ручным чтением контекстов задач (содержимое cr3)-> каталогов/таблиц страниц каждой задачи? Или это единственный вариант? Thanks
Думаю, что контекст разбирать не придется -- при переходе в режим ядра содержимое CR3 не меняется, поэтому можно смело писать по виртуальному адресу, переданному самим приложением. А если речь вообще идет о своей ОС, то, конечно, надо не забыть проверить параметр на принадлежность пользовательскому адресному пространству.
Если у тебя ядро сделанно отдельным процессом то да именно так. Можно установить cr3. А вообще скорее всего ядро выполняется в контексте текущей задачи. Собственно тут тогда должно быть разграниечение где ядро, а где код/данные программы. Для удобства установить 4ГБ придел чтобы флат был. И никаких проблем с доступом нет.
Да, у меня ядро - отдельный процесс. Если не трудно, подскажите, как заставить ядро выполняться в контексте задачи. Насколько я понимаю, нужно на страницы каждого процесса сделать ссылки в таблице страниц ядра? Или как-то по-другому?
И если можно, расскажите, какие проблемы могут возникнуть из-за несоответствия уровней привилегий ядра и приложения
верхние N элементов PDT (PDPT для PAE, PML4T для IA-32e) должны быть одинаковы для каждого процесса (отображать физические страницы ядра) N зависит от размера адресного пространства ядра в смысле?
зачем? наоборот - как уже сказали, у каждого процесса сделать одинаковые ссылки на ядро. Тогда чтобы переаттачиться надо будет просто перезагрузить CR3, поскольку код ядра окажется в новом виртуальном адресном пространстве спроецированным по тем же виртуальным адресам. Так делает Windows (а переключение там по KeStackAttachProcess идет, посмотри исходники, если интересно. правда код весьма тупой - все сводится в конечном счете к MOV CR3, EAX =))
Простите за возможно глупый вопрос, но я правильно понял? В адр. простр. ядра есть области, на которые проектируется часть АП задачи #1, часть задачи#2 (эти части и нужно изменять из ring0)? Но ведь так получится широковещательная рассылка. Или нет?
нет АП любого процесса состоит из 2-х частей: ядерной и пользовательской пользовательская часть уникальна для каждого процесса (совместно-используемую память не рассматриваем) ядерная часть является общей по значениям элементов PDT (PDPT, PML4T), но уникальной по физическому расположению PDT (PDPT, PML4T) ps. кстати, получается, что при отображении через PDT (PDPT, PML4T) страницы на АП ядра необходим захват глобальной блокировки и модификация всех PDT (PDPT, PML4T) всех процессов?
Почему уникальной по расположению? Зачем держать много копий одного адресного пространства ядра. Достаточно одной копии каждой из двух таблиц PDT, на которую будут ссылаться последние два PDPE каждого процесса.
Никак не могу понять, каким образом удастся передать данные определенному пользовательскому приложению. Всем одновременно - да, ядро пишет что-то в отображаемую область, а каждый из процессов читает ее (не знаю, правда, что там с уровнями привилегий - ведь Ring3 не подпускают обычно к данным страниц с Ring0). И видимо я безнадежно отстал от жизни . Что такое pml4t? Из всех таблиц, что я знаю, page directory, Page table и собственно страницы. Ну, в x64 добавили еще одну таблицу. А остальные тогда для чего?
в режиме PAE есть еще Page Directory Pointer Table (PDPT). Брр.. Смотри, ты выполняешься в режиме ядра в контексте произвольного процесса и хочешь записать что-то в память процесса P. Ты аттачишься к процессу P сменой текущего адресного пространства, далее, поскольку все процессы имеют проекцию страниц ядра у себя по тем же виртуальным адресам, то ты спокойно продолжаешь выполняться в режиме ядра, но уже у процесса P. Далее ты просто делаешь memcpy() в буффер пользовательскоо режима этого процесса. Потом деаттачишься обратно. Что неясного-то?
rei3er А ну мы про разные таблицы говорили) Верхняя самая таблица (PDPT или PDT) действительно уникальна, иначе и быть не может. Но они могут ссылаться на одинаковые таблицы страниц Собственно так и стоит сделать автору. А проще включить PAE - тогда надо будет составить PDPT, в которой последние два PDPE сделать ссылающимися на одни и те же PDT. И все будет шикарно