C 中的问题指针和有序列表
Problems pointers and ordered lists in C
我正在研究操作系统。我目前正在研究内存管理。我有一个 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
存储在索引 i
的 ordered_list->list
中。但是,读取并打印确切位置 returns 0x0
而 item
的最后一行是 0xE08000
。我错过了什么?为什么 item
的值不存储在数组中?有什么建议吗?
我找出导致此问题的原因:
经过更多测试,显然内存区域0xe00000也无法写入。意识到这一点后,我仔细查看了分页代码,发现我在映射 1MB 以下的 ROM 专用区域时少了 1 页。这导致 0xe00000
到 0xe01000
被映射到该 read-only 区域末尾的最后一个物理页面 (0xff000
)。
一旦我更正了分页代码(例如 <=
而不是 <
),所有功能都按预期工作。
我正在研究操作系统。我目前正在研究内存管理。我有一个 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
存储在索引 i
的 ordered_list->list
中。但是,读取并打印确切位置 returns 0x0
而 item
的最后一行是 0xE08000
。我错过了什么?为什么 item
的值不存储在数组中?有什么建议吗?
我找出导致此问题的原因:
经过更多测试,显然内存区域0xe00000也无法写入。意识到这一点后,我仔细查看了分页代码,发现我在映射 1MB 以下的 ROM 专用区域时少了 1 页。这导致 0xe00000
到 0xe01000
被映射到该 read-only 区域末尾的最后一个物理页面 (0xff000
)。
一旦我更正了分页代码(例如 <=
而不是 <
),所有功能都按预期工作。