我想在汇编中使用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(".");
}
当代码执行并开始在终端上打印点时,我无法用Ctrl + C打断它。到目前为止一切都很好。
显然SIG_BLOCK
的值为0;并且sys_rt_sigprocmask
的系统调用号是14:
http://blog.rchapman.org/post/36801038863/linux-system-call-table-for-x86-64
所以我写道:
[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
...
它不起作用。 gdb
显示rax在第一个系统调用之后具有值-22(EINVAL
- “无效参数”);而第二个系统调用(sys_write)工作正常。
我做错了什么?
答案 0 :(得分:0)
显然r10应该保持值8而不是32。
我在内核代码中遇到了4个不同的sigset_t定义;并且对于它们中的每一个,sizeof()函数返回不同的结果(我记得32,128,4和8)。只有最后一个与系统调用相关。
内核首先检查$r10 == sizeof(sigset_t)
;如果不成立则返回EINVAL
( - 22)。对于32位和64位版本,sizeof(sigset_t)
的值等于8。