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,恢复现场。
- work_pending -> work_notifysig,用来处理信号
- 若无sys_exit_work,就执行restore_all恢复,返回用户态。
- INTERRUPT_RETURN <=> iret,结束。