已阅读5页,还剩47页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Linux内核分析与实例精讲 大连理工大学软件学院邱铁综合楼413 Tel 0411 87571632E mail qiutie 第一章 Linux操作系统绪论 注 此部分为内核分析的前导 主要内容Linux简介一些预备知识操作系统基本概念堆栈内核态vs用户态虚拟内存 关于自由软件 1984年1月 RichardMatthewStallman启动了GNU GNU sNotUnix 计划 开始编写新的编译器 名为GCC theGNUCompilerCollection 1985年初字处理器GNUEmacs开发成功 任何人都可以用150美元的价格获得全部程序 由此 Stallman设立了一个基金会 自由软件基金会 FreeSoftwareFoundation FSF Stallman于1989年与一群律师起草了广为使用的GNU通用公共协议证书 GNUGeneralPublicLicense GNUGPL 1991年芬兰大学生LinusTorvalds在GPL条例下发布他自己创作的Linux操作系统内核 至此GNU计划正式完成 操作系统被命名为GNU Linux 或简称Linux 什么是Linux Linux是一个类Unix Unix like 的操作系统 在1991年发行了它的第一个版本在不同的语境下 Linux 具有不同的内涵 例如 Linux内核 Linux系统或Linux开发套件等术语 严格来说 Linux指的是LinusTorvalds维护的 及通过主要镜像网站发布的 内核 GNU LinuxGNU Linux的拥护者们认为 Linux仅仅是指Linux内核 而整个Linux系统的大部分都建立在GNU软件之上 Linux发展简史 1991年11月 芬兰赫尔辛基大学的学生LinusTorvalds写了个小程序 取名为Linux 放在互联网上 他表达了一个愿望 希望借此搞出一个操作系统的 内核 来 这完全是一个偶然事件1993 在一批高水平黑客的参与下 诞生了Linux1 0版1994年 Linux的第一个商业发行版Slackware问世 1996年 美国国家标准技术局的计算机系统实验室确认Linux版本1 2 13 由OpenLinux公司打包 符合POSIX标准2001年 Linux2 4版内核发布2003年 Linux2 6版内核发布 PortableOperatingSystemInterfaceStandard可移植操作系统接口标准由IEEE制订 并由ISO接受为国际标准 InstituteforElectricalandElectronicEngineers电气电子工程师学会 美 InternationalOrganizationforStandardization国际标准化组织制定各行各业各种产品和服务的技术规范 国际标准 Linus说 Linux所取得的许多成功其实可以归结为他的缺点所致 我很懒散 我喜欢授权给其他人 就连Linux的企鹅形象标识也是Linus的妻子 曾获芬兰空手道冠军的托芙 Tove 想到的 因为李纳斯曾经在澳大利亚被一只企鹅咬过 Linus是这样说的 黑客们 不 程序员们 把在Linux和其它开放源代码项目上的工作 放在比睡觉 锻炼身体 娱乐和聚会更优先的地位 因为他们乐于成为一个全球协作努力活动的一部分 Linux是世界上最大的协作项目 Microsoftisn tevil theyjustmakereallycrappyoperatingsystems Linux操作系统的主要内容 Linux是免费的 源代码开放的 符合POSIX标准规范的操作系统拥有现代操作系统具有的所有内容 例如抢占式多任务处理 支持多用户内存保护 支持SMP 支持TCP IP 支持绝大多数的32位和64位CPU等还有一些其他操作系统没有的特色 比如NFS VFS 高效的EXT系列文件系统等 Linux版本 Linux的内核版本几种流行的Linux发行版本 Linux的内核版本 Linux内核版本是由LinusTorvalds作为总体协调人的Linux开发小组 分布在各个国家的近百位高手 开发出的系统内核的版本号Linux内核采用的是双树系统一棵是稳定树 主要用于发行另一棵是非稳定树或称为开发树 用于产品开发和改进Linux内核版本号由3位数字组成 r x y 第1位数字r为主版本号 第2位数字x为说明版本类型的次版本号 如果x为偶数 则表示为产品化版本 为奇数时表示为实验版本 第3位数字y为修改号 表示错误修补的次数 几种流行的Linux发行版本 Linux系统的好处 支持多种CPUX86 ARM MIPS SH i960 PPC etc 开放源代码 Opensource 强大的网络功能可移植性使用GNUtools 一个新潮 非常稳定 多用户 多任务的环境标准的平台无法超越的计算能力 可移动性和适应性先进的图形用户界面几十个出色而且免费的桌面应用程序成千上万个免费的工具和应用小程序专业程序由全世界的无数研究人员 网络黑客编制 覆盖了天文 信息技术 化学 物理 工程 语言 生物等各个学科领域 一个真正杰出的学习系统很多顶级的系统开发平台 友好的编程语言及编程工具都免费包含在操作系统里面病毒入侵 计算机的 后门 软件提供商的 特别要求 强迫性的软件升级 专有的文件格式 软件使用许可证和市场策略 产品注册登记 高得惊人的软件价格 等等 Linux都 没有 Linux操作系统平台保证它的 永久性 一个技术快速更新的平台 一些预备知识 操作系统的基本概念 任何计算机系统都包含一个基本的程序集合 称为操作系统 内核 进程管理 进程调度 进程间通讯机制 内存管理 中断异常处理 文件系统 I O系统 网络部分 其他程序 例如函数库 shell程序等等 操作系统的目的与硬件交互 管理所有的硬件资源为用户程序 应用程序 提供一个良好的执行环境 一个典型的Linux操作系统的结构 用户应用程序 Systemcall 对硬件资源的管理 Shell lib Kernelimplementation 最简单也是最复杂的操作 在控制台下输入ls命令 Shell程序分析输入参数 确定这是ls命令 调用系统调用fork生成一个shell本身的拷贝 什么是系统调用 为什么我们敲击键盘就会在终端上显示 fork是什么 为什么要调用fork 中断的概念 终端控制台设备驱动的概念 保护模式和实模式 内存保护 内核态用户态相关问题 进程的描述 进程的创建 系统调用是怎么实现的 软中断 异常的概念 陷阱门 系统门 调用exec系统调用将ls的可执行文件装入内存 内存管理模块 进程的地址空间 分页机制 文件系统 从系统调用返回 如何做到正确的返回 堆栈的维护 寄存器的保存与恢复 Shell和ls都得以执行 进程的调度 运行队列等待队列的维护 一些基本但很重要的概念 堆栈内核态vs用户态虚拟内存 堆栈 堆栈是C语言程序运行时必须的一个记录调用路径和参数的空间函数调用框架传递参数保存返回地址提供局部变量空间等等C语言编译器对堆栈的使用有一套的规则了解堆栈存在的目的和编译器对堆栈使用的规则是理解操作系统一些关键性代码的基础 堆栈寄存器和堆栈操作 堆栈相关的寄存器esp 堆栈指针 stackpointer ebp 基址指针 basepointer 堆栈操作push栈顶地址减少4个字节 32位 pop栈顶地址增加4个字节ebp在C语言中用作记录当前函数调用基址 esp ebp 高地址 低地址 esp 利用堆栈实现函数调用和返回 其他关键寄存器cs eip 总是指向下一条的指令地址顺序执行 总是指向地址连续的下一条指令跳转 分支 执行这样的指令的时候 cs eip的值会根据程序需要被修改call 将当前cs eip的值压入栈顶 cs eip指向被调用函数的入口地址ret 从栈顶弹出原来保存在这里的cs eip的值 放入cs eip中发生中断时怎么办 调用者 calltarget 建立被调用者函数的堆栈框架pushl ebpmovl esp ebp 拆除被调用者函数的堆栈框架movl ebp esppopl ebpret 被调用者函数体 dosth call指令 1 将下一条指令的地址A保存在栈顶2 设置eip指向被调用程序代码开始处 将地址A恢复到eip中 函数堆栈框架的形成 callxxx执行call之前执行call时 cs eip原来的值指向call下一条指令 该值被保存到栈顶 然后cs eip的值指向xxx的入口地址进入xxx第一条指令 pushl ebp第二条指令 movl esp ebp函数体中的常规操作 可能会压栈 出栈退出xxxmovl ebp esppopl ebpret esp ebp 高地址 低地址 cs eip esp ebp esp ebp esp C语言中还使用堆栈进行参数的传递局部变量的使用 一段小程序 源文件 test c这是一个很简单的C程序main函数中调用了函数p1和p2首先使用gcc生成test c的可执行文件test然后使用objdump S获得test的反汇编文件 观察p2的堆栈框架 从test的反汇编文件中找到p2的反汇编代码intp2 intx inty push ebpmov esp ebpreturnx y mov0 xc ebp eaxadd0 x8 ebp eax pop ebpret 建立框架 拆除框架 ebp esp ebp 调用者堆栈框架 esp ebp y x 高地址 低地址 观察main函数是如何传递参数给p2的 z p2 x y pushl0 xfffffff8 ebp pushl0 xfffffff4 ebp call804839badd 0 x8 espmov eax 0 xfffffffc ebp printf d d d n z x y pushl0 xfffffff8 ebp pushl0 xfffffff4 ebp pushl0 xfffffffc ebp push 0 x8048510call80482b0 p2的返回值是如何返回给main的 调用者堆栈框架 esp ebp y的值 x的值 高地址 低地址 被调用者堆栈框架 ebp cs eip esp ebp esp esp ebp 观察main中的局部变量 intmain void push ebpmov esp ebpsub 0 x18 esp charc a movb 0 x61 0 xfffffff3 ebp intx y z x 1 movl 0 x1 0 xfffffff4 ebp y 2 movl 0 x2 0 xfffffff8 ebp 调用者 ebp esp ebp esp esp c a x 1 y 2 高地址 低地址 eip eip eip eip 观察程序运行时堆栈的变化 main p1 c p2 x y p1 p2 main p2 p1 程序的代码段 堆栈 eip esp main堆栈 c eip eip eip p1的堆栈 esp eip eip eip x y eip p2堆栈 eip 另一段小程序和前一段小程序稍有不同 在这个小程序中 main函数中调用了函数p2 而在p2的执行过程中又调用了函数p1 观察程序运行时堆栈的变化 eip eip eip eip main p2 x y p1 p2 p1 c main p2 p1 程序的代码段 堆栈 eip esp main堆栈 esp eip eip x y eip p2堆栈 eip eip eip eip c eip p1堆栈 esp 观察堆栈在内核中的使用 在内核代码中经常有这样的函数 它的参数是structpt regs regs可以往回一层层的寻找这个参数是怎么传递过来的 最后我们可以发现最源头的函数使用了这样的参数structpt regsregs比如voiddo IRQ structpt regsregs 如果再进一步寻找是谁调用了这个do IRQ 我们会发现只是一条简单的汇编语句calldo IRQ 为什么要有pt regs结构 用户态vs内核态寄存器上下文从用户态切换到内核态时必须保存用户态的寄存器上下文要保存哪些 保存在哪里 中断 int指令会在堆栈上保存一些寄存器的值如 用户态栈顶地址 当时的状态字 当时的cs eip的值 pt regs结构 SAVE ALL和RESTORE ALL do IRQ的调用方式 仔细阅读一下与之相连的汇编码pushl n 256SAVE ALLcalldo IRQjmpret from intr do IRQ的函数定义方式 regparm x x 0 告诉gcc不通过堆栈而通过寄存器传 x是参数个数 寄存器依此使用EAX EDX ECX 而asmlinkage则使得编译器不通过寄存器 x 0 而使用堆栈传递参数 因此 do IRQ将栈顶的内容看成pt regs结构的参数 在必要时可以通过访问这里的内容获得信息 用户态和内核态的概念 Why 假定不区分用户直接修改操作系统的数据用户直接调用操作系统的内部函数用户直接操作外设用户任意读 写物理内存这么做 系统安全吗 因此 要区分用户态和内核态 禁止用户程序和底层硬件直接打交道 最简单的例子 如果用户程序往硬件控制寄存器写入不恰当的值 可能导致硬件无法正常工作 禁止用户程序访问任意的物理内存 否则可能会破坏其他程序的正常执行 如果对核心内核所在的地址空间写入数据的话 会导致系统崩溃 什么是用户态和内核态 一般现代CPU都有几种不同的指令执行级别在高执行级别下 代码可以执行特权指令 访问任意的物理地址 这种CPU执行级别就对应着内核态而在相应的低级别执行状态下 代码的掌控范围会受到限制 只能在对应级别允许的范围内活动举例 intelx86CPU有四种不同的执行级别0 3 Linux只使用了其中的0级和3级分别来表示内核态和用户态 如何区分一段代码是核心态还是用户态cs寄存器的最低两位表明了当前代码的特权级CPU每条指令的读取都是通过cs eip这两个寄存器 其中cs是代码段选择寄存器 eip是偏移量寄存器 上述判断由硬件完成一般来说在Linux中 地址空间是一个显著的标志 0 xc0000000以上的地址空间只能在内核态下访问 0 x00000000 0 xbfffffff的地址空间在两种状态下都可以访问注意 这里所说的地址空间是逻辑地址而不是物理地址 虚拟内存 物理内存有限 是一种稀缺资源局部性原理空间局部性
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年内蒙古电子信息职业技术学院单招职业技能测试必刷测试卷带答案解析
- 2026年山东理工职业学院单招职业适应性考试必刷测试卷带答案解析
- 2026年吉林省白城市单招职业适应性测试必刷测试卷带答案解析
- 2026年四川托普信息技术职业学院单招职业适应性测试必刷测试卷附答案解析
- 基因组学在儿童生长激素缺乏症中的应用研究
- 房屋扩建加固协议书
- 房屋撤出安全协议书
- 房屋泡水修补协议书
- 房屋盖瓦工程协议书
- 房屋认购会员协议书
- 药剂证书考试题库及答案
- 前庭大腺囊肿课件
- 四川美术学院2025年设计考研《64中外设计史》真题与试题解析及答案
- 江苏省2026年普通高中学业水平合格性考试英语仿真模拟卷01(春季高考适用)(全解全析)
- 2025年中铁党建考试试题及答案
- 管业制造安全应急预案范文
- 雨课堂学堂云在线《医患沟通与调适(广州医大 )》单元测试考核答案
- 人工运动场草坪施工方案
- 专科会计职业生涯规划
- 2025届高三八省联考(四川)政治试题及答案
- 制药行业质量意识培训
评论
0/150
提交评论