Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux sigprocmask在程序集中返回-22_Linux_Assembly_Linux Kernel_Signals_X86 64 - Fatal编程技术网

Linux sigprocmask在程序集中返回-22

Linux sigprocmask在程序集中返回-22,linux,assembly,linux-kernel,signals,x86-64,Linux,Assembly,Linux Kernel,Signals,X86 64,我想在汇编中使用sigprocmask阻止函数中的所有信号 以下代码在C中工作: #include <stdio.h> #include <signal.h> int main() { sigset_t n={(unsigned long int) 0xffffffff}; sigprocmask (SIG_BLOCK, &n, 0); for (int i=0; i<0x8ffff; i++) printf("."); } 而且

我想在汇编中使用sigprocmask阻止函数中的所有信号

以下代码在C中工作:

#include <stdio.h>
#include <signal.h>
int main() {
    sigset_t n={(unsigned long int) 0xffffffff};
    sigprocmask (SIG_BLOCK, &n, 0);

    for (int i=0; i<0x8ffff; i++) printf(".");
}
而且它不起作用
gdb
显示rax在第一次系统调用后的值为-22(
EINVAL
-“无效参数”);而第二个syscall(sys_write)工作正常


我做错了什么?

显然r10应该保留值8而不是32

我在内核代码中遇到了4种不同的sigset_t定义;对于它们中的每一个,sizeof()函数都返回不同的结果(我记得是32、128、4和8)。只有最后一个与系统调用相关


内核首先检查
$r10==sizeof(sigset\u t)
;并返回
EINVAL
(-22),如果该值不成立。
sizeof(sigset_t)
的值对于32位和64位版本都等于8。

您可以通过单步进入libc包装器来了解它作为参数传递给系统调用的确切内容,或者更简单地通过
strace
输出
strace-e rt|u sigprocmask ls 2>&1 | m
显示实际底层系统调用的最终参数是
8
[BITS 64]
    [section .text align=1]

    global main

        main:

            mov r10, 32
            mov rdx, 0
            mov rsi, newmask
            mov rdi, 0

            mov rax, 14
            syscall


            dotPrintLoop:
                mov rdi, dotstring
                mov rax, 0
                syscall
                jmp dotPrintLoop


    [section .data align=1]

        dotstring:  db ".",0

        newmask:    dd 0xffffffff
                    dd 0xffffffff
                    dd 0xffffffff
                    ...