2017-2018-1 20179219《Linux内核原理与设计》第六周作业

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2017-2018-1 20179219《Linux内核原理与设计》第六周作业相关的知识,希望对你有一定的参考价值。

一、学习笔记

当在代码中出现如下指令:

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内核原理与设计》第六周作业的主要内容,如果未能解决你的问题,请参考以下文章

2017-2018-1 20179219 《Linux内核原理与分析》第三周作业

2017-2018-1 20179219《Linux内核原理与分析》第五周作业

2017-2018-1 20179219《Linux内核原理与分析》第二周作业

20179219 《Linux内核原理与分析》第一周学习笔记

Linu计划书

linu运算