c - C 中的指针和有序列表问题

标签 c pointers osdev

我正在开发一个操作系统。我目前正在研究内存管理。我有一个 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,而 item0xE08000。我缺少什么?为什么 item 的值没有存储在数组中?有什么建议吗?

最佳答案

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

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

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

关于c - C 中的指针和有序列表问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34711698/

相关文章:

c - 如何克服错误代码-11 cl_build_program_failure

c - 什么时候在 C 语言中使用 ntohs 和 ntohl?

c - 将文本文件读入 2 个单独的字符数组(在 C 中)

objective-c - 初始化一个对象,然后将其存储到 NSArray 中。这会泄漏吗?

rust - 我如何从 Rust 调用原始地址?

assembly - 简单内核无法在 GRUB 中启动

c - x86-64 内核在设置 IDT 时崩溃

c++ - 为什么这个程序的输出在 C 和 C++ 之间不同?

c - 关于 malloc 代码中使用的类型和变量的说明

c - 7.2。Record结构中的程序存在编译器错误