у меня в момент инициализации vmm передается mmap, из которого выделяются регионы, каждый регион инициализирует как раз pmm, но pmm’у нужен битмап, а в момент инициализации pmm никакого kmalloc’а нет? Сделать какой-то prekmalloc на маленьком регионе в начале?
А зачем тебе "prekmalloc"?
по идее у тебя не будет посреди работы добавляться память
а у тебя вводные то какие?
Просто забери кусок памяти из первичной мемори мапы
что значит первичная мемори мапа?
Вводные? Ну 32-битное ядро
А есть какое-то общепринятое название для таких первичных аллокаторов, которые более не будут использоваться после инициализации vmm?
а кроме этого? включен ли mmu, если да, то как предлагается мапить страницы в твоей конфигурации
Ну то что тебе груб даёт или кто-то
Не-а, просто отгрызаешь кусок доступной памяти и всё.
Как раз в моменте включения mmu, беру мапа от граба, ищу регионы(мержу, если надо), отделяю регионы на ядровые и неядровые(ядровые находятся в 1 МБ после имаджа ядра), мапплю страницы в верхние адреса потом. Собственно, для отслеживания физических страниц в регионе нужна битмапа(при чем она может увеличиваться)
Спасибо, думаю просто статически выделю еще один МБ после имаджа кернела
у меня немного другая проблема mmu уже включен, и мне надо инициализировать алокатор, из доступного это рекурсивная таблица страниц и карта физ памяти
А для чего использовать рекурсивную таблицу? Чтоб, если не хватит места в таблице, использовать следующую?
так удобнее таблицей страниц управлять
А можете поподробнее рассказать? Я прочитал, но не совсем понял, как то, что последняя таблица будет указывать на первую поможет с управлением таблицей страниц
смысл в том, чтобы последняя запись в самом верхнем каталоге страниц (тот на который cr3 ссылается) указывала на этот же каталог (т.е. туда записывается тот же адрес, что и в cr3), в результате имеем, что память соответствующая этому каталогу, становится видна как непрерывная таблица страниц, правда, с некоторыми оговорками
Т.е. становится циклической? И если кто-то захочет замаппить страницу на адрес, который pte[1028], то, фактически, это будет pte[3](Исходя из того, что размер таблицы 1024 страницы)?
это сложно объяснить, это нужно попытаться понять
вот тебе поясняющая картинка, предположим, что каждая страница вмещает 4 записи по 1 байту каждая, цифрами обозначены адреса, которыми управляют записи, физические страницы обозначены буквами, несложно заметить, что страница A нарисована дважды, она так нарисована для удобства восприятия, нужно просто помнить, что это одна и та же страница
теперь подумай, что будет при обращении по адресу 60?
Обращение по адресу B?
а точнее?
да, только не по адресу, а к странице B
и что конкретно мы на ней увидим?
Не совсем понимаю, честно говоря. То, что находится на странице В. Т.е. мы пошли по циклу. Т.е. адрес 60 = 48, 64 = 52, и т.д. Так?
смотри по картинке, у тебя есть числа - виртуальные адреса и буквы обозначающие страницу, диапазоны чисел мапятся в страницы, но не в другие адреса
увидим, действительно то что находится на странице B
А, т.е. в рамках одной page directory, вся последняя таблица указывает на начало каждой из таблиц в pd
Обсуждают сегодня