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

一、给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. apache配置CA证书通过https通信

    Apache Httpd 2.2 实现https加密通讯 实际生产中CA证书一般是向一些专业认证的国际机构来进行申请的.我们会模拟使用OpenSSL生成的证书,来实现Apache的安全加密通讯,这与实 ...

  2. [Eclipse+PyDev]ImportError: DLL load failed:找不到指定的模块 解决方案

    1. 环境 Eclipse 4.4.2 Python 3.5 Window 8.1 2. 问题 在代码中import numpy时,提示 " ImportError: DLL load fa ...

  3. [java大数据面试] 2018年4月百度面试经过+三面算法题:给定一个数组,求和为定值的所有组合.

    给定一个数组,求和为定值的所有组合, 这道算法题在leetcode应该算是中等偏下难度, 对三到五年工作经验主要做业务开发的同学来说, 一般较难的也就是这种程度了. 简述经过: 不算hr面,总计四面, ...

  4. BSOJ 2423 -- 【PA2014】Final Zarowki

    Description 有n个房间和n盏灯,你需要在每个房间里放入一盏灯.每盏灯都有一定功率,每间房间都需要不少于一定功率的灯泡才可以完全照亮.  你可以去附近的商店换新灯泡,商店里所有正整数功率的灯 ...

  5. B+ Tree vs B Trees

    原文地址:https://blog.csdn.net/dashuniuniu/article/details/51072795 引子 最近一直回顾自己曾经写的一些文档,有一篇是关于 Clang Rew ...

  6. 对JavaScript垃圾回收机制的理解?

    (1)标记清除(Mark and sweep) 这是JavaScript最常见的垃圾回收方式,当变量进入执行环境的时候,比如函数中声明一个变量,垃圾回收器将其标记为”进入环境”,当变量离开环境的时候( ...

  7. Oracle 批量生成sys_guid()

    select sys_guid() from dual connect by rownum<10

  8. logstash同步mysql数据到mysql(问题一)

    问题 通过logstash同步数据时 字段类型为tinyint时 通过过去 0变成了false  1变为了true 时间类型 变为 2018-10-16T14:58:02.871Z 分析 开始尝试通过 ...

  9. Qt 中一些常用类中文说明

    Qt 中一些常用类中文说明是本文讲述的内容,这篇文章主要是介绍Qt 当中经常使用的类,采取的是使用字母索引的方式,下面的类是被经常使用的. QDataStream 为QIODevice提供了一串的二进 ...

  10. 配置进程外的Session

    1.Session保存在SQLServer中配置方法 1)运行.NetFramework安装目录下对应版本的aspnet_regsql.exe 来创建相关的数据库.表和存储过程等,比如: C:\Win ...