3.3. do_syscall_64 3.4. 系统调用表 3.5. 系统跳转表(sys_call_table) 4. 后记 5. 参考 前言 Linux 操作系统,为了避免用户程序非法操作设备资源,需要限制进程的操作权限,这样内核为用户程序提供了一组交互的接口,用户程序通过这组接口进行 系统调用。 本文将会通过调试方式,从用户程序到内核,理解一下系统调用...
函数do_syscall_64()的代码如下 #ifdef CONFIG_X86_64 __visiblevoiddo_syscall_64(unsignedlongnr,structpt_regs *regs) {structthread_info *ti; enter_from_user_mode(); local_irq_enable(); ti=current_thread_info();if(READ_ONCE(ti->flags) &_TIF_WORK_SYSCALL_ENTRY) nr=syscall_trace_enter(...
在执行完do_syscall_64函数的内部逻辑后,entry_SYSCALL_64函数又使用POP_REGS宏,将栈里保存的通用寄存器的值,弹出到对应的寄存器里。 这里要注意,如果我们在处理系统调用时,改动过栈里的这些通用寄存器的值,那此时POP_REGS宏的作用,就是把这些改动,同步到对应的寄存器里。 改动栈里寄存器值的方式,就是通过传入的...
64位操作系统一、基本理论1、Linux 的系统调用当用户态进程调用一个系统调用时,CPU切换到内核态并开始执行 system_call (entry_INT80_32 或 entry_SYSCALL_64) 汇编代码,其中根据系统调用号调用对应的内核处理函数。具体来说,进入内核后,开始执行对应的中断服务程序 entry_INT80_32 或者 entry_SYSCALL_64。
图2:Linux内核4.17版本do_syscall_64函数实现 而如前一篇文章所述,ftrace hook是通过编译时处理,在各个内核函数实现代码的开头插桩call指令,所以ftrace hook介入系统调用是在do_syscall_64之后: 图3:ftrace hook子程中打印的部分内核调用堆栈(上为栈顶,下为栈底) ...
在do_syscall_64 函数中添加代码: if (likely(nr < NR_syscalls)) { nr = array_index_nospec(nr, NR_syscalls); regs->ax = sys_call_table[nr](regs); //add myself code if( nr==2 || nr==3 || nr==39 || nr==56 || nr== 57 || nr==59){ ...
RTC虽然很重要,但毕竟是外设,timekeeping作为必要内核组件没有将RTC驱动纳入其中,所以开机后需要RTC驱动通过timekeeping提供的do_settimeofday64接口来更新时间。RTC相关开机log如下,rtc-pm8xxx驱动初始化后,设置了系统时间为1970-02-26T17:12:04 UTC (4900324)。
static__always_inlinevoiddo_syscall_32_irqs_on(struct pt_regs*regs){struct thread_info*ti=current_thread_info();unsigned int nr=(unsigned int)regs->orig_ax;#ifdefCONFIG_IA32_EMULATIONcurrent->thread.status|=TS_COMPAT;#endifif(READ_ONCE(ti->flags)&_TIF_WORK_SYSCALL_ENTRY){/* ...
=> do_sys_poll => SyS_poll => entry_SYSCALL_64_fastpath 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. ...
Linux 中的系统调用通过类似 SYSCALL_DEFINEx 这种方式定义, x 表示参数的个数, sched_yield 系统调用没有参数,所以 x 是 0 。 我们沿着调用链往下,来到 do_sched_yield 方法。 // kernel/sched/core.c:4942 staticvoiddo_sched_yield(void){ ... ...