2015-12-08 2 views
-3

При создании физического распределителя памяти для записи ядра я пытаюсь создать массив из struct page_frame, где каждый член массива является представителем данного физического блока памяти 4 КБ.Динамическое создание массива в физической памяти

Physical to Virtual Mapping and Area for new Array

В настоящее время ядро ​​загружается в физическую память от адреса 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]? Или есть лучший способ создать такой массив?

+0

Не знаю, почему этот вопрос в настоящее время вниз проголосовали. Если есть область, где она может быть улучшена, и вы голосуете, прокомментируйте это. – sreisman

+0

Что на самом деле не работает как необходимо_ в вашем примере кода? Пожалуйста, уточните, каков ожидаемый результат и каков текущий результат. Также добавьте объявление 'memBlocks'. –

ответ

1

Помните, что в C массив из struct frame очень похож на указатель на struct frame. Простая вещь, которую нужно сделать, по крайней мере, если вы понимаете арифметику указателей на C, это просто использовать указатель на начало «массива».

Учитывая struct frame *memBlocks вы можете получить доступ к блок-ю, как memBlocks + i

+0

Вы также можете получить к нему доступ как memBlocks [i]. – stark

+0

Спасибо, вот как я пытался это сделать, однако после создания всех моих структур и перехода с помощью отладчика ни один из них не был инициализирован. Я не уверен, что они оптимизированы компилятором или проблема связана с моим кодом. – sreisman

Смежные вопросы