Сейчас на форуме: jinoweb (+4 невидимых) |
eXeL@B —› Программирование —› Управление памятью без сервисов ОС |
Посл.ответ | Сообщение |
|
Создано: 06 июля 2019 12:39 · Личное сообщение · #1 Я когда-то на старом васме поднимал этот вопрос - ничего лучше, чем заюзать DMA тогда не предложили. Но DMA тоже не решение. Предлагаю рассмотреть следующий способ. Пусть наш код ринг-0 расположен в от n до n+x страницах адресного пространства. Физический адрес этих страниц мы, понятно, не знаем. Начнем в цикле менять IA32_APIC_BASE MSR, начиная с нуля, с шагом 4Кб. Напомню, что там хранится _физический_ адрес local APIC. При этом мы пытаемся записать и потом прочитать какое-то значение в страницу с адресом n+1 по любым зарезервированным local APIC адресам в пределах этой страницы. Если local APIC спроецирован на какую-то другую страницу, то чтение после записи вернет ожидаемое значение. Если local APIC спроецирован именно на эту страницу, что чтение дворда по зарезервированному адресу вернет 0xFFFFFFFF (или 0 - уже не помню). Как только это произошло, то мы узнали физический адрес этой страницы (он равен IA32_APIC_BASE). После чего уже можно в ней строить PDE, записать этот адрес в CR3 и таким образом поиметь полный контроль над памятью. Понятно, что здесь немало нюансов - кроме PDE нужны еще PTE (я для простоты сейчас говорю о простой двухуровневой модели страничного преобразования со страницами 4Кб), но это все решается по аналогичной схеме. Единственное, что меня смущает - что произойдет, когда в цикле local APIC спроецируется на страницу, где расположен текущий выполняемый код? Как показали мои опыты с SMM, при проецировании local APIC на SMRAM процессор берет код SMM-хэндлера из SMRAM, а не из регистров APIC, хотя данные читает и пишет все-таки в APIC. Так что с этим вроде бы все в порядке. Есть еще нюанс с кэшированием. Проекция local APIC на кэшируемую память и обращение к ней приводит к machine check error. Поэтому надо дизаблить кэширование в MTRR, что приводит к необходимости синхронизировать все описанные операции с другими ядрами. |
|
Создано: 06 июля 2019 16:11 · Личное сообщение · #2 |
|
Создано: 06 июля 2019 17:01 · Личное сообщение · #3 |
|
Создано: 06 июля 2019 17:12 · Личное сообщение · #4 |
|
Создано: 06 июля 2019 17:45 · Личное сообщение · #5 |
|
Создано: 07 июля 2019 01:37 · Личное сообщение · #6 |
|
Создано: 07 июля 2019 10:44 · Личное сообщение · #7 |
|
Создано: 07 июля 2019 11:06 · Личное сообщение · #8 |
|
Создано: 07 июля 2019 11:24 · Личное сообщение · #9 |
|
Создано: 07 июля 2019 11:49 · Поправил: spinz · Личное сообщение · #10 Похоже, что Инде не понимает сути страничной адресации. АП остается тем же, меняется отображение его на физпамять. Если, например, по каким-то причинам при прежней адресации ты не мог достучаться до какой-то физ.страницы (ее тупо нет в PTE), то сейчас ты сможешь рулить самостоятельно. Добавлено спустя 4 минуты Dr0p пишет: Зачем выделять новую память таким извращённым способом ? Авер теоретически может контролить вызов сервисов ОС. А тут он совсем мимо. И плюс - абсолютно независимо от ОС. Этот способ сработает хоть в лине, хоть в винде |
|
Создано: 07 июля 2019 12:08 · Поправил: cppasm · Личное сообщение · #11 spinz пишет: Похоже, что Инде не понимает сути страничной адресации. АП остается тем же, меняется отображение его на физпамять. И? А тот же код и данные которые были в старых физ.страницах в новых откуда возьмётся? Кроме твоего кода ещё 100500 потоков работает, и всё упадёт как только ты отображение сменишь. Чтобы это взлетело надо в новую таблицу страниц скопировать существующую, и потом её модифицировать. Вот и вопрос нафига копировать, почему текущую не поменять? |
|
Создано: 07 июля 2019 12:13 · Личное сообщение · #12 spinz > АП остается тем же, меняется отображение его на физпамять. Физ памятью рулит ОС, данные в памяти лишь частично и временно находятся, они перемещаются туда-сюда между свопом и рабочим набором. Какие физ страницы отображены на вирт адреса - это не имеет значения, этим занимается менеджер памяти ОС. Вся работа с ОС идёт через VA. > какой-то физ.страницы (ее тупо нет в PTE), то сейчас ты сможешь рулить самостоятельно. А откуда мне знать физические адреса^ Тоесть мне данные из диска достать самостоятельно, даже определив по PA для VA.. переписав пол ОС!? > Этот способ сработает хоть в лине, хоть в винде А в чём собственно способ" заключается ? Что то связанное с формированием нового АП(cr3). Но для чего, как и что ? |
|
Создано: 07 июля 2019 17:06 · Личное сообщение · #13 cppasm пишет: А тот же код и данные которые были в старых физ.страницах в новых откуда возьмётся? Ты *? от смены мапинга в физических страницах внезапно все пропадет? Иди маны читать, даже Инде в этом слегка шарит Добавлено спустя 0 минут Dr0p пишет: этим занимается менеджер памяти ОС ты бы хоть название треда прочел |
|
Создано: 07 июля 2019 20:18 · Личное сообщение · #14 spinz, курить надо меньше Процесс оперирует виртуальными адресами. Допустим код расположен в странице с VA VA_BASE которая замаплена на PA_BASE. Ты взял и сменил отображение для VA_BASE на другую физ. страницу - и чё? В старой физ. странице то код останется, только после смены отображения он никому нафиг не нужен. А в новой физ. странице на которую ты отобразил VA_BASE его нету. Всё рухнет. Так что маны иди сам кури, знаток. А с таким подходом удачи, будешь долго ответы ждать... |
|
Создано: 10 июля 2019 19:26 · Личное сообщение · #15 cppasm Не понятно ничего про идеи тс, но могу рассказать про свои подобные. Лет 5 назад было несколько подобных идей, реализовано ничего небыло(кроме ядерного монитора - side"). Я помню начальную задачу - планировалось расшарить общую память ядра на процессы и таким образом каждый ав процесс читал бы не общую системную, а локальную память, соответственно не видя патч ядра. Дальше там и прочие похожие попытки реализации были, я не помню подробности, но хорошо помню как парился с подгрузкой страниц. В конце концов это всё бсодило и ничего не вышло, наверно на старом васме были соотв. темы. Даже можно найти коменты в процессе реализации(записки по извратам): Code:
Локальный поиск у меня только то находит, я обычно сохранял бэкапы на внешний хард, но нет смысла искать - там сам чёрт ноги сломит". Какой то захват физической страницы через хитрый трюк. Но это всё дичайшие извраты, причём которые не удалось реализовать. При достаточном на то время знании механизмов ос. А тс говорит про подобные задачи, да и есчо в виде универсального решения.. это по мойму полный бред и вообще невозможно. Я вообще последнее время воспринимаю подобных ядерщиков" как не вполне адекватных людей. ----- vx |
|
Создано: 20 июля 2019 05:37 · Личное сообщение · #16 |
|
Создано: 20 июля 2019 16:05 · Личное сообщение · #17 |
|
Создано: 20 июля 2019 17:29 · Личное сообщение · #18 |
|
Создано: 21 июля 2019 02:19 · Поправил: difexacaw · Личное сообщение · #19 spinz > идро которой должно одинаково работать под линем и виндой например. Я ведь не просто так спросил пример, это в принципе невозможно, так как разные архитектуры. По этой причине ты не можешь пример привести. В общем же какие то абстрактные измышления, общее там только что касается железа, тоесть например адресная трансляция. Вот ты хочешь железки по этой причине использовать. Только забыл что железом рулит софт. Сам механизм той же трансляции по себе бесполезен, так как ядро разным способом им управляет на разных ос. ----- vx | Сообщение посчитали полезным: BlackCode |
|
Создано: 25 июля 2019 08:19 · Личное сообщение · #20 |
|
Создано: 25 июля 2019 12:57 · Личное сообщение · #21 |
|
Создано: 25 июля 2019 13:02 · Личное сообщение · #22 difexacaw пишет: Я ведь не просто так спросил пример, это в принципе невозможно, так как разные архитектуры Если зверюку загрузить до старта винды то уже пофиг трах*й память как хочешь но это невозможно так как сразу спалят ----- Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли. |
|
Создано: 26 июля 2019 15:40 · Личное сообщение · #23 difexacaw пишет: Я ведь не просто так спросил пример, это в принципе невозможно, так как разные архитектуры. Это вполне возможно. Ядро одно - плагины под архитектуры разные. Ядру отладчика не надо знать рядом с кокой ОС оно вертится. Достаточно реализовать поддержку отладочного фунционала - int1,3, брейки по ио, памяти и бранчам. Ну и независимое управление памятью - для той же трассировки по #PF |
|
Создано: 27 июля 2019 02:01 · Личное сообщение · #24 |
|
Создано: 27 июля 2019 12:18 · Личное сообщение · #25 |
|
Создано: 10 апреля 2020 09:28 · Личное сообщение · #26 |
eXeL@B —› Программирование —› Управление памятью без сервисов ОС |