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. CSRF攻击详解

    CSRF是什么 CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/X ...

  2. python openpyxl.md

    Openpyxl 创建一个工作簿 下面是创建一个工作簿.而每个工作簿至少一个工作表我们可以通过active获取正在运行的工作表. In [1]: from openpyxl import Workbo ...

  3. 1036. [ZJOI2008]树的统计【树链剖分】

    Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u t : 把结点u的权值改为t II. ...

  4. 修改Lotus notes默认浏览器

    notes收到的邮件里面的链接,点了以后会自动在notes里打开,但notes很弱,加载页面总是有问题.怎么才能让他默认用ie浏览器打开呢,怎么设置,请教达人. 右下角有个office->Edi ...

  5. JS实现网页换肤功能效果

    网页换肤的基本原理 使用 JS 切换对应的 CSS 样式表.例如hao123首页的右上方就有网页换肤功能.除了切换 CSS 样式表文件之外,通常的网页换肤还需要通过 Cookie 来记录用户之前更换过 ...

  6. Features + Git + Drush,打造你的Drupal开发与维护标准工作流

    还在为如何将本地的开发工作如何部署到生产环境而皱眉头?本文以实战历程教你如何一步步将你的工作成果从开发环境部署到生产环境. 如题所示,需要用到Features, Git, Drush:如果你还不知道他 ...

  7. AbelSu区块链应用场景收集

    1.基于智能合约的众筹 众筹项目的资金通常由一个中心化不可变更且开放的数据库来控制,这个数据库可以追踪所有出资人. 虽然如此,我们可以用一种去中心化的方式来实现,而且只要创建一个代币就可以追踪资金.一 ...

  8. 使用Git进行协同开发

    用了一段时间github,一直想用时间来对git的使用来做一段笔记,前段时间比较忙,现在沉下心来学习也是极好的. 很多项目开发会采用git这一优秀的分布式版本管理工具来进行项目版本管理.因为git的使 ...

  9. Docker学习笔记 — 开启Docker远程访问

    默认情况下,Docker守护进程会生成一个socket(/var/run/docker.sock)文件来进行本地进程通信,而不会监听任何端口,因此只能在本地使用docker客户端或者使用Docker ...

  10. mfc CFileDialog类

    知识点: CFileDialog类 SetBitmap LoadImage 动态显示图片 一.CFileDialog类 构造函数 CFileDialog( BOOL bOpenFileDialog, ...