linux设备驱动归纳总结一内核的相关基础概念.docx

上传人:b****1 文档编号:2392467 上传时间:2022-10-29 格式:DOCX 页数:11 大小:197.68KB
下载 相关 举报
linux设备驱动归纳总结一内核的相关基础概念.docx_第1页
第1页 / 共11页
linux设备驱动归纳总结一内核的相关基础概念.docx_第2页
第2页 / 共11页
linux设备驱动归纳总结一内核的相关基础概念.docx_第3页
第3页 / 共11页
linux设备驱动归纳总结一内核的相关基础概念.docx_第4页
第4页 / 共11页
linux设备驱动归纳总结一内核的相关基础概念.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

linux设备驱动归纳总结一内核的相关基础概念.docx

《linux设备驱动归纳总结一内核的相关基础概念.docx》由会员分享,可在线阅读,更多相关《linux设备驱动归纳总结一内核的相关基础概念.docx(11页珍藏版)》请在冰豆网上搜索。

linux设备驱动归纳总结一内核的相关基础概念.docx

linux设备驱动归纳总结一内核的相关基础概念

一.linux设备驱动的作用

内核:

用于管理软硬件资源,并提供运行环境。

如分配4G虚拟空间等。

linux设备驱动:

是连接硬件和内核之间的桥梁。

linux系统按个人理解可按下划分:

应用层:

包括POSIX接口,LIBC,图形库等,用于给用户提供访问 内核的接口。

属于用户态,ARM运行在用户模式(usr)或 者系统模式(sys)下。

内核层:

应用程序调用相关接口后,会通过系统调用,执行SWI指 令切换ARM的工作模式到超级用户(svc)模式下,根据用 户函数的要求执行相应的操作。

硬件层:

硬件设备,当用户需要操作硬件时,内核会根据驱动接口 操作硬件设备

图结构如下:

举一个相对比较邪恶的类比:

在深圳的酒店经常会在门缝看到一些卡片,上面说可以通过打电话送货上门提供某中服务。

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

二.内核代码树介绍

linux-2.6.29

|-arch:

 包含和硬件体系结构相关的代码

|-block:

 硬盘调度算法,不是驱动

|-firmware:

 固件,如BOIS

|-Documentation:

 标准官方文档

|-dirver:

linux设备驱动

|-fs:

 内核所支持的文件体系

|-include :

头文件。

linux/module.hlinux/init.h 常用库。

|-init :

库文件代码,C库函数在内核中的实现。

init/main.c->start_kernel->内核执行第一条代码

|-ipc:

 进程件通信

|-mm :

内存管理

|-kernel:

 内核核心部分,包括进程调度等

|-net :

网络协议

|-sound:

 所有音频相关

其中,跟设备驱动有关并且经常查阅的文件夹有:

init

include:

linux,asm-arm

drivers:

arch:

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

三.内核补丁:

补丁一般都是基于某个版本内核生成的,用于升级旧内核。

打补丁需要注意:

1.对应版本的补丁只能用于对应版本的内核。

2.如果在已打补丁的内核再打补丁,需要先卸载原来补丁。

打补丁的方法:

1.制作补丁:

diff-Nurlinux-2.6.30/linux-2.6.30.1/>linux-2.6.30.1.patch

//N为新加的文件全部修改

//linux-2.6.30 旧版本

//linux-2.6.30.1 新版本

//目标补丁

2.打补丁:

cdlinux-2.6.30//!

注意在原文件夹的目录中打补丁

patch-p1<../linux-2.6.30.1.patch//-p1是忽略一级目录

3.恢复:

cdlinux-2.6.30//!

注意在原文件夹的目录中打补丁

patch-R<../linux-2.6.30.1.patch//撤销补丁

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

四.内核中的Makefile:

对于内核,Makefile分为5类:

Documentation/kbuild/makefiles.txt描述如下:

50TheMakefileshavefiveparts:

51

52Makefile 总Makefile,控制内核的编译

53.config 内核配置文件,配置内核时生成, 如makemenuconfig后

54arch/$(ARCH)/Makefile 对应体系结构的Makefile

55scripts/Makefile.*Makefile共用的规则

56kbuildMakefiles 各子目录下的Makefile,被上层的Makefile调用。

简单来说,编译内核会执行以下两步骤,它们分别干了以下的事情。

1一般的,我们会拷贝一个对应体系结构的配置文件到主目录下并改名为 .config,这样就在makemenuconfig生成的图形配置中 已经有了一些默认的配置,减少用户的劳动量。

不过这一步不做也没关系的。

2.makemenuconfig

2.1、由总Makefile决定编译的体系结构(ARCH). 编译工具(CROSS_COMPILE),并知道需要进去哪些内核根下的哪些目录进行编译。

2.2、由arch/$(ARCH)/Makefile,决定arch/$(ARCH)下还有 的哪些目录和文件需要编译。

2.3、知道了需要编译的目录后,递归的进入哪些目录下,读取每一个Kconfig的信息,生成了图形配置的界面。

2.4、通过我们在图形配置界面中选项为[*]、[M]或者[]。

2.5、保存并退出配置,会根据配置生成一份新的配置文件.config,并在同时生成include/config/auto.conf(这是.config的去注释版)。

文件里面保存着CONFIG_XXXX等变量应该取y还是取m。

3.make

3.1、根据Makefile包含的目录和配置文件的要求,进去个子目录进行编译,最后会在各子目录下 生成一个.o或者.a文件,然后总Makefile指定的连接脚本 arch/$(ARCH)/kernel/vmlinux.lds生成vmlinux,并通过 压缩编程bzImage,或者按要求在对应的子目录下编译成 模块。

但是,具体是怎么生成配置文件的呢?

注:

我使用的内核是2.6.29。

1.在总Makefile中,根据以下语句进入需要编译的目录

470#Objectswewilllinkintovmlinux/subdirsweneedtovisit

471init-y:

=init/

472drivers-y:

=drivers/sound/firmware/

473net-y:

=net/

474libs-y:

=lib/

475core-y:

=usr/

476endif#KBUILD_EXTMOD

639core-y+=kernel/mm/fs/ipc/security/crypto/block/

上面说明了,根目录下的init、driver、sound、firmware、net、lib、usr等目录,在编译时都会进去读取目录下的Makefile并进行编译。

2.在总Makefile中包含的目录还是不够的,内核还需要根据对应的CPU体系架构,

决定还需要将哪些子目录将要编译进内核。

在总Makefile中有一个语句:

529include$(srctree)/arch/$(SRCARCH)/Makefile//在这里,我定义SRCARCH=arm

可以看出,在总Makefile中进去读取相应体系 结构的Makefile->arch/$(SRCARCH)/Makefile。

arch/$(SRCARCH)/Makefile中指定arch/$(SRCARCH)路径下的哪些子目录需要被编译。

在 arch/arm/Makefile 下:

95head-y:

=arch/arm/kernel/head$(MMUEXT).oarch/arm/kernel/init_task.o

187#Ifwehaveamachine-specificdirectory,thenincludeitinthebuild.

188core-y+=arch/arm/kernel/arch/arm/mm/arch/arm/common/

189core-y+=$(machdirs)$(platdirs)

190core-$(CONFIG_FPE_NWFPE)+=arch/arm/nwfpe/

191core-$(CONFIG_FPE_FASTFPE)+=$(FASTFPE_OBJ)

192core-$(CONFIG_VFP)+=arch/arm/vfp/

193

194drivers-$(CONFIG_OPROFILE)+=arch/arm/oprofile/

195

196libs-y:

=arch/arm/lib/$(libs-y)

上面看到,指定需要进入arch/arm/kernel/、arch/arm/mm/、arch/arm/common/ 等目录编译,至于core-y、 core-$(CONFIG_FPE_NWFPE)这些是什么东西呢?

其中,y表示编译成模块,m表示编译进内核(上面没有,因为默认情况下ARM全部编译进 内核),但$(CONFIG_OPROFILE)又是什么呢?

 这些是根据用户在makemenuconfig中设置后,生成的值赋给了CONFIG_OPROFILE。

3.那makemenuconfig后的配置信息是怎么来的?

这是由各子目录下的Kconfig提供选项功用户选择并配置。

如arch/arm/Kconfig。

 所有的配置都是根据arch/$(ARCH)/Kconfig文件通过Kconfig的语法source读取 各个包含的子目录Kconfig来生成一个配置界面。

每个Makefile目录下都有一个 对应的Kconfig文件,用于生成配置界面来给用户决定内核如何配置,配置后会确定一个。

 CONFIG_XXX的的值(如上面的CONFIG_OPROFILE),来决定编译进内核,还是编译成模块或者不编译。

如在arch/arm/Kconfig下:

595source"arch/arm/mach-clps711x/Kconfig"

596

597source"arch/arm/mach-ep93xx/Kconfig"

598

599source"arch/arm/mach-footbridge/Kconfig"

600

601source"arch/arm/mach-integrator/Kconfig"

602

603source"arch/arm/mach-iop32x/Kconfig"

604

605source"arch/arm/mach-iop33x/Kconfig"

这些就是用来指定,需要读取以下目录下的Kconfig文件来生成一个使用makemenuconfig时的配置界面。

至于子目录下的Kconfig是怎么样的,待会介绍。

总结Kconfig的作用:

3.1.在makemenuconfig下可以配置选项;

3.2.在.config中确定CONFIG_XXX的的值。

4.只是读取以上的两个Makefile还是不够了,内核还会把包含的子目录一层一层的 读取它里面的Makefile和Kconfig。

上面啰啰嗦嗦地讲了这么久,无非就是想说,内核的编译并不是一个Makefile搞定的,需要通过根目录下的总Makefile来包含一下子Makefile(不管是根目录下的子目录还是/arch/arm中的子目录)。

而Kconfig,为用户提供一个交互界面来选择如何配置并生成配置选项。

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 面试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1