在mmap()手册页中:
它的原型是:
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
和描述:
The mmap() function asks to map 'length' bytes starting at offset 'offset'
from the file (or other object) specified by the file descriptor fd into
memory, preferably at addr
这里是我的问题:我想从运行在Linux内核空间中的代码中对数据文件的一部分进行内存映射。我想稍后也从Linux内核空间中运行的代码中撤销相同的内存映射。如何执行这些操作?它们与在用户空间中使用mmap(2)/munmap(2)有何不同?
我试图在没有用户进程的内核空间中做到这一点。
我浏览了网络搜索和Linux内核书籍,包括Bovet和Cesati的"Understanding the Linux Kernel“。一本好书,但没有回答我的问题。
来自
如果设置了“标志”字中的第6位,则“mmap_*”字段是有效的,并指示包含由BIOS提供的机器内存映射的缓冲区的地址和长度。‘mmap_addr’是地址,‘mmap_length’是缓冲区的总大小。
我看到每个mmap都有一个关联的type。
“类型”是所表示的地址范围的变化,其中值1表示可用RAM,值3表示存储ACPI信息的可用内存,值4表示休眠时需要保存的保留内存,值5表示内存被缺陷RAM模块占用,所有其他值表示保留区域。
在a memory map of the machine provided by the BIOS的上下文中,这些类型到底意味着什么?类型1内存是
如何解决这个问题?/var/crash/virtualbox-来宾-dkms.0。崩溃包含:
ProblemType: Package
DKMSBuildLog:
DKMS make.log for virtualbox-guest-6.1.10 for kernel 5.8.0-36-generic (x86_64)
Sun 10 Jan 11:53:48 EET 2021
make: Entering directory '/usr/src/linux-headers-5.8.0-36-generic'
CC [M] /var/lib/dkms/virtual
64位寻址的地址空间绝对是巨大的。我有一个程序,将mmap几块内存,每个100 -500MB的顺序。我将不可避免地重新映射几次,这可能会导致可用连续空间的一些碎片。
无论发生什么空间碎片,考虑到可用的地址空间,它肯定会非常小。
我的问题是:考虑到这些限制,在正常情况下,我能期望所有mmap请求都成功(即不会因为碎片而失败)吗?他们失败的原因可能是什么?
我知道堆本身并不拥有整个空间,但我认为它拥有绝大多数空间。
Mac OS / Linux。