系统调用的三个层次(下)

一、给MenuOS增加time和time-asm命令

1、克隆并自动编译

MenuOS rm menu -rf 强制删除原menu文件

git clone https://github.com/mengning/menu.git      从github中克隆

cd menu

make rootfs 运行自动编译脚本,生成根文件系统,启动MenuOS

2、给MenuOS增加time和time-asm命令

  • 更新menu代码到最新版
  • test.c中main函数里
  • 增加MenuConfig
  • 增加对应的两个函数:Time和TimeAsm make rootfs

二、使用gdb跟踪系统调用内核函数sys_time

使用gdb跟踪调试内核

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S # 关于-s和-S选项的说明:
另开一个shell窗口

gdb
(gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表

(gdb)target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行 加载符号表

三、系统调用在内核代码中的处理过程

1、系统调用在内核代码中的工作机制和初始化

  • SYSCALL_VECTOR:系统调用的中断向量
  • &system_call:汇编代码入口
  • 一执行int 0x80,系统直接跳转到system_call

四、分析理解system_call代码

490ENTRY(system_call)        //执行int Ox80后的下一条指令
491 RING0_INT_FRAME # can't unwind into user space anyway
492 ASM_CLAC
493 pushl_cfi %eax # save orig_eax
494 SAVE_ALL         //保存系统寄存器信息
495 GET_THREAD_INFO(%ebp)    //获取thread_info结构的信息
496 # system call tracing in operation / emulation
497 testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp)  //测试是否有系统跟踪
498 jnz syscall_trace_entry
499 cmpl $(NR_syscalls), %eax    //比较eax中的系统调用号和最大syscall,超过则无效
500 jae syscall_badsys        //无效的系统调用 直接返回
501syscall_call:
502 call *sys_call_table(,%eax,4)    //系统调用表,eax存放系统调用号
503syscall_after_call:          //保存返回值并退出
504 movl %eax,PT_EAX(%esp) # store the return value
505syscall_exit:        //检测是否有待处理任务
506 LOCKDEP_SYS_EXIT
507 DISABLE_INTERRUPTS(CLBR_ANY) # make sure we don't miss an interrupt
508 # setting need_resched or sigpending
509 # between sampling and the iret
510 TRACE_IRQS_OFF
511 movl TI_flags(%ebp), %ecx
512 testl $_TIF_ALLWORK_MASK, %ecx # current->work     //判断当前的任务是否需要进程调度
513 jne syscall_exit_work
514
515restore_all:
516 TRACE_IRQS_IRET
517restore_all_notrace:      //iret 从系统调用返回

五、对系统调用流程的分析

六、遇到的问题

  如下图,第一次克隆失败,后经检查发现是因为网址中的https误输成了http,经改正后成功克隆。

Linux内核分析作业第五周的更多相关文章

  1. 《Linux内核分析》第五周学习总结

    <Linux内核分析>第五周学习总结                                  ——扒开系统调用的三层皮(下) 姓名:王玮怡 学号:20135116 1.给menu ...

  2. 《Linux内核分析》第五周学习笔记

    <Linux内核分析>第五周学习笔记 扒开系统调用的三层皮(下) 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.c ...

  3. 《Linux 内核分析》第五周

    [李行之原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] <Linux内 ...

  4. 《Linux内核分析》第五周 扒开系统调用的三层皮(下)

    [刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK FIVE( ...

  5. 《Linux内核分析》第五周

    20135103王海宁 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 这周的实验在上周实验四的基础上, ...

  6. 《Linux内核分析》第五周学习总结 扒开系统调用的三层皮(下)

    扒开系统调用的三层皮(下) 郝智宇 无转载 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.给Men ...

  7. 《Linux内核分析》第五周:分析system_call中断处理过程

    实验 分析system_call中断处理过程 使用gdb跟踪分析一个系统调用内核函数(您上周选择那一个系统调用),系统调用列表参见http://codelab.shiyanlou.com/xref/l ...

  8. Linux内核分析作业第八周

    进程的切换和系统的一般执行过程 一.进程调度的时机 中断处理过程(包括时钟中断.I/O中断.系统调用和异常)中,直接调用schedule(),或者返回用户态时根据need_resched标记调用sch ...

  9. Linux内核分析作业第七周

    一. 预处理.编译.链接 gcc hello.c -o hello. gcc编译源代码生成最终可执行的二进制程序,GCC后台隐含执行了四个阶段步骤. 预处理 → 编译 → 汇编 → 链接 预处理:编译 ...

随机推荐

  1. VRS的GPS/BDS双系统网元固定存在的问题

    问题如下:部分网元固定卫星数少于2个. 另外:北方xinkong的网元组网也存在问题

  2. 【ReactNative】Mac下分分钟打包 Android apk

    时间:2016-11-20 09:17:07 地址:https://github.com/zhongxia245/blog/issues/52 Mac 下 ReactNative如何打包构建Andro ...

  3. 环境变量(environment variable)

    环境变量是什么 环境变量指的就是操作系统当中的一些变量.可以通过修改环境变量,来对计算机进行配置(主要是来配置一些路径的) 查看环境变量右键 计算机(此电脑),选择属性——系统界面左侧选择 高级系统设 ...

  4. (9)Python循环结构

  5. 扑克牌游戏-华为OJ-C++实现

    /*扑克牌游戏大家应该都比較熟悉了.一副牌由54张组成,含3~A.2各4张,小王1张.大王1张.牌面从小到大用例如以下字符和字符串表示(当中.小写joker表示小王,大写JOKER表示大王): 3 4 ...

  6. 「SNOI2019」通信

    题目 还好我没生在陕西啊 首先发现这个题不能\(dp\),数据范围不大,好像一种网络流的样子啊 哎等等,这样向后面连边不是一个\(DAG\)吗,这不是最小权路径覆盖的板子吗 于是我们套路的拆点,对于一 ...

  7. 整数划分 NBUT - 1046

    题目很简单,把一个正整数分割成N个正整数之和.但是你得把所有的划分方法列出来,以字典序升序排序.对于每种划分方法,小的数字在前面. 思路:直接深度优先搜索,注意要判断前一位一定会比将要放入答案的因子小 ...

  8. ]remove-duplicates-from-sorted-list-ii (删除)

    题意略: 思路都在注解里: #include<iostream> #include<cstdio> using namespace std; struct ListNode { ...

  9. P1218 [USACO1.5]特殊的质数肋骨 Superprime Rib (数论—素数 + DFS)

    这大概是我写的第一个DFS 题目描述 农民约翰的母牛总是产生最好的肋骨.你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们.农民约翰确定他卖给买方的是真正的质数肋骨,是因为从右边开始切下肋骨, ...

  10. Javascript中的undefined、null、""、0值和false的区别总结

    在程序语言中定义的各种各样的数据类型中,我们都会为其定义一个"空值"或"假值",比如对象类型的空值null,.NET Framework中数据库字段的空值DBN ...