0

我正在尝试(m)将以下地址映射到虚拟地址空间:

---物理地址为 0xf6c50 --- 该地址是 EBDA 基本指针和高级 Bios 内存窗口 (ACPI_HI_RSDP_WINDOW_BASE) 的总和

目的是将 ACPI 表映射到进程的地址空间并在以后使用。

    acpi_mem_fd = open("/dev/mem", O_RDONLY);

我打开一个文件描述符来读取“/ dev / mem”。我使用pread到达地址并读取ACPI头结构,一旦签名匹配我希望将它映射到虚拟地址空间,但是当我这样做时我得到一个错误比如:“无法分配内存”

我正在使用 FreeBSD 8.x 。我可以确认通常 mmap 有效。导致错误的调用如下:

    map->va = mmap(0, size, PROT_READ, MAP_PRIVATE, acpi_mem_fd, pa);

我什至尝试过使用 MAP_SHARED,但这并没有太大变化。

这里的pa是上面由'ACPI_HI_RSDP_WINDOW_BASE'宏定义的地址。任何人都可以对此或如何解决这个问题有所了解。

4

1 回答 1

1

根据您的评论,大小为 36:大小必须是系统页面大小的倍数。请参阅C - 为什么我不能映射小(256UL 或更小)大小的内存?

于 2013-07-29T22:52:14.237 回答