c - 在低内存地址分配

标签 c memory-address

为了在限制条件下测试软件,我尝试创建一个测试用例,其中提供的用户缓冲区分配在某个非常低的内存地址处。非常接近 NULL 的内容,例如 0x1000h

事实证明,这是一个很难创造的条件。 实际上,我无法在 Linux、BSD、Windows 或 OS-X 上使用 malloc() 生成它。 我确信这种情况也可能发生在其他类型的设备上,但我需要一个可以插入到 CI 测试套件中的可重现的测试用例。

是否有任何已知的具有中等复杂性(和依赖性)的方法来生成此类条件?

编辑:选择解决方案 proposed by Eric Postpischil ,使用mmap()。请注意,as underlined by R. ,首先需要降低最低地址限制,可在 /proc/sys/vm/mmap_min_addr(在 Linux 上)读取。

sudo sysctl -w vm.mmap_min_addr="4096"

然后是示例代码:

#include <stdio.h>      /* printf */
#include <sys/mman.h>   /* mmap */

int main(int argc, const char** argv)
{
    void* lowBuff = mmap((void*)(0x1000), 64<<10,
                    PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS,
                   -1, 0);
    printf("lowBuff starts at %p \n", lowBuff);
}

结果:

lowBuff starts at 0x1000

最佳答案

在 POSIX/Unix 系统上,您可以使用 mmap 来请求特定页对齐地址处的内存。您可以获得的最低值取决于您的特定系统和环境。

关于c - 在低内存地址分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48631207/

相关文章:

perl - 停止 perl 重载或打印引用的内存 "address"

c - 宏语法困惑

c++ - 函数内的字符串文字 : automatic variables or allocated in heap?

c - C 中的词法和语义错误

C - 初始化结构成员 - 指针数组。第二个元素的值不正确

c - C 中这个表达式 (char *) 是什么意思?

memory-address - lldb:打印变量的地址

C 数组元素初始化

c - 带有列出环境变量的 exec() 函数

pointers - 在接口(interface)内获取值的地址