Linux驱动程序如何linux驱动编译进内核核

当前位置: >
Linux内核配置、编译及Makefile简述
来源:装机员┆发布时间: 23:53┆点击:
装机员为您提供的文章咨询供您阅读,如何使用的方法对您有帮助也请您举手之劳分享给您身份的人。
最近在学习Linux内核的配置、编译及Makefile文件。今天总结一下学习成果,分享给大家。
1.解压缩打补丁
  首先是解压缩你获取到的Linux内核。这里我用到的是linux.2.22.6版本的内核。在Linux下命令行通过tar xjf linux.2.22.6.tar.bz2解压内核。然后,如果你需要对这个内核打补丁的话,用patch命令:patch -px &../linux.2.22.6.patch。这里的px指的是忽略掉补丁文件中描述的第几个斜杠。也就是忽略前x个目录。
--- linux-2.6.22.6/arch/arm/configs/s3c2410_defconfig+++ linux-2.6.22.6_jz2440/arch/arm/configs/s3c2410_defconfig
  如果你此刻就在内核的根目录下,即linux-2.6.22.6下,也就是说打补丁需要忽略掉一个斜杠的目录。那么打补丁的命令就是patch -p1 &../linux.2.22.6.patch。
2.配置内核
  现在补丁已经打好了,接下来就是配置内核了。这里配置有3种方法:
  1&直接进行make menuconfig。这是最麻烦的一种方法,所有的配置都需要你来操作。
  2&在默认配置上自己修改,也就是修改defconfig文件。使用 find -name "*defconfig*"查找你的架构对应的默认配置文件。我是在arch/arm/configs找到自己板子的默认配置文件。执行defconfig文件: make XXX_defconfig。XXX是你具体使用的板子型号。执行这一操作后,结果保存在.config文件。然后再执行make menuconfig命令。这时的配置就是在默认配置上稍加修改就可以了。
  3&使用厂家的配置文件。如果你的硬件有厂家提供的config文件那是最轻松的。直接cp XXX .config。然后执行make menuconfig。
  这里详细给大家讲一下内核的配置。Linux的内核配置,就是为了生成.config文件。因为在编译时需要用.config文件生成其他相关配置文件。我们的配置项大多是例如CONFIG_XXXDRIVER,这里的XXXDRIVER指的是各种驱动。我们需要告诉内核,这些驱动是编译进内核,还是编译成模块。通过查找CONFIG_XXXDRIVER,我们可以发现,它出现在四个地方:
  1&C源代码
  2&子目录Makefile:drivers/XXX/Makefile
  3&include/config/auto.conf
  4&include/linux/autoconf.h
这里首先说明:.config文件在进行内核编译时(make uImage)生成了include/config/auto.conf和include/linux/autoconf.h。通过查看C源代码我们发现CONFIG_XXXDRIVER是一个宏定义,等于一个常量。在include/linux/autoconf.h中宏定义CONFIG_XXXDRIVER为一个常量,可能是0或1。那么现在有一个问题,就是CONFIG_XXXDRIVER到底被编译进内核还是编译成一个模块呢?这在C语言中是无法进行区分的,这种区分体现在哪里呢?这种区分体现在子目录的Makefile文件中。在子目录的Makefile中,若有 obj -y += XXX.o则表示XXX.c被编译进内核;obj -m +=XXX.o则表示XXX被编译成模块,为XXX.ko。include/config/auto.conf文件则是对CONFIG_XXXDRIVER进行赋值,为y时表示编译进内核,为m时表示编译成独立模块。
#这里是include/config/auto.conf的部分内容# Automatically generated make config: don't edit# Linux kernel version: 2.6.22.6# Sun Nov 27 18:34:38 2016#CONFIG_CPU_S3C244X=yCONFIG_CPU_COPY_V4WB=yCONFIG_CRYPTO_CBC=yCONFIG_CPU_S3C2410_DMA=yCONFIG_CRYPTO_ECB=mCONFIG_SMDK2440_CPU2440=y
#这里是drivers/i2c/Makefile# Makefile for the i2c core.#
obj-$(CONFIG_I2C_BOARDINFO)& & += i2c-boardinfo.oobj-$(CONFIG_I2C)& & & & += i2c-core.oobj-$(CONFIG_I2C_CHARDEV)& & += i2c-dev.oobj-y& & & & & & & & += busses/ chips/ algos/
ifeq ($(CONFIG_I2C_DEBUG_CORE),y)EXTRA_CFLAGS += -DDEBUGendif
3.编译内核  通过上面的描述,我们可以知道,在每个driver下,都有一个Makefile文件。来定义这个驱动是编译进内核还是编译成模块。这里稍稍提一下。上面我们讲到了在Makefile中单个文件怎样编译进内核和编译成模块。但是如果有两个以上的文件该如何书写呢?这里举个例子:obj -y += a.o b.o就表示将a.c和b.c编译进内核。
obj -m += ab.o
ab -objs := a.o b.o
就可以表示将a.c和b.c共同编译成为一个模块。过程就是 a.c生成a.o , b.c生成b.o。a.o 和b.o共同生成ab.ko。在以往的对uboot启动内核的代码分析中,我们提到过编译内核生成的uImage是由两部分组成的:头部+Linux内核。这个头部包含了很多初始化的参数信息,例如内核的加载地址和入口地址。在编译内核时,我们直接执行make uImage即可。那么在文件中是怎样定义uImage的呢?又是怎样生成uImage的呢?
  首先,我们通过查找Makefile,发现uImage在arch/arm/Makefile中,而这个架构目录下的Makefile被包含进顶层目录的Makefile中。这样我们在执行 make uImage时,顶层目录的Makefile就可以调用架构子目录下的Makefile,实现对内核的编译,生成uImage。
顶层目录下Makefile中相关命令:include $(srctree)/arch/$(ARCH)/Makefile架构目录下Makefile相关命令:zImage Image xipImage bootpImage uImage: vmlinux
以上就是装机员给大家介绍的如何使用的方法了,如何使用的方法到这里也全部结束了相信大家对如何使用的方法都有一定的了解了吧,好了,如果大家还想了解更多的资讯,那就赶紧点击吧。
本文来自装机员www.zhuangjiyuan.com如需转载请注明!
不知道有没朋友跟我一样是 Ubuntu 和 Windows 双系统?今天有朋友问到我,当他从 Ubuntu 系统重新启动到 Windows 时,会发
装机必备软件
装机员系统之家提供、、最新,专为装机修机员奉上最好的、系统、U教平台
请勿发布违反国家法律法规的内容,会员观点不代表本站立场.本站发布的系统与软件仅为个人学习测试使用,请在下载后24小时内删除,不得用于任何商业用途,
否则后果自负,请支持购买微软正版软件! 如侵犯到您的权益,请及时通知我们,我们会及时处理。温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(1467)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_081074',
blogTitle:'简单的LINUX字符设备驱动及编译进Linux内核…',
blogAbstract:'驱动代码:\n&\n#include &linux/init.h&\n#include &linux/config.h&\n#include &linux/module.h&\n#include &linux/kernel.h&\n#include &linux/slab.h&\n#include &linux/fs.h&\n#include &linux/errno.h&\n#include &linux/types.h&\n#include &linux/proc_fs.h&\n#include &linux/fcntl.h&\n#include &asm/system.h&\n#include &asm/uaccess.h&\n\n#ifndef MODULE\n#define MOD_INC_USE_COUNT',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:5,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}linux怎么编译进驱动进内核?_百度知道
linux怎么编译进驱动进内核?
比如我有一个无线网卡包,这个网卡包和之前的不一样,因为这个是别人做二次开发之后送给我的,我想用它来替换之前的网卡包,我现在把这个包放在原来包的地方,然后我要怎么修改makefile才能把这个驱动包直接编译进内核?万分感谢
我有更好的答案
驱动程序编译进内核的步骤在 linux 内核中增加程序需要完成以下三项工作:1. 将编写的源代码复制到 Linux 内核源代码的相应目录;2. 在目录的 Kconfig 文件中增加新源代码对应项目的编译配置选项;3. 在目录的 Makefile 文件中增加对新源代码的编译条目。 bq27501驱动编译到内核中具体步骤如下:1.
先将驱动代码bq27501文件夹复制到 ti-davinci/drivers/ 目录下。确定bq27501驱动模块应在内核源代码树中处于何处。设备驱动程序存放在内核源码树根目录 drivers/ 的子目录下,在其内部,设备驱动文件进一步按照类别,类型等有序地组织起来。a. 字符设备存在于 drivers/char/ 目录下b. 块设备存放在 drivers/block/ 目录下c. USB 设备则存放在 drivers/usb/ 目录下。注意:(1) 此处的文件组织规则并非绝对不变,例如: USB 设备也属于字符设备,也可以存放在 drivers/usb/ 目录下。(2) 在 drivers/char/ 目录下,在该目录下同时存在大量的 C 源代码文件和许多其他目录。所有对于仅仅只有一两个源文件的设备驱动程序,可以直接存放在该目录下,但如果驱动程序包含许多源文件和其他辅助文件,那么可以创建一个新子目录。(3) bq27501的驱动是属于字符设备驱动类别,虽然驱动相关的文件只有两个,但是为了方面查看,将相关文件放在了bq27501的文件夹中。在drivers/char/目录下增加新的设备过程比较简单,但是在drivers/下直接添加新的设备稍微复杂点。所以下面首先给出在drivers/下添加bq27501驱动的过程,然后再简单说明在drivers/char/目录下添加的过程。 2.
在/bq27501下面新建一个Makefile文件。向里面添加代码:obj-$(CONFIG_BQ27501)+=bq27501.o此时,构建系统运行就将会进入 bq27501/ 目录下,并且将bq27501.c 编译为 bq27501.o3.
在/bq27501下面新建Kconfig文件。添加代码:menu &bq27501 driver& config BQ27501tristate&BQ27501&default y---help---
Say 'Y' here, it will be com If you choose 'M', it will be compiled into a module named asbq27501.ko.endmenu注意:help中的文字不能加回车符,否则make menuconfig编译的时候会报错。4.
修改/drivers目录下的Kconfig文件,在endmenu之前添加一条语句‘source drivers/bq27501/Kconfig’ 对于驱动程序,Kconfig 通常和源代码处于同一目录。 若建立了一个新的目录,而且也希望 Kconfig 文件存在于该目录中的话,那么就必须在一个已存在的 Kconfig 文件中将它引入,需要用上面的语句将其挂接在 drivers 目录中的Kconfig 中。 5.
修改/drivers目下Makefile文件,添加‘obj-$(CONFIG_BQ27501)
+=bq27501/’。这行编译指令告诉模块构建系统在编译模块时需要进入 bq27501/ 子目录中。此时的驱动程序的编译取决于一个特殊配置 CONFIG_BQ27501 配置选项。 6.
修改arch/arm目录下的Kconfig文件,在menu &Device Drivers……endmenu&直接添加语句source &drivers/bq27501/Kconfig&
我爱资源共享
为您推荐:
其他类似问题
您可能关注的内容
linux的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。51CTO旗下网站
如何向 Linux 内核提交驱动
当Linux驱动程序开发到一定阶段,向kernel.org提交代码是一个很好的选择。对于很多没有向上游提交过代码的开发者来说,还是有很多疑问需要解决的。比如,究竟我们向哪里提交驱动程序?提交时我们的代码应该处于什么状态?提交的过程又如何呢?
作者:来源:wwang| 10:43
当Linux驱动程序开发到一定阶段,向kernel.org提交代码是一个很好的选择。对于很多没有向上游提交过代码的开发者来说,还是有很多疑问需要解决的。比如,究竟我们向哪里提交驱动程序?提交时我们的代码应该处于什么状态?提交的过程又如何呢?
向哪里提交
Linux staging tree是Greg KH建立的用于提交驱动程序的git仓库。我们可以把staging
tree看作是代码进入mainline内核之前的一个预科班,新增的驱动程序首先需要放到这里供社区review和测试。Staging
tree是&Greg KH于2008年建立的一棵kernel
tree,其建立之目的是用来放置一些未充分测试或者因为一些其他原因未能进入内核的新增驱动程序和新增文件系统。
Linux staging tree的URL是&
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging-2.6.git
http://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging-2.6.git
&。这里需要注意的是,git协议的端口号是9418,因为很多公司的防火墙只会开放80端口,clone代码仓库时如果git协议超时,不妨试试 http协议。
关于Linux staging tree更详细的描述可以参考我前一篇博文《》。
我们的代码
在我们向上游提交驱动程序之前,需要保证代码能够遵循Linux内核的coding
style。当然,这个规定并不是强制的,如果您经常阅读Linux内核代码,就会发现很多驱动对内核coding
style的遵循情况也并不是太好。但一致的代码风格对代码的维护大有裨益,所以对作为Linux内核驱动的我们来说,遵循coding style是一个很好的习惯。关于Linux内核的coding style的详细信息,可以参考Linux内核里的Documentation/CodingStyle文档,或者我之前的博文《》。
我们在提交驱动之前还需要用静态代码检查工具sparse来检查一下代码。
sparse的源代码可以从&git://git.kernel.org/pub/scm/devel/sparse/sparse.git&获 得,得到代码之后,执行& make
install&来编译生成可执行程序。默认情况下,sparse程序会被放到目录&~/bin&下面,如果您不喜欢这个位置,可以修改Makefile 来设定路径。需要注意的是,使用sparse之前,PATH环境变量要设置正确。
sparse的使用方法很简单,只要在make驱动程序时加上&C=N&的选项即可,其中N的取值是1或者2。当N=1时表示对需要重新编译的C文件进行代码检查,N=2时表示对所有的C文件进行代码检查。
对于staging目录下的驱动来说,我们还需要附上一个TODO文件,用来描述未来的维护计划。一般情况下,TODO文件可以这样写:
- support more features
- use kernel coding style
- checkpatch.pl fixes
我们可以通过patch的形式把驱动程序提交给staging tree。提交之前,需要首先把staging tree clone到本地,然后基于当前的工作目录制作patch。
Git提供了制作格式化的patch的功能,命令如下:
git format-patch -N
其中,N是整数,用来指定我们把最近N次提交做成N个patch。比如当N=1时,就表示把最近一次提交制作成patch。Git会根据提交的log信息来自动命名patch文件。
这里需要注意的是,每次提交的log的描述要遵循一定的格式。
Log的第一行是一个简短的描述。本文主要介绍如何向staging
tree提交代码,我们需要在Log首行以&staging:&开头。Log的最后一行需要提供提交者的email信息,我们可以这样 写:&Signed-off-by: wwang &wwang@some.site&&。
举个例子,假定我们的staging driver命名为hello_world,log的格式可以参考如下:
staging:&hello_world:&My&first&commit&This&is&my&first&commit.&Signed-off-by:&wwang&&wwang@some.site&&
Patch生成之后,我们需要把它寄给staging tree的维护者,通常是Greg
KH本人以及linux内核驱动的开发者列表。这个步骤也可以使用git来帮助我们完成,但首先需要确定系统里已经安装msmtp和git-email这 两个包。这里还需提醒一下,如果您的邮件服务器是Exchange,很可能需要NTLM认证,这就要求msmtp支持NTLM。Ubuntu仓库里的 msmtp默认支持NTLM,可以直接使用,但还有些其他的发行版的软件仓库里自带的msmtp并不支持NTLM(如Arch
Linux),这种情况就需要自己编译了。
msmtp安装好之后,需要配置&~/.msmtprc&文件。以Gmail为例,&.msmtprc&可以这样配置:
#&Set&default&values&for&all&following&accounts.&defaults&logfile&~/.msmtp.log&&#&gmail&account&gmail&protocol&smtp&host&smtp.gmail.com&from&my@gmail.com&user&my@gmail.com&password&mypasswd&port&587&auth&on&tls&on&tls_trust_file&/etc/ssl/certs/ca-certificates.crt&syslog&LOG_MAIL&&#&Set&a&default&account&account&default&:&gmail&
用git发送patch的命令如下:
git&send-email&&&/&&--smtp-server&/usr/bin/msmtp&&/&&--from&my@gmail.com&&/&--to&gregkh@suse.de&&/&&--to&devel@linuxdriverproject.org&&/&&--to&linux-kernel@vger.kernel.org&&/&&./my.patch&
将patch发送出去只是提交驱动程序的第一步,之后还需要不断的维护与完善,把代码丢给内核然后就放手不管的做法是不可取的。提交代码还有一个原则,就是每次提交只做一件事情,这样才会比较方便内核维护者来review我们的代码。
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
头条关注热点头条热点
24H热文一周话题本月最赞
讲师:111881人学习过
讲师:131215人学习过
讲师:82904人学习过
精选博文论坛热帖下载排行
本书从一个网站制作过程入手,详细介绍基于ASP技术建设网站的全过程。全书共10章。第1章,网站制作规划与流程;第2章,IIS安装与调试;第3...
订阅51CTO邮刊没有更多推荐了,
不良信息举报
举报内容:
编译驱动到内核的两种方式
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!}

我要回帖

更多关于 编译进内核 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信