内核源代码导读.docVIP

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
内核源代码导读

347-Linux内核源代码导读 Linux内核源代码导读 中国科学技术大学计算机系 陈香兰0551- xlanchencom Spring 2009 序 一些基本概念 操作系统的基本概念 I386系统的基本概念 Linux简介 源码阅读和project环境 Linux com 源码简介 操作系统的基本概念 任何计算机系统都包含一个基本的程序集合称为操作系统 内核进程管理进程调度进程间通讯机制内存管理中断异常处理文件系统IO系统网络部分 其他程序例如函数库shell程序等等 操作系统的目的 与硬件交互管理所有的硬件资源 为用户程序应用程序提供一个良好的执行环境 I386系统的基本概念 代码的运行 堆栈的概念 内核态与用户态 中断异常系统调用 虚拟内存 代码的运行 关键寄存器 cs eip总是指向下一条的指令地址 顺序执行总是指向地址连续的下一条指令 跳转分支执行这样的指令的时候cs eip的值会根据程序需要被修改 call将当前cs eip的值压入栈顶cs eip指向被调用函数的入口地址 ret从栈顶弹出原来保存在这里的cs eip的值放入cs eip中 发生中断时 I386系统的基本概念 代码的运行 堆栈的概念 内核态与用户态 中断异常系统调用 虚拟内存 堆栈的概念 堆栈是C语言程序运行时必须的一个记录调用路径和参数的空间 函数调用框架 传递参数 保存返回地址 提供局部变量空间 等等 C语言编译器对堆栈的使用有一套的规则 了解堆栈存在的目的和编译器对堆栈使用的规则是理解操作系统一些关键性代码的基础 以x86体系结构为例 堆栈寄存器和堆栈操作 堆栈相关的寄存器 esp堆栈指针stack pointer ebp基址指针base pointer 堆栈操作 push 栈顶地址减少4个字节32位 pop 栈顶地址增加4个字节 ebp在C语言中用作记录当前函数调用基址 利用堆栈实现函数调用和返回 函数堆栈框架的形成 call xxx 执行call之前 执行call时cs eip原来的值 指向call下一条指令该值被 保存到栈顶然后cs eip的值 指向xxx的入口地址 进入xxx 第一条指令 pushl ebp 第二条指令 movl esp ebp 函数体中的常规操作可能会压栈出栈 退出xxx movl ebpesp popl ebp ret C语言中还使用堆栈进行 参数的传递 局部变量的使用 一段小程序 源文件testc 这是一个很简单的C程序 main函数中调用了函数p1和p2 首先使用gcc生成testc的可执行文件test 然后使用objdump –S获得test的反汇编文件 观察程序运行时堆栈的变化 另一段小程序 和前一段小程序稍有不同 观察程序运行时堆栈的变化 I386系统的基本概念 代码的运行 堆栈的概念 内核态与用户态 中断异常系统调用 虚拟内存 用户态和内核态的概念 Why 假定不区分 用户直接修改操作系统的数据 用户直接调用操作系统的内部函数 用户直接操作外设 用户任意读写物理内存 因此要区分用户态和内核态 禁止用户程序和底层硬件直接打交道 最简单的例子如果用户程序往硬件控制寄存器写入不恰当的值可能导致硬件无法正常工作 禁止用户程序访问任意的物理内存 否则可能会破坏其他程序的正常执行如果对核心内核所在的地址空间写入数据的话会导致系统崩溃 什么是用户态和内核态 一般现代CPU都有几种不同的指令执行级别 在高执行级别下代码可以执行特权指令访问任意的物理地址这种CPU执行级别就对应着内核态 而在相应的低级别执行状态下代码的掌控范围会受到限制只能在对应级别允许的范围内活动 举例 intel x86 CPU有四种不同的执行级别0-3Linux只使用了其中的0级和3级分别来表示内核态和用户态 如何区分一段代码是核心态还是用户态 cs寄存器的最低两位表明了当前代码的特权级 CPU每条指令的读取都是通过cseip这两个寄存器 其中cs是代码段选择寄存器eip是偏移量寄存器 上述判断由硬件完成 一般来说在Linux中地址空间是一个显著的标志0xc以上的地址空间只能在内核态下访问0x-0xbfffffff的地址空间在两种状态下都可以访问 注意这里所说的地址空间是逻辑地址而不是物理地址 I386系统的基本概念 代码的运行 堆栈的概念 内核态与用户态 中断异常系统调用 虚拟内存 中断和异常 中断广义会改变处理器执行指令的顺序通常与CPU芯片内部或外部硬件电路产生的电信号相对应 中断异步的 由硬件随机产生在程序执行的任何时候可能出现 异常同步的 在特殊的或出错的指令执行时由CPU控制单元产生 我们用中断信号来通称这两种类型的中断 中断信号的作用 中断信号提

文档评论(0)

sanshengyuan + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档