mmap为什么返回ENODEV?

问题描述 投票:0回答:1

我一直在尝试弄清楚如何在 Linux 的 MIPS32 汇编中进行内存管理,并且我编写了这段使用 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 中运行这段代码时,我看到系统调用总是返回 0x13,这等于我系统上的 ENODEV 错误。根据 mmap 的手册页,如果“指定文件的底层文件系统不支持内存映射”,则返回 ENODEV。我已经尝试更改存储在 16($sp) 中的值,这是存储第 5 个参数(文件描述符)的位置(至少我是这么认为的)。这是我将每个参数的值设置为:

第一个参数:

void addr[.length] = NULL = 0

第二个参数:

size_t length = 8

第三个参数:

int prot = PROT_READ = 1

第四个参数:

int flags = MAP_PRIVATE = 2

第五个参数(在 16($sp)):

int fd = 0

第 6 个参数(在 20($sp)):

off_t offset = 0

linux mips32
1个回答
0
投票

写这个答案给别人看

我的错误是,对于标志参数,我没有使用 MAP_ANONYMOUS 标志。根据 mmap 的联机帮助页,MAP_ANONYMOUS 标志表示“映射不受任何文件支持;其内容初始化为零”并且 fd 参数将被忽略。

© www.soinside.com 2019 - 2024. All rights reserved.