linux 为什么mmap返回ENODEV?

xnifntxz  于 2023-05-16  发布在  Linux
关注(0)|答案(1)|浏览(211)

我一直在试图弄清楚如何在Linux的MIPS 32汇编中进行内存管理,我编写了以下代码,使用mmap分配8个字节:

.text
.global main
main:
    addi $sp, $sp, -32
    add $a0, $zero, $zero
    addi $a1, $zero, 8
    addi $a2, $zero, 1
    addi $a3, $zero, 2
    sw $zero, 16($sp)
    sw $zero, 20($sp)
    addi $v0, $zero, 4090
    syscall
    lw $a0, ($v0)
    
    add $a0, $zero, $zero
    addi $v0, $zero, 4001
    syscall

然而,当我在gdb中运行这段代码时,我看到系统调用总是返回0x 13,这等于我的系统上的ENODEV错误。根据mmap的手册页,如果“指定文件的底层文件系统不支持内存Map”,则返回ENODEV。我试过改变16($sp)中存储的值,这是第五个参数,文件描述符,存储的地方(至少我是这么认为的)。下面是我设置的每个参数的值:
第一个参数:void addr[.length] = NULL = 0
第二个参数:size_t length = 8
第三个参数:int prot = PROT_READ = 1
第四个参数:int flags = MAP_PRIVATE = 2
第5个参数(在16($sp)处):int fd = 0
第6个参数(在20($sp)处):off_t offset = 0

kwvwclae

kwvwclae1#

写下这个答案给其他人阅读。
我的错误是,对于flags参数,我没有使用MAP_ANONYMOUS标志。根据mmap的手册页,MAP_ANONYMOUS标志表示“Map不被任何文件支持;其内容被初始化为零”,并且FD参数将被忽略。

相关问题