2021-10-31

2021-2022-1 20212825 《Linux内核原理与分析》第六周作业

一、实验步骤

1.给MenuOS增加命令

cd LinuxKernel
rm menu -rf   删除当前的menu目录
git clone https://github.com/mengning/menu.git   重新克隆一个新版本的menu
cd menu   进入menu
make rootfs   运行make rootfs脚本

增加自己写的命令

#include <stdio.h>
int twl()
{
	printf("20202825hello world!\n");
}

以上运行结果:
在这里插入图片描述

2.使用gdb跟踪系统调用内核函数sys_time

输入命令:

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s
file linux-3.18.6/vmlinux
target remote:1234

在这里插入图片描述

在start_kernel处设置断点,按c停下
用b sys_time设置断点,启动Menu并执行time命令,程序停在函数这个位置,通过list命令列出sys_time对应代码
然后用gdb的finish命令把函数全部执行完,再一直单步执行到return i。
在这里插入图片描述

3.分析system_call处理过程

ENTRY(system_call)
    RINGO_INT_FRAME
    ASM_CLAC
    push1_cfi %eax   /*保存系统调用号*/
    SAVE_ALL  /*保存现场,将用到的所有CPU寄存器保存到栈中*/
    GET_THREAD_INFO(%ebp)   /*ebp用于存放当前进程thread_info结构的地址*/
    test1 $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp)
    jnz syscall_trace_entry
cmp1 $(nr_syscalls),%eax   /*检查系统调用号(系统调用号应小于NR_syscalls)*/
    jae syscall_badsys   /*不合法,跳入异常处理*/
syscall_call:
     call *sys_call_table(,%eax,4)   /*合法,对照系统调用号在系统调用表中寻找相应的系统调用的内核处理函数*/
     movl %eax,PT_EAX(%esp)    /*保存返回值到栈中*/
 syscall_exit:  
     testl $_TIF_ALLWORK_MASK, %ecx    /*检查是否需要处理信号*/
     jne syscall_exit_work     /*需要,进入 syscall_exit_work*/
 restore_all: 
     TRACE_IRQS_IRET     /*不需要,执行restore_all恢复,返回用户态*/
 irq_return:
     INTERRUPT_RETURN     /*相当于iret*/

在这里插入图片描述
内核执行int 0x80后系统跳转到system_call入口,首先系统进行保存现场的工作(包括将用户态进程的各寄存器保存在内核堆栈上),之后系统执行sys_call_table,该函数通过系统调用号来查找实际的系统调用函数,当该函数返回时,系统保存其返回值,然后到syscall_exit_work,这里会有一个判断,即此时系统是否还有没有完成的额外工作,如果有的话,首先进入work_pending,这里是检查是否有等待调度的进程,因为这里是内核设置的进程调度的一个时机。该段程序循环调度需要调度的进程,如果已经没有需要调度的进程,紧接着需要检查是否有挂起的信号(比如进程间通信的一些信号)等待处理。处理完毕后,本次系统调用也就接近了尾声,此时恢复上下文,然后将CPU控制权交给用户态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值