linux内核分析第五周学习笔记

标签(空格分隔): 20135328陈都


陈都 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000


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

  • 把menu删除;

rm menu -rf 强制删除

  • 重新克隆一个新的Menu;

  • 进入Menu,用makerootfs自动编译生成根文件系统,同时还自动启动MenuOS
  • 增加了两个命令:time和time_asm,说明扩展了功能。

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

  • 一直按n单步执行会进入schedule函数

  • Sys_time返回后进入汇编代码处理gdb无法继续跟踪

  • 执行int 0x80之后执行system_call对应的代码

  • 让系统停在system_call的位置进行调试

  • 执行int 0x80之后执行system_call对应的代码

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

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

(1)进程调度的时机要分析一下

  • sys_call_table是系统调用分派表
  • syscall_after_all,需要先保存返回值
  • sys_exit_work
  • 没有这个就restore_all,返回用户态。
  • 一旦进入sys_exit_work:会有一个进程调度时机

    2.简化后便于理解的system_call伪代码:

(1)系统调用的工作机制一旦在start kernel初始化好之后,在代码中一旦出现inter 0x80的指令,它就会立即跳转到system_call这个位置
call *sys_call_table(,%eax,4)调用了系统调度处理函数,eax存的是系统调用号

(2)定义的宏SAVE_ALL和RESTORE_ALL

(3)当一个系统调用发生的时候,它进入内核处理这个系统调用,内核提供了一些服务,在这个服务结束返回到用户态之前,它可能会发生

进程调度,就会发生进程上下文的切换和中断上下文的切换。

3.system_call到iret之间的主要代码分析:

SAVE_ALL:保存现场;

syscall_call:调用了系统调用处理函数;

restore all:恢复现场(因为系统调用处理函数也算是一种特殊的“中断”);syscallexitwork:同上一条i;

INTERRUPT RETURN:也就是iret,系统调用到此结束;

\arch\x86\kernel\traps.c中有一个函数,将SYSCALL_WECTOR(系统调用中断向量)和system_call汇编代码的入口绑定。完成初始化

简化汇编伪代码

Save_all保存现场

Sys_call_table:绑定系统调用函数

Interrupt_return:结束

韩玉琪同学总结得很到位,在此冒昧引用

系统调用就是特殊的一种中断

  1. 保存现场 在系统调用时,我们需要SAVE_ALL,用于保存系统调用时的上下文。 同样,中断处理的第一步应该也要保存中断程序现场。 目的:在中断处理完之后,可以返回到原来被中断的地方,在原有的运行环境下继续正确的执行下去。
  2. 确定中断信息 在系统调用时,我们需要将系统调用号通过eax传入,通过sys_call_table查询到调用的系统调用,然后跳转到相应的程序进行处理。
    同样,中断处理时系统也需要有一个中断号,通过检索中断向量表,了解中断的类型和设备。
  3. 处理中断 跳转到相应的中断处理程序后,对中断进行处理。
  4. 返回 系统调用时最后要restore_all恢复系统调用时的现场,并用iret返回用户态。 同样,执行完中断处理程序,内核也要执行特定指令序列,恢复中断时现场,并使得进程回到用户态。

linux内核分析第五周学习笔记的更多相关文章

  1. Linux内核分析——第五周学习笔记

    第五周 扒开系统调用的“三层皮”(下) 一.知识点总结 (一)给MenuOS增加time和time-asm命令 在实验楼中,首先 强制删除menu (rm menu -rf) 重新克隆一个新版本的me ...

  2. LINUX内核分析第五周学习总结——扒开应用系统的三层皮(下)

    LINUX内核分析第五周学习总结——扒开应用系统的三层皮(下) 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/cou ...

  3. LINUX内核分析第五周学习总结——扒开系统调用的“三层皮”(下)

    LINUX内核分析第五周学习总结--扒开系统调用的"三层皮"(下) 标签(空格分隔): 20135321余佳源 余佳源 原创作品转载请注明出处 <Linux内核分析>M ...

  4. 《Linux内核分析》第一周学习笔记

    <Linux内核分析>第一周学习笔记 计算机是如何工作的 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/c ...

  5. 《Linux内核分析》第二周学习笔记

    <Linux内核分析>第二周学习笔记 操作系统是如何工作的 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/ ...

  6. Linux内核分析第三周学习笔记

    linux内核分析第三周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...

  7. Linux内核分析第五周学习总结——分析system_call中断处理过程

    Linux内核分析第五周学习总结--分析system_call中断处理过程 zl + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...

  8. Linux内核分析第六周学习笔记——分析Linux内核创建一个新进程的过程

    Linux内核分析第六周学习笔记--分析Linux内核创建一个新进程的过程 zl + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...

  9. Linux内核分析第七周学习笔记——Linux内核如何装载和启动一个可执行程序

    Linux内核分析第七周学习笔记--Linux内核如何装载和启动一个可执行程序 zl + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study. ...

随机推荐

  1. 极限编程核心价值:简单(Simplicity)

    写在前面 在编写 ASP.NET Core 项目时,深感项目设计的无力感,在软件设计方面我还有很长的路要走.我一直以来都把代码当作一种艺术的存在,认为自己是个"艺术家",其实就是个 ...

  2. 原生JS简单的无缝自动轮播

    最近在不断的加强巩固js.在学习jq和vue之后发现很多东西其实都是不明所以,有些底层的东西自己不懂,到头来也只是一昧的使用,一直在用别人的东西,对自己的成长帮助也不大. 万丈高楼平地起,基础打扎实了 ...

  3. unity3D iTween的使用

     iTween是一个动画库,作者创建它的目的就是最小的投入实现最大的产出.让你做开发更轻松,用它能够轻松实现各种动画,晃动,旋转,移动,褪色,上色,控制音频等等 到官网看看 http://itwe ...

  4. jQuery 实现复选框的全选与反选

    <script> //实现全选与反选 $(".allAndNotAll").click(function () { if ($(this).prop("che ...

  5. Scala学习之路 (九)Scala的上界和下届

    一.泛型 1.泛型的介绍 泛型用于指定方法或类可以接受任意类型参数,参数在实际使用时才被确定,泛型可以有效地增强程序的适用性,使用泛型可以使得类或方法具有更强的通用性.泛型的典型应用场景是集合及集合中 ...

  6. post-message-stream的学习-metamask

    kumavis/post-message-stream post-message-stream Sets up a duplex object stream over window.postMessa ...

  7. Maven搭建私服

    为什么要搭建私服?搭建私服有什么好处? 以我最近技术调研和相关的使用为起点概述: 首先说明,为什么要搭建私服? 搭建私服的目的是,通常企业项目开发,特别是使用maven作为项目管理,现在非常流行使用m ...

  8. jenkins自动部署到tomcat报错:ERROR: Publisher hudson.plugins.deploy.DeployPublisher aborted due to exception

    参考地址: http://blog.csdn.net/weiguang1017/article/details/9011353 manager-script — Access to the tools ...

  9. asdm不能登录问题;浏览器必须是ie,不能是chrome或者firefox;java的版本,尤其是安全等级和例外需要调整

    asdm不能登录问题:浏览器必须是ie,不能是chrome或者firefox;java的版本,尤其是安全等级和例外需要调整

  10. java中sleep()方法的解析

    Thread.sleep(3000); 就是指让当前正在运行的占用cpu时间片的线程挂起3000ms,把cpu的时间片交给其他线程,但是并没有指定把CPU的时间片接下来到底交给哪个线程,而是让这些线程 ...