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 存储在索引 iordered_list->list 中。但是,读取并打印确切位置 returns 0x0item 的最后一行是 0xE08000。我错过了什么?为什么 item 的值不存储在数组中?有什么建议吗?

我找出导致此问题的原因:

经过更多测试,显然内存区域0xe00000也无法写入。意识到这一点后,我仔细查看了分页代码,发现我在映射 1MB 以下的 ROM 专用区域时少了 1 页。这导致 0xe000000xe01000 被映射到该 read-only 区域末尾的最后一个物理页面 (0xff000)。

一旦我更正了分页代码(例如 <= 而不是 <),所有功能都按预期工作。