При создании физического распределителя памяти для записи ядра я пытаюсь создать массив из struct page_frame
, где каждый член массива является представителем данного физического блока памяти 4 КБ.Динамическое создание массива в физической памяти
В настоящее время ядро загружается в физическую память от адреса 0x000000000
к physfree
Остальные блоки из physfree
в physEnd
свободные блоки. Я хотел бы создать свой struct page_frame
массив сразу после physfree
и поддерживать элемент в массиве для каждого блока в памяти от 0
до physEnd
Количество индексов в этом массиве должен быть таким образом physEnd/4096
. Проблема в том, что physEnd неизвестно до выполнения, поэтому я не уверен, как динамически распределять такой массив. В настоящее время следующее не заполняет массив struct page_frame
, потому что только первый элемент, memBlocks[1]
отображается как правильный struct page_frame
, а остальные не инициализируются должным образом.
struct page_frame* memBlocks;
memBlocks = (struct page_frame*)kernbase + physfree;
int count = 0;
for(char* i = (char*) 0; i < (char*) ALIGNUP(physEnd)-PAGESIZE; i+=PAGESIZE)
{
//The new page frame to be placed in array
struct page_frame insert;
insert.used = 1;
memBlocks[count] = insert;
count++;
}
Как динамически создать такой массив по адресу, указанным на верхней части моего ядра, так что я могу следить за свои свободные физические блоки? Я пытаюсь использовать указатель на структуры, называемый memBlocks
, и установить его в адрес сразу после kernbase + physfree
в памяти (так как виртуальная память в данный момент включена). Затем я хотел бы, чтобы каждый элемент массива принимал только sizeof(struct page_frame)
. Я обращаюсь к элементам memBlocks
правильно, индексируя их как memBlocks[i]
? Или есть лучший способ создать такой массив?
Не знаю, почему этот вопрос в настоящее время вниз проголосовали. Если есть область, где она может быть улучшена, и вы голосуете, прокомментируйте это. – sreisman
Что на самом деле не работает как необходимо_ в вашем примере кода? Пожалуйста, уточните, каков ожидаемый результат и каков текущий результат. Также добавьте объявление 'memBlocks'. –