用户进程的有效地址空间是什么?(OS X和Linux)

Jam*_*mes 4 linux macos mmap

mmap系统调用的文件说,该函数将失败:

指定了MAP_FIXED,并且addr参数未进行页面对齐,或者所需地址空间的一部分位于用户进程的有效地址空间之外.

我找不到任何地方的文件说什么是一个有效的地址映射.(我有兴趣在OS X和Linux上执行此操作,理想情况下,相同的地址对两者都有效...).

ado*_*yan 7

Linux内核为用户空间(几乎)无法访问且无法映射任何内容的部分虚拟地址空间保留.您正在寻找所谓的"userspace/kernelspace split".

在i386上,arch默认为3G/1G one - 用户空间低3 GB的虚拟地址空间,内核高1 GB,另外还有2G/2G和1G/3G分割:

config PAGE_OFFSET
        hex
        default 0xB0000000 if VMSPLIT_3G_OPT
        default 0x80000000 if VMSPLIT_2G
        default 0x78000000 if VMSPLIT_2G_OPT
        default 0x40000000 if VMSPLIT_1G
        default 0xC0000000
        depends on X86_32
Run Code Online (Sandbox Code Playgroud)

在x86_64上,用户空间位于(当前)48位虚拟地址空间的下半部分:

/*
 * User space process size. 47bits minus one guard page.
 */
#define TASK_SIZE_MAX   ((1UL << 47) - PAGE_SIZE)
Run Code Online (Sandbox Code Playgroud)