linux 驱动之Kconfig文件和Makefile文件实例

linux 驱动之Kconfig文件和Makefile文件实例

在Linux编写驱动的过程中,有两个文件是我们必须要了解和知晓的。这其中,一个是Kconfig文件,另外一个是Makefile文件。如果大家比较熟悉的话,那么肯定对内核编译需要的.config文件不陌生,在.config文件中,我们发现有的模块被编译进了内核,有的只是生成了一个module。这中间,我们如何让内核发现我们编写的模块呢,这就需要在Kconfig中进行说明。至于如何生成模块,那么就需要利用Makefile告诉编译器,怎么编译生成这个模块。模仿其实就是最好的老师,我们可以以内核中经常使用到的网卡e1000模块为例,说明内核中是如何设置和编译的。

首先,我们可以看一下,在2.6.32.60中关于e1000在Kconfig中是怎么描述的,

config E1000
 tristate "Intel(R) PRO/1000 Gigabit Ethernet support"
 depends on PCI
 ---help---
  This driver supports Intel(R) PRO/1000 gigabit ethernet family of
  adapters. For more information on how to identify your adapter, go
  to the Adapter & Driver ID Guide at: 

  <http://support.intel.com/support/network/adapter/pro100/21397.htm> 

  For general information and support, go to the Intel support
  website at: 

  <http://support.intel.com> 

  More specific information on configuring the driver is in
  <file:Documentation/networking/e1000.txt>. 

  To compile this driver as a module, choose M here. The module
  will be called e1000.

上面的内容是从drivers/net/Kconfig中摘录出来的。内容看上去不复杂,最重要的就是说明了模块的名称、用途、依赖的模块名、说明等等。只要有了这个说明,我们在shell下输入make menuconfig的时候就可以看到e1000这个选项了,输入y表示编译内核;输入n表示不编译;输入m表示模块编写,这是大家都知道的。

那么,有了这个模块之后,需要编译哪些文件中,我们在drivers/net/Makefile看到了这样的内容,

obj-$(CONFIG_E1000) += e1000/ 

显然,这段代码只是告诉我们,要想编译e1000,必须要包含e1000这个目录,所以e1000目录下必然还有一个Makefile,果不其然,我们在e1000目录下发现了这个Makefile,内容如下,

obj-$(CONFIG_E1000) += e1000.o 

e1000-objs := e1000_main.o e1000_hw.o e1000_ethtool.o e1000_param.o

看了这个文件,其实大家心理就应该有底了。原来这个e1000模块最终生成的文件就是e1000.ko,依赖的文件就是e1000_main.c、e1000_hw.c、e1000_ethtool.c、e1000_param.c这四个文件。只要CONFIG_E1000被设置了,那么这个模块就会被正常编译。我们要做的就是打开这个开关就可以了,剩下kernel会帮我们搞定一切。当然,如果大家想把这个模块拿出来,自己用一个独立的module编译也是可以的。

关于linux驱动的编译部分,其实就这两个配置文件比较重要。大家可以自己实际练习一下,进一步加深印象。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Linux makefile 和shell文件相互调用实例详解

    shell 文件内调用makefile文件: #!/bin/bash cd ctemplate-2.1 ./configure sudo make -f install cd ../ cd TemplateProcesser make 说明:./configure文件是shell脚本文件,即shell内调用shell文件是很容易的:TemplateProcesser目录内有Makefile文件,调用方式,直接:make makefile文件内调用shell脚本文件: SHELL := /bin/

  • 关于Linux下对于makefile的理解

    什么是makefile呢?在Linux下makefile我们可以把理解为工程的编译规则.一个工程中源文件不计数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,那些文件需要先编译,那些文件需要后编译,那些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个shell脚本一样,其中也可执行操作系统的命令. makefile带来的好处就是---"自动化编译",一旦写好,只需要一个make命令,整个工程完全自动编译,极大地提高了软件开

  • Linux下Makefile的automake生成全攻略

    文/余涛 作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Makefile,如果要想写出一个符合自由软件惯例的Makefile就不那么容易了. 在本文中,将给大家介绍如何使用autoconf和automake两个工具来帮助我们自动地生成符合自由软件惯例的Makefile,这样就可以象常见的GNU程序一样,只要使用"./configure","make","ma

  • Linux 中makefile的命令包定义及使用

    Linux 中makefile的命令包定义及使用 下面以\build\core\product.mk下面的内容为例介绍: <span style="font-size:14px;">define _find-android-products-files $(shell test -d device && finddevice -maxdepth 6 -name AndroidProducts.mk) \ $(shell test -d vendor &

  • Linux/Unix环境下的Make和Makefile详解

    Linux/Unix环境下的Make和Makefile详解 无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令.不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或make install.利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和makefile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系.而且如此多的源文件,如果每次都要键入gcc命令进行编译的话,那对程序员来说简

  • Linux Makefile与Shell的问题

    大概只要知道Makefile的人,都知道Makefile可以调用Shell脚本.但是在实际使用时,并不那么简单,一些模棱两可的地方可能会让你抓狂.你若不信,可以先看几个例子,想象一下这些这些例子会打印什么内容,记下你想象的结果,然后在计算机上运行这些例子,对照看一下.   示例一: 复制代码 代码如下: if [ "$(BUILD)" = "debug" ]; then  echo "build debug"; else echo "b

  • linux 驱动之Kconfig文件和Makefile文件实例

    linux 驱动之Kconfig文件和Makefile文件实例 在Linux编写驱动的过程中,有两个文件是我们必须要了解和知晓的.这其中,一个是Kconfig文件,另外一个是Makefile文件.如果大家比较熟悉的话,那么肯定对内核编译需要的.config文件不陌生,在.config文件中,我们发现有的模块被编译进了内核,有的只是生成了一个module.这中间,我们如何让内核发现我们编写的模块呢,这就需要在Kconfig中进行说明.至于如何生成模块,那么就需要利用Makefile告诉编译器,怎么

  • Python实现生成简单的Makefile文件代码示例

    在linux下写几个测试程序,还要一行行的输入g++命令进行编译,当经常改测试代码的时候,那一次次的敲(或者一次次的上线箭头选)也感觉不爽,不如make来的快.用Makefile的好处就不用多说了,这里我写了个脚本,其功能是自动搜索当前目录(不包括子目录)下的".c"文件生成Makefile文件. 代码在这里,功能有限(适用于单个文件是一个独立的测试代码的情况),需要的朋友可以稍作修改以满足需求. 复制代码 代码如下: #! /usr/bin/python '''  File     

  • 基于make命令与makefile文件详解

    一.多个源文件带来的问题 在编写c/c++测试程序时,我们习惯每次修改一处代码,然后就马上编译运行来查看运行的结果.这种编译方式对于小程序来说是没有多大问题的,可对于大型程序来说,由于包含了大量的源文件,如果每次改动一个地方都需要编译所有的源文件,这个简单的直接编译所有源文件方式对程序员来说简直是噩耗. 我们看一个例子: // main.c #include "a.h" // 2.c #include "a.h" #include "b.h" /

  • 详解linux 驱动编写(sd卡驱动)

    随着sd卡的流行,sd卡在嵌入式设备上使用的场景也越来越多.那下面我们可以看一下,linux驱动框架上是怎么处理sd卡驱动的? 1.代码目录地址 drivers/mmc 2.基本结构 从mmc的代码结构可以看得出,主要分为两个部分,其中core为协议部分,host为各个soc的适配部分 host是我们需要真正关心的代码 3.以s3c为例,观察makefile obj-$(CONFIG_MMC_SDHCI_S3C) += sdhci-s3c.o ...... obj-$(CONFIG_MMC_S3

  • linux环境下恢复rm误删的文件方法

    目录 前言 rm之后还有救吗 使用foremost找回文件 使用extundelete找回文件 预防误删引发的事故 总结 前言 一提到在 linux 环境下删除文件,那绝对离不开 sudo rm -rf /* 这个梗,每次看到这个命令,我都想到一幅恶搞的图片: 这个『清理垃圾』的说明真是解释的"恰到好处",据说有小白在论坛问问题,被人开玩笑的回复了 sudo rm -rf /* 这个命令,结果问题就解决了,人也拜拜了~ 从删库到跑路,一天一个入狱小技巧,所以我们一定要谨慎使用 rm -

  • windows下安装make及使用makefile文件

    目录 前言 Makefile简介 make作用 安装make: 1.windows上安装:chocolatey 一.Chocolatey介绍 二.Chocolatey安装 安装make 配置make连接 前言 本人在学习go-micro中,用到Makefile,本人之前用过Makefile,但是不知道为什么这会就不能用了,我找了好多教程都没能解决问题,大多数是linux的安装教程,另一部分是下载mingw,但是没能解决我的问题,最后花了我一下午的时间才解决,特此记录一下,给其他的小伙伴提个醒,希

  • Linux下编写Lua扩展so文件和调用方法实例

    复制代码 代码如下: #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <errno.h> #include <string.h>   #include <unistd.h> #include <fcntl.h> #include <sys/stat.h> #include <limits.h> #include &

  • Linux下修改jar、zip等文件内的文件详解

    Linux下修改jar.zip等文件内的文件详解 看到很多同事在Linux环境下修改jar包内的文本文件或zip中的文本文件时,经常是先把jar包或zip包下载下来,然后修改,再上传.其实Linux针对此类文件提供了相应的操作功能. 平时修改Linxu文件时使用vi或vim命令来修改.其实修改jar包或zip可以同样使用此命令. 对文件执行vi或vim. vim xxx.jar 执行之后,会显示jar包或zip包中的文件. 通过以下命令根据文件名字查找文件: /index.ftl 比如上面的命令

  • linux下用renameTo方法修改java web项目中文件夹名称的实例

    经测试,在Linux环境中安装tomcat,然后启动其中的项目,在项目中使用java.io.File.renameTo(File dest)方法可行. 之前在本地运行代码可以修改,然后传到Linux服务器上一直无法实现功能,自己一直在捣鼓,以为是window环境和Linux环境不同的原因导致,后面发现在项目中使用renameTo方法修改文件夹名称不行是因为之前改了java web项目中的js,在js中传入值到后台,后台根据值来修改文件夹名称.由于没清除缓存导致js中的代码没有刷新,所以一直出现错

  • linux C++ 获取文件绝对路径的实例代码

    提供ftp服务时需要获取文件绝对路径,这里记录一下. #include <stdlib.h> #include <stdio.h> #include <limits.h> int main(){ const char *file_name = "filename"; char abs_path_buff[PATH_MAX]; //获取文件路径, 填充到abs_path_buff //realpath函数返回: null表示获取失败; 否则返回指向ab

随机推荐