我正在尝试(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'宏定义的上面地址。任何人都可以对此有所了解或如何解决这个问题。
答案 0 :(得分:1)
根据您的评论,大小为36:大小必须是系统页面大小的倍数。见C - why I cannot mmap a small (256UL or smaller) size of memory?