嵌入式linux内核的配置及编译Fileppt课件

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

• 添加进内核的方式:
– 将新增加部分编译到内核中(build-in)
– 把新增加部分编译成模块(module),动态加载。
• 各自特点:
– 编译到内核中,在内核启动时就可以自动支持相应部 分的功能,这样的优点是方便、速度快,机器一启动, 用户就可以使用这部分功能了;缺点是会使内核变得 庞大起来,不管你是否需要这部分功能,它都会存在。 建议经常使用的部分直接编译到内核中,比如网卡。
内核裁剪篇
可编辑ppt
1
为什么要裁减内核
• 自己定制编译的内核运行更快(具有更少的代码) • 系统将拥有更多的内存(内核部分将不会被交换
到虚拟内存中) • 不需要的功能编译进入内核可能会增加被系统攻
击者利用的漏洞 • 将某种功能编译为模块方式会比编译到内核内的
方式速度要慢一些
可编辑ppt
2
如何升级内核
可编辑ppt
5
模块与内核的关系
• 模块和内核都在内核空间运行,模块编程 在一定意义上就是内核编程。因为内核版 本的每次变化使得其中的某些函数名也会 相应地发生变化,因此模块编程与内核版 本密切相关。本课中所涉及的内核编程基 于的Linux内核为2.4.x版本,对于其他 版本,可能还需要做一些调整。
• Linux为用户提供了如下宏: EXPORT_SYMBOL(var); // 输出symbol var EXPORT_SYMBOL_GPL(var); // 输出的 symbol版权为GPL
可编辑ppt
18
内核符号表
• 模块与模块之间的共享方式
– 共享变量
– 函数
• 内核只把各个模块中主要的变量和函数放 在一个特定 的区段,这些变量和函数统称 为符号。
• rmmod命令
– 调用rmmod程序,将已经插入内核的模块从内核中移 出。rmmod会自动运行 cleanup_module()函数,
– 格式:
#rmmod [path]modulename.o
可编辑ppt
16
Modutils的常用命令
• lsmod命令
– 调用lsmod程序将显示当前系统中正在使用的模块信 息。实际上这个程序的功能就是读取/proc/ modules文件中的数据。
• 模块常用信息:作者、描述、版权等,
MODULE_AUTHOR("author"); MODULE_DESCRIPTION("the description"); MODULE_LICENSE("GPL");
• 写内核或内核模块不能用写应用程序时的系统调用或函数
库.
可编辑ppt
12
模块的编译
KDIR = /YF2410/kernel INCLUDEDIR = $(KDIR)/include CFLAGS = -D__KERNEL__ -DMODULE -I$(INCLUDEDIR) CC = arm-linux-gcc
• 应用程序运行在优先级最低即所谓的用户模式 (user mode),在这一级中处理器控制着对硬 件的直接访问以及对内存的非授权访问。
可编辑ppt
9
lsmod 查看已注册的内核
可编辑ppt
10
内核模块实例
#define __KERNEL__
#define MODULE
#include<linux/module.h>
– 如果编译成模块,就会生成对应的.o文件,在使用的 时候可以动态加载,优点是不会使内核过分庞大,缺 点是你得自己来调用这些模块。
可编辑ppt
3
内核的模块式结构
• 内核模块是Linux内核向外部提供的一个接 口,其全称为动态可加载内核模块 (Loadable Kernel Module,LKM),简称 为模块。Linux内核之所以提供模块机制, 是因为它本身是一个单内核(monolithic kernel)。单内核的最大优点是效率高,因 为所有的内容都集成在一起,但其缺点是
#include<linux/kernel.h>
int init_module(voiห้องสมุดไป่ตู้)
{
printk("Hellow World!\n”);
return 0;
)
void cleanup_module(void)
{
printk("Goodbye,cruel world!\n”);
)
module_init(hello_init);
OBJS =hello.o
$(OBJS):hello.c $(CC) $(CFLAGS) -c $^
clean: -rm -f $(OBJS) *.o
可编辑ppt
13
模块的加载与卸载
• Insmod ./hello.o • rmmod hello
可编辑ppt
14
modutils
modutils是管理内核模块的一个软件包。 用户可以在任何提供内核源代码的地方获 取modutils(modutils-x.y.z.tar,gz)源 代码,然后选择最高级别的、 patch.x.y.z等于或小于当前版本的内 核版本,安装后在/sbin目录下就会有 insmod、rmmod、ksyms、lsmod、 modprobe等实用程序。当然,通常在加载 Linux内核时,modutils已经被载入。
一些有关内核调试及内核运行 信息的选项 可以全部关掉
可编辑ppt
27
内核选项
• Y 将该功能编译进内核。 • N 不将该功能编译进内核。 • M 将该功能编译成可以在需要时动态插入
到内核中的模块。
连接
gcc
Gcc
运行
直接运行
insmod
调试
gdb
可编k辑dppbt ug,kdb,kgdb等
7
名字空间污染
namespace pullution
• 当存在大量的函数和全局变量,并且它们的名字 没有明确的含义以至于难以区别时,就会发生所 谓的名字空间污染。
• 程序员需花费更多的时间和精力去记住这些已经 保留的名字并为新符号寻找一个不重复的名字。
可编辑ppt
20
模块引用计数器
• 为了确保安全地卸载模块,每个模块都有一个引用计数 器。当执行模块所涉及的操 作时就递增该模块的计数器, 在操作结束时就递减这个计数器。另外,当模块B被模块 A引用时,模块B的引用计数器就递增;引用结束,计数 器递减。什么时候可以卸载这 个模块?当然只有这个计 数器值为0的时候。例如,当一个文件系统还安装在系统 中时 就不能将其卸载,而当这个文件系统不再被使用时, 引用计数器为0,可以卸载。
可编辑ppt
6
应用程序与内核模块的比较
C语言应用程序 内核模块程序
使用函数 libc库
内核函数
运行空间 用户空间
内核空间
运行权限 普通用户
超级用户
入口函数 main()
init_module()
出口函数 exit()
cleanup_module()
编译
gcc -c
gcc –c –D __KERNEl__ _DMOKULE
– 格式为:
#lsmod
• ksyms命令
– Ksyms这个程序用来显示内核符号和模块符号表的信 息。与lsmod相似,它的功能是读取/proc文件系统中 另一个文件/proc/ksyms的内容
可编辑ppt
17
模块的导出
• 和用户空间的应用程序不同的是,引入一个模块 的目的常常是为了给内核提供一些routine,来完 成特定的功能,很少有模块什么符号都不导出。
25
可编辑ppt
支持isdn服务 若想启动该项支持ISDN通讯, 对应输启入动设前备面的提支到持的 字•虚键符NS拟盘L设e终tI、Pw备端或鼠o的rP标k设Pin、P置g。游D戏ev手ice柄s等中的 •虚拟终端控制台 •串口设置 •对I2C设备的支持
26
多媒体设备的支持 •对视频的支持(V4L) 文•对件音系频统的的支支持持 •份额分配支持。支持对每个用 户使用的磁盘空间进行限制。 控•制RO台M设fi备le支sy持stem support •V•EGXATt3ext console •61FP••••46rE网光对ca0bX上m×p络驱各Ts使e42文的国8B用件支语0uf系持言fe统的r设(支备持NF。S)
• Linux的一个重要特点就是其源代码的公 开性。其所有的内核源程序都可以在 /usr /src/Linux下找到,大部分应用软件都是 遵循GPL设计的,用户可以获取相应的源 程 序代码。
可编辑ppt
23
配置内核所需指令
• #make config 基于文本的、最为传统的配置界面。
• #make menuconfig 基于文本菜单的配置界面,字符终端下推荐使用。
module_exit(hello_exit)可;编辑ppt
11
模块主要函数及定义
• 头文件及宏定义
#define __KERNEL__
#define MODULE #include<linux/module.h> #include<linux/kernel.h>
• module_init():模块的初始化函数, module_exit():模块的卸载函数, 初始化函数和卸载函数必须成对出现。
• #make xconfig 基于图形窗口模式的配置界面,Xwindow环境下 推荐使用。
• #make oldconfig 如果只想在原来内核配置的基础上修改一些小地 方,用此命令会省去不少麻烦
可编辑ppt
24
1
可编辑ppt
代码成熟度选项 动•态对加那载些模还块在支测持试选阶项段的 常系型••本用统,支该代•现的对设类以持项码有模那备型及模用,文块些设,于块来驱件支已置主此加支动替持经要相载持模代。老是关功跨块了旧的C能内等的的P内核的驱U,容版类支动被持,。 网••TpM存••字操c络支所p••••接•器pT储符作可网s支选p协持有/Dyi•在卸改p通设设热络持一s(代议对Mt需载变e过备备拔支在个fT码支Mlm要那内aD的,k插持不模Ts的持V设e的些Dh设以的重拟的r支,n的备时可置便设启数进e持R分提l候载d进备情学程A,区供程自入M行的况协间可操一序动式等读支下处通以作个的载的)写持直理讯不帮入模选助或块。。 •支•电持源利管用理RAM芯片作为 缓存来使用MTD设备 •对NAND flash进行设置
可编辑ppt
15
Modutils的常用命令
• insmod命令
– 调用insmod程序,把需要插入的模块以目标代码的形 式插入到内核中。在插入的时候,insmod自动调用 init_module()函数运行。注意,只有超级用户才能使 用这个命令。
– 格式
#insmod [path]modulename.o
• 名字空间冲突可能照成很多问题,如加载模块失 败等古怪问题
• 解决办法
– 将所有符号定义为静态变量 – 对于非全局变量的符号前加上一个内核中唯一的前缀。
可编辑ppt
8
用户空间与内核空间
• 操作系统的作用
– 为程序提供一个计算机硬件的一致视图。 – 负责程序的独立操作以及保护资源不受非法访问。
• 内核运行在最高级(管理员模式 supervisor mode),可以进行所有操作。
• 在linux/module.h文件中定义了如下三个宏来维护 计数器:
– MOD INC USE COUNT 当前模块计数器加1
– MOD DEC USE COUNT 当前模块计数器减1
– MOD m USE 计数器非0时返回真
可编辑ppt
21
内核的编译
可编辑ppt
22
内核简介
• 内核是一个操作系统的核心。它负责管理 系统的进程、内存、设备驱动程序、文件 和网络系统,决定着系统的性能和稳定性。
• 对于内核这个特殊的母模块,在kemel/ ksyms.c中定义了可以从中“移出”的符 号。
可编辑ppt
19
模块的依赖关系
• 模块依赖
如前所述,内核符号表记录了所有模块可以 访问的符号及相应的地址。当一个新的 模块被装
入内核后,它所声明的某些符号就会被登记到这 个表中,使这些符号可能被其 他模块所引用,这 就引出了模块依赖问题。 一个模块A引用从另 一个模块B中移出的符号,叫做模块B被模块A引 用,或者 模块A依赖模块B。如果要链接模块A, 必须先链接模块B。这种模块间相互依赖的关 系 叫做模块依赖。
可扩展性和可维护性相对较差,模块机制 就是为了弥补这一缺陷。
可编辑ppt
4
模块
• 模块是具有独立功能的程序,它可以被单 独编译,但不能独立运行。它在运行时被 链接到内核作为内核的一部分在内核空间 运行,这与运行在用户空间的进程是不同 的。
• 模块通常由一组函数和数据结构组成,用 来实现一种文件系统、一个驱动程序或内 核中其他上层的功能。
相关文档
最新文档