Linux 为什么该程序接收SEGV?
我有下面的程序,它(我想)分配一堆虚拟内存(通过使用sys_brk更改系统中断),然后尝试写入新分配的内存。然而,我收到了一个SIGSEGV(在第一次内存写入时,我不明白为什么)Linux 为什么该程序接收SEGV?,linux,assembly,x86-64,system-calls,gnu-assembler,Linux,Assembly,X86 64,System Calls,Gnu Assembler,我有下面的程序,它(我想)分配一堆虚拟内存(通过使用sys_brk更改系统中断),然后尝试写入新分配的内存。然而,我收到了一个SIGSEGV(在第一次内存写入时,我不明白为什么) 调用值为0的sys_brk以获取RAX中的当前brk。添加要RAX的额外空间量,然后再次调用sys_brk,将该值作为参数。还需要使用Add$0x8,%RAX将8添加到RAX。您忘记了立即值的$。HLT也会出现故障。您应该使用sys\u exitsyscall@MichaelPetch谢谢为什么HLT会出现故障?是特权
调用值为0的sys_brk以获取RAX中的当前brk。添加要RAX的额外空间量,然后再次调用sys_brk,将该值作为参数。还需要使用
Add$0x8,%RAX
将8添加到RAX。您忘记了立即值的$
。HLT也会出现故障。您应该使用sys\u exitsyscall@MichaelPetch谢谢为什么HLT会出现故障?是特权指令,无法在用户模式下运行(环3)。它只能在内核(环0)或实模式下使用。@MichaelPetch I的印象是,当程序尝试无效的内存访问时,出现了SEGFULT。请使用值0调用sys_brk以获取RAX中的当前brk。添加要RAX的额外空间量,然后再次调用sys_brk,将该值作为参数。还需要使用Add$0x8,%RAX
将8添加到RAX。您忘记了立即值的$
。HLT也会出现故障。您应该使用sys\u exitsyscall@MichaelPetch谢谢为什么HLT会出现故障?是特权指令,无法在用户模式下运行(环3)。它只能在内核(环0)或实模式下使用。@MichaelPetch I的印象是,segfault是在程序尝试无效的内存访问时发生的。
[OP@localhost sys_brk]$ cat out_of_memory.s
.section .text
.globl _start
_start:
mov $12, %rax
mov $0x1000000, %rdi
syscall
# i: index of memory we are writing to (%rax)
mov $0x403000, %rax
evil_loop_start:
cmp $0x1000000, %rax
jge evil_loop_end
mov %rax, (%rax)
add 0x8, %rax
jmp evil_loop_start
evil_loop_end:
hlt