PPswaggy  

Linux 基础

实验五

一.实验过程

1.向MenuOS中添加命令

1.1下载新版本menu

	cd LinuxKernel/    //进入LinuxKernel文件夹
rm -rf menu          //将menu目录删除
git clone http://github.com/mengning/menu.git      //克隆下载更新了版本之后的menu目录

1.2进入menu文件夹,进入MenuOS

cd menu/                  //进入menu文件夹
make rootfs              //进入MenuOS
MenuOS>>help       //并使用help命令查看现有的命令

1.3将getpid()函数加入test.c


1.4查看pid

2.gdb调用内核函数sys_time()

cd LinuxKernel   //返回LinuxKernel目录
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S  //启动内核
(gdb)file linux-3.18.6/vmlinux
(gdb)target remote:1234 //建立连接
(gdb)b start_kernel //在start函数中设置断点



二.分析system_call汇编代码过程

系统调用机制初始化中,trap_init函数里面有一个set_system_trap_gate函数,其中涉及到了系统调用的中断向量SYSCALL_VECTOR和汇编代码入口system_call,一旦执行int 0x80,CPU直接跳转到system_call来执行。system_call主要包含以下函数:

  • 进入函数

    • SAVE_ALL:保存现场
    • call *sys_call_table(,%eax,4)调用了系统调度处理函数,eax存的是系统调用号,是实际的系统调度程序。
      • sys_call_table:系统调用分派表
    • syscall_after_all:保存返回值
    • 若有sys_exit_work,则进入sys_exit_work:会有一个进程调度时机。
      • work_pending -> work_notifysig,用来处理信号
        • 可能call schedule:进程调度代码
      • 可能跳转到restore_all,恢复现场。
    • 若无sys_exit_work,就执行restore_all恢复,返回用户态。
    • INTERRUPT_RETURN <=> iret,结束。

流程图

posted on 2020-11-10 18:13  PPswaggy  阅读(121)  评论(0编辑  收藏  举报