我正在开发一个操作系统。我目前正在研究内存管理。我有一个 struct
来模拟有序的指针列表:
typedef struct
{
void* *list;
uint32_t size;
uint32_t max_size;
lessthan_predicate_t less_than;
} ordered_list_t;
我有一个函数可以在有序列表中的正确位置插入一些内容:
void insert_ordered_list(void* item, ordered_list_t *ordered_list)
{
uint32_t i=0;
while (i < ordered_list->size && ordered_list->less_than(ordered_list->list[i], item))
{
i++;
}
if (i == ordered_list->size)
{
// just add it to the end of the list
ordered_list->list[i] = item;
fb_printf("We got passed: %h", item); <=== Returns 0xe08000
fb_printf("We stored: %h", ordered_list->list[i]); <=== Returns 0x0
此函数放置有序列表:
ordered_list_t place_ordered_list(void *addr, uint32_t max_size, lessthan_predicate_t less_than)
{
ordered_list_t to_ret;
to_ret.list = (void*)addr;
memset(to_ret.list, 0, max_size*sizeof(type_t));
to_ret.size = 0;
to_ret.max_size = max_size;
to_ret.less_than = less_than;
return to_ret;
}
我的列表初始化如下:
heap->index = place_ordered_list((void*)start, HEAP_INDEX_SIZE, &address_less_than);
第一个项目 header
然后被插入列表,如下所示:
insert_ordered_list((void*)header, &heap->index);
我将 item
存储在 ordered_list->list
的索引 i
处。但是,读取并打印该确切位置的最后一行返回 0x0
,而 item
为 0xE08000
。我缺少什么?为什么 item
的值没有存储在数组中?有什么建议吗?
最佳答案
我找出了导致此问题的原因:
经过更多测试,很明显内存区域 0xe00000 也无法写入。当我意识到这一点后,我仔细查看了分页代码,发现我在映射 1MB 以下的仅 ROM 区域时少了 1 页。这导致0xe00000
至0xe01000
映射到该只读区域末尾的最后一个物理页 ( 0xff000
)。
一旦我更正了分页代码(例如 <=
而不是 <
),所有功能都按预期工作。
关于c - C 中的指针和有序列表问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34711698/