6第六部分-嵌入式linux内核裁剪讲课教案

上传人:youn****329 文档编号:130273464 上传时间:2020-04-26 格式:PPT 页数:32 大小:509KB
返回 下载 相关 举报
6第六部分-嵌入式linux内核裁剪讲课教案_第1页
第1页 / 共32页
6第六部分-嵌入式linux内核裁剪讲课教案_第2页
第2页 / 共32页
6第六部分-嵌入式linux内核裁剪讲课教案_第3页
第3页 / 共32页
6第六部分-嵌入式linux内核裁剪讲课教案_第4页
第4页 / 共32页
6第六部分-嵌入式linux内核裁剪讲课教案_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《6第六部分-嵌入式linux内核裁剪讲课教案》由会员分享,可在线阅读,更多相关《6第六部分-嵌入式linux内核裁剪讲课教案(32页珍藏版)》请在金锄头文库上搜索。

1、1 嵌入式linux内核裁减 丁男Dingnan cn 嵌入式系统软件设计 2 为什么要裁减内核 自己定制编译的内核运行更快 具有更少的代码 系统将拥有更多的内存 内核部分将不会被交换到虚拟内存中 不需要的功能编译进入内核可能会增加被系统攻击者利用的漏洞将某种功能编译为模块方式会比编译到内核内的方式速度要慢一些 4 内核的模块式结构 内核模块是Linux内核向外部提供的一个接口 其全称为动态可加载内核模块 LoadableKernelModule LKM 简称为模块 Linux内核之所以提供模块机制 是因为它本身是一个单内核 monolithickernel 单内核的最大优点是效率高 因为所有

2、的内容都集成在一起 但其缺点是可扩展性和可维护性相对较差 模块机制就是为了弥补这一缺陷 5 模块 模块是具有独立功能的程序 它可以被单独编译 但不能独立运行 它在运行时被链接到内核作为内核的一部分在内核空间运行 这与运行在用户空间的进程是不同的 模块通常由一组函数和数据结构组成 用来实现一种文件系统 一个驱动程序或内核中其他上层的功能 6 模块与内核的关系 模块和内核都在内核空间运行 模块编程在一定意义上就是内核编程 因为内核版本的每次变化使得其中的某些函数名也会相应地发生变化 因此模块编程与内核版本密切相关 本课中所涉及的内核编程基于的Linux内核为2 4 x版本 对于其他版本 可能还需要

3、做一些调整 7 应用程序与内核模块的比较 8 名字空间污染namespacepullution 当存在大量的函数和全局变量 并且它们的名字没有明确的含义以至于难以区别时 就会发生所谓的名字空间污染 程序员需花费更多的时间和精力去记住这些已经保留的名字并为新符号寻找一个不重复的名字 名字空间冲突可能照成很多问题 如加载模块失败等古怪问题解决办法将所有符号定义为静态变量对于非全局变量的符号前加上一个内核中唯一的前缀 9 用户空间与内核空间 操作系统的作用为程序提供一个计算机硬件的一致视图 负责程序的独立操作以及保护资源不受非法访问 内核运行在最高级 管理员模式supervisormode 可以进行

4、所有操作 应用程序运行在优先级最低即所谓的用户模式 usermode 在这一级中处理器控制着对硬件的直接访问以及对内存的非授权访问 10 lsmod查看已注册的内核 11 内核模块实例 define KERNEL defineMODULE include includeinthello init void printk HellowWorld n return0 voidhello exit void printk Goodbye cruelworld n module init hello init module exit hello exit 12 模块主要函数及定义 头文件及宏定义 de

5、fine KERNEL defineMODULE include includemodule init 模块的初始化函数 module exit 模块的卸载函数 初始化函数和卸载函数必须成对出现 模块常用信息 作者 描述 版权等 MODULE AUTHOR author MODULE DESCRIPTION thedescription MODULE LICENSE GPL 13 模块的编译 KDIR arm2410s kernel 2410sKDIR usr src 2 4 30 8INCLUDEDIR KDIR includeCFLAGS D KERNEL DMODULE I INCLUD

6、EDIR CC arm linux gccCC gccOBJS hello o OBJS hello c CC CFLAGS c clean rm f OBJS o 14 模块的加载与卸载 Insmod hello ormmodhello 15 modutils modutils是管理内核模块的一个软件包 用户可以在任何提供内核源代码的地方获取modutils modutils x y z tar gz 源代码 然后选择最高级别的 patch x y z等于或小于当前版本的内核版本 安装后在 sbin目录下就会有insmod rmmod ksyms lsmod modprobe等实用程序 当然

7、 通常在加载Linux内核时 modutils已经被载入 16 Modutils的常用命令 insmod命令调用insmod程序 把需要插入的模块以目标代码的形式插入到内核中 在插入的时候 insmod自动调用init module 函数运行 注意 只有超级用户才能使用这个命令 格式 insmod path modulename ormmod命令调用rmmod程序 将已经插入内核的模块从内核中移出 rmmod会自动运行cleanup module 函数 格式 rmmodmodulename 17 Modutils的常用命令 lsmod命令调用lsmod程序将显示当前系统中正在使用的模块信息 实

8、际上这个程序的功能就是读取 proc modules文件中的数据 格式为 lsmodksyms命令Ksyms这个程序用来显示内核符号和模块符号表的信息 与lsmod相似 它的功能是读取 proc文件系统中另一个文件 proc ksyms的内容 18 模块的导出 和用户空间的应用程序不同的是 引入一个模块的目的常常是为了给内核提供一些routine 来完成特定的功能 很少有模块什么符号都不导出 Linux为用户提供了如下宏 EXPORT SYMBOL var 输出symbolvarEXPORT SYMBOL GPL var 输出的symbol版权为GPL 19 内核符号表 模块与模块之间的共享方

9、式共享变量函数内核只把各个模块中主要的变量和函数放在一个特定的区段 这些变量和函数统称为符号 对于内核这个特殊的母模块 在kernel ksyms c中定义了可以从中 移出 的符号 20 interrupthandling EXPORT SYMBOL add timer EXPORT SYMBOL del timer EXPORT SYMBOL request irq EXPORT SYMBOL free irq if defined CONFIG IA64 irq statispartofstructcpuinfo ia64 EXPORT SYMBOL irq stat endif 21 模

10、块的依赖关系 模块依赖如前所述 内核符号表记录了所有模块可以访问的符号及相应的地址 当一个新的模块被装入内核后 它所声明的某些符号就会被登记到这个表中 使这些符号可能被其他模块所引用 这就引出了模块依赖问题 一个模块A引用从另一个模块B中移出的符号 叫做模块B被模块A引用 或者模块A依赖模块B 如果要链接模块A 必须先链接模块B 这种模块间相互依赖的关系叫做模块依赖 22 模块引用计数器 为了确保安全地卸载模块 每个模块都有一个引用计数器 当执行模块所涉及的操作时就递增该模块的计数器 在操作结束时就递减这个计数器 另外 当模块B被模块A引用时 模块B的引用计数器就递增 引用结束 计数器递减 什

11、么时候可以卸载这个模块 当然只有这个计数器值为0的时候 例如 当一个文件系统还安装在系统中时就不能将其卸载 而当这个文件系统不再被使用时 引用计数器为0 可以卸载 在linux module h文件中定义了如下三个宏来维护计数器 MODINCUSECOUNT当前模块计数器加1MODDECUSECOUNT当前模块计数器减1MODmUSE计数器非0时返回真 23 内核的编译 24 内核简介 内核是一个操作系统的核心 它负责管理系统的进程 内存 设备驱动程序 文件和网络系统 决定着系统的性能和稳定性 Linux的一个重要特点就是其源代码的公开性 其所有的内核源程序都可以在 usr src Linux

12、下找到 大部分应用软件都是遵循GPL设计的 用户可以获取相应的源程序代码 25 配置内核所需指令 makeconfig基于文本的 最为传统的配置界面 makemenuconfig基于文本菜单的配置界面 字符终端下推荐使用 makexconfig基于图形窗口模式的配置界面 Xwindow环境下推荐使用 makeoldconfig如果只想在原来内核配置的基础上修改一些小地方 用此命令会省去不少麻烦 26 1 代码成熟度选项对那些还在测试阶段的代码 驱动模块等的支持 对那些已经老旧的 被现有文件替代了的驱动 代码的支持 可以不选 动态加载模块支持选项支持模块加载功能该项用来支持跨内核版本的模块支持

13、通过kerneld程序的帮助在需要的时候自动载入或卸载那些可载入式的模块 系统类型 主要是CPU类型 以及于此相关的内容 常用设备设置可热拔插的设备的支持网络支持systemV的进程间通讯支持在不重启情况下直接改变内选一个模拟数学协处理器电源管理 MTD flash RAM等 存储设备的设置支持对MTD的分区操作所有MTD设备提供一个字符设备 以便进行读写操作支持利用RAM芯片作为缓存来使用MTD设备对NANDflash进行设置 网络协议支持pppTcp ip 27 支持isdn服务若想启动该项支持ISDN通讯 应启动前面提到的NetworkingDevices中的SLIP或PPP 对输入设备

14、的支持键盘 鼠标 游戏手柄等 字符设备的设置虚拟终端虚拟终端控制台串口设置对I2C设备的支持 28 多媒体设备的支持对视频的支持 V4L 对音频的支持 文件系统的支持份额分配支持 支持对每个用户使用的磁盘空间进行限制 ROMfilesystemsupportEXT3EXT2网络文件系统 NFS 光驱的支持对各国语言的支持 一些有关内核调试及内核运行信息的选项可以全部关掉 控制台设备支持VGAtextconsolePc上使用FrameBuffer设备640 48016bps 29 内核选项 Y将该功能编译进内核 N不将该功能编译进内核 M将该功能编译成可以在需要时动态插入到内核中的模块 30 编

15、译命令 makedep makeclean makebzlmage或makezlmagemakedep实际上读取配置过程生成的配置文件 创建对应于配置的依赖关系树 从而决定哪些需要编译而哪些不需要 makeclean完全删除前面步骤留下的文件 以避免出现一些错误 makezlmage和makebzlmage命令则完全编译内核 二者生成的内核都是使用gzip压缩的 只要使用其中的一个命令就够了 它们的区别在于使用makebzlmage命令可以生成稍大一点的内核 这里建议大家使用makebzlmage命令 31 2 6内核 支持更多处理器 比如AMD64 一些大型机及嵌入式等 同时改进了对已有处理

16、器的支持 采用抢占式内核 使交互式操作的响应速度大大提高 修改了I O子系统部分 保证在各种工作负荷下I O都有很好的响应速度 改进和部分重写了Modules功能 使之更稳定 改进对USB的支持 使之能够支持当前多数主流的USB设备 加强对无线设备的支持 新内核合并了uCLinux 添加了新的体系结构和处理器类型 包括对无MMU系统的支持 实际上2 6版内核的很多新特性都是针对企业应用的改进 比如最大支持64个CPU 64GB内存 支持NUMA 非一致存储访问 等 对于普通PC用户 从2 6版内核中感受到的将是USB支持 响应速度 音频 无线设备 PDA等方面的提高 32 Linux2 6内核VSLinux2 4内核 服务器领域文件系统嵌入式系统Linux2 6内核扩展多嵌入式平台支持的一个主要途径就是把uCLinux的大部分并入主流内核功能中 目前许多嵌入式处理器如ARM系列等 很多都是MMU的 uCLinux在嵌入式系统中的应用非常广泛 因此 Linux2 6对无MMU体系结构的支持 及将Linux和uCLinux合并到统一的新内核中 无疑为Linux在嵌入式领域的广泛应用加重了砝

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号