查阅内核代码,发现entry_SYSCALL_64_after_hwframe是从entry_SYSCALL_64开始执行的代码中的标号。因为从entry_SYSCALL_64到entry_SYSCALL_64_after_hwframe的过程中并没有类似于call这样的调用指令,这么说系统调用的入口是从netry_SYSCALL_64开始的。 继续用qemu打个断点看
内核make生成“ld: arch/x86/entry/syscall_64.o:(.rodata+0xdc0):未定义的对`__x64_sys_s_e...
syscall_64.c thunk.S events hyperv ia32 include kernel kvm lib math-emu mm net pci platform power purgatory ras realmode tools um video virt xen .gitignore Kbuild Kconfig Kconfig.assembler Kconfig.cpu Kconfig.cpufeatures Kconfig.debug
usertrap 函数属于内核代码了,内存中位于 kernel 虚拟地址空间的 kernel text 段,这里的代码细节很多,我就不一一讲解了,细节在图中都说明了,我只从宏观上讲,usertrap 负责判断触发 trap 的原因,并执行响应的处理: 若是syscall,则调用对应的系统调用 若是设备中断,则跳转到响应的处理代码 若是page fault,则杀死...
The Linux x86 syscall ABI is as far as I know documented "officially" in entry_SYSCALL_64() in the entry code itself (We use %eXX instead of %rXX here since the machine code is slightly shorter; setting %eXX to 0 will also clear the upper 32 bits of %rXX). We can build this ...
若是syscall,则调用对应的系统调用 若是设备中断,则跳转到响应的处理代码 若是page fault,则杀死进程 最后执行 usertrapret() 函数 提一个特别的细节:uservec 中切换了页表,在切换之前使用的是 user page table,所以 trapframe page 在 user page table 中映射到了物理内存的某个 page 中;切换页表后,到了 us...
64:CALL(sys_umount) 65:CALL(sys_ni_syscall)/* was sys_lock */ 66:CALL(sys_ioctl) 67:/* 55 */CALL(sys_fcntl) 68:CALL(sys_ni_syscall)/* was sys_mpx */ 69:CALL(sys_setpgid) 70:CALL(sys_ni_syscall)/* was sys_ulimit */ ...
[inline] setxattr+0x6ae/0x790 fs/xattr.c:449 path_setxattr+0x1eb/0x380 fs/xattr.c:468 SYSC_lsetxattr+0x8d/0xb0 fs/xattr.c:490 SyS_lsetxattr+0x77/0xa0 fs/xattr.c:486 entry_SYSCALL_64_fastpath+0x13/0x94 origin: save_stack_trace+0x37/0x40 arch/x86/kernel/stacktrace.c:59 kmsan...
19: CALL(sys_ni_syscall) /* was sys_waitpid */ 1. 20: CALL(sys_creat) 1. 21: CALL(sys_link) 1. 22: /* 10 */ CALL(sys_unlink) 1. 23: CALL(sys_execve_wrapper) 1. 24: CALL(sys_chdir) 1. 25: CALL(OBSOLETE(sys_time)) /* used by libc4 */ ...
之后usertrap 会将 sepc 存入 trapframe 之中,然后根据 scause 寄存器中的值来分情况处理,如果 scause 的值是 8 ,那么就是系统调用,首先会将 trapframe 中的 sepc 增加 4 个字节以指向 user space 中系统调用 ecall 的下一个指令,然后启用设备中断,调用 syscall 函数以实现系统调用。在 syscall 中,系统调...