标签:dep between call 9.png 调度 png 调用 can after
一、学习笔记
当在代码中出现如下指令:
int $0x80
系统马上就会调到system call这个位置,下条指令从此开始
ENTRY(system_call) RING0_INT_FRAME # can‘t unwind into user space anyway ASM_CLAC pushl_cfi %eax # save orig_eax SAVE_ALL #保护现场 GET_THREAD_INFO(%ebp) # system call tracing in operation / emulation testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp) jnz syscall_trace_entry cmpl $(NR_syscalls), %eax jae syscall_badsys syscall_call: call *sys_call_table(,%eax,4) #eax传递的就是系统调用号 syscall_after_call: movl %eax,PT_EAX(%esp) # 保存返回值 syscall_exit: LOCKDEP_SYS_EXIT DISABLE_INTERRUPTS(CLBR_ANY) # make sure we don‘t miss an interrupt # setting need_resched or sigpending # between sampling and the iret
TRACE_IRQS_OFF
movl TI_flags(%ebp), %ecx
testl $_TIF_ALLWORK_MASK, %ecx # current->work
jne syscall_exit_work
restore_all:
TRACE_IRQS_IRET
restore_all_notrace: #返回用户态
系统调用实际上就是特殊的中断,所以也存在保护现场和恢复现场的操作
简单的利用伪代码进行分析:
#system call #系统调用汇编伪代码 ENTRY(system_call) SAVE_ALL syscall_call; call *sys_call_table(,%eax,4) #根据系统调用号进行系统调用 movl%eax,PT_EAX(%esp) #store the return value syscall_exit: test1 $_TIF_ALLWORK_MASK,%ecx #检测当前任务是否需要进行syscall_exit_work #如果不需要则直接restore_all ireq_return jne syscall_exit_work restore_all: RESTORE_INT_REGS irq_return: INTERRUPT_RETURN ENDPROC(system_call) syscall_exit_work: test1 $_TIF_WORK_SYSCALL_EXIT,%ecx jz work_pending END(syscall_exit_work) work_pending: testb $_TIF_NEED_RES(CHED,%c1 jz work_notifysig #处理信号 work_resched: #重新调度 call schedule jz restore_all work_notifysig: #deal with pending signals ........ END(work_pending) #说明在系统调用返回之前可能发生进程调度,进程调度的里面会发生进程上下文的切换;其次,在当前进程有信号的时候可能需要处理;内核可以抽象成很多种不同中断处理过程的集合
二、实验操作
首先启动menuOS
发现并没有被添加入新的命令,视频上的time命令并不存在,所以自己操作加入上个博客进行实验的函数。
编辑test.c文件
PS:实验楼太卡啦啦啦啦啦
添加的代码如下图
本次试验用到了很多前几周实验的知识,可见笔记积累的重要性。
经过漫长的等待终于OK了
执行socket命令测试,运行成功
执行socket-asm命令,返回3,,,,赶脚有问题,,,回看socket-asm代码部分
2017-2018-1 20179219《Linux内核原理与设计》第六周作业
标签:dep between call 9.png 调度 png 调用 can after
原文地址:http://www.cnblogs.com/ghost00011011/p/7787746.html