Невозможно присвоить значения указателю структуры после того, как указатель был успешно назначен - PullRequest
0 голосов
/ 06 октября 2019

Я пишу раннюю кучу ядра, чтобы управлять некоторыми выделениями памяти до того, как последняя куча заработает. Когда я назначаю адрес (не используемый ничем иным) для моего указателя структуры, он работает, проблема возникает, когда я пытаюсь присвоить значения членам структуры.

Прежде чем ответить, помните, что я неУ меня есть какая-нибудь библиотека C, которую я могу использовать. Отладка была выполнена с помощью QEMU и gdb через remote.

//The struct
typedef struct mem_block{
    mblock_t *prev;
    boolean used;
    size_t size;
    mblock_t *next;
} mblock_t;

//The file-local pointer(before its init)
mblock_t *eheap=NULL;


//Function that assigns the values
mblock_t *init_early_heap(address_t start, size_t size){
    if(eheap==NULL){
        if(size < sizeof(mblock_t)){
            PANIC("Available memory below EHEAP requirement");
        }
        eheap = (mblock_t*)HEAP_START_ADDRESS;
        eheap->prev = NULL;
        eheap->next = NULL;
        eheap->size = (size_t)(size - sizeof(mblock_t));
        eheap->used = false;
        print("\nCreated Early Heap at ");
        print_hex_long(eheap);
        print("\nSize in bytes: ");
        print(itos(eheap->size));NL;
    }
    return eheap;
}

После возврата функции я получаю указатель, указывающий на адрес 0xC0000000 и нетронутые члены, так как eheap-> size равен 0 (параметр размера в функции НЕ является0).

1 Ответ

0 голосов
/ 06 октября 2019

Обнаружена проблема: Невозможно прочитать все адресное пространство (включен A20) в QEMU, работает правильно с немного более низкими адресами. Код C выше верен, теперь проблема остается с QEMU / GRUB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...