尝试将Upper BIOS内存映射到虚拟地址空间时,为什么mmap失败

时间:2013-07-29 21:27:38

标签: c freebsd mmap virtual-address-space acpi

我正在尝试(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'宏定义的上面地址。任何人都可以对此有所了解或如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

根据您的评论,大小为36:大小必须是系统页面大小的倍数。见C - why I cannot mmap a small (256UL or smaller) size of memory?