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

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

但也不能不熟悉,不然就做出各种愚蠢事情,诸如中断里睡眠(真得见过在中断服务程序里直接调一些复杂到他认识不到会引起睡眠和调度的内核函数)
不熟悉linux内核,就很容易把内核搞死,或者cpu占用严重,或者隐藏不稳定的bug (诸如申请大的局部变量导致内核栈溢出,内核栈只有可怜的2页)

我的判断标准是,至少看完lkd并且完全理解,有一些判断题目可供参考。知道以下答案也就差不多了,可以搞驱动了:
1、为什么中断上下文不能睡眠
2、自己写linux内核程序,如何操作物理地址
3、在是否smp 是否可抢占内核 中断上下文还是内核上下文 ,一共8种组合下,应该使用哪些内核同步互斥机制
4、liunux内核启动完成后,是为进程提供服务,还是主动管理进程?
5、能够遍历一些内核数据结构,诸如task_struct
6、熟悉linux虚拟内存地址空间的分配。不需要理解到mmu 页表之类的,但至少能理解内核线程有没有用户空间内存描述?为什么不同进程的用户空间内存没有影响?为什么多线程用户态空间共享,那么内核态栈是否也共享?

  1. config E1000
  2. tristate "Intel(R) PRO/1000 Gigabit Ethernet support"
  3. depends on PCI
  4. ---help---
  5. This driver supports Intel(R) PRO/1000 gigabit ethernet family of
  6. adapters.  For more information on how to identify your adapter, go
  7. to the Adapter & Driver ID Guide at:
  8. <http://support.intel.com/support/network/adapter/pro100/21397.htm>
  9. For general information and support, go to the Intel support
  10. website at:
  11. <http://support.intel.com>
  12. More specific information on configuring the driver is in
  13. <file:Documentation/networking/e1000.txt>.
  14. To compile this driver as a module, choose M here. The module
  15. will be called e1000.

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

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

  1. obj-$(CONFIG_E1000) += e1000/

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

  1. obj-$(CONFIG_E1000) += e1000.o
  2. 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驱动编写(Kconfig文件和Makefile文件)的更多相关文章

  1. Linux环境下使用VSCode编译makefile文件的注意事项

    Linux环境下使用VSCode编译makefile文件的注意事项 首先安装C/C++的两个依赖 在debug,launch会自动的生成下方的launch.json launch.json { // ...

  2. Ubuntu 16.04下Linux驱动编写第一步

    源码环境的搭建 Install源码 >sudo apt-cache search linux-source linux-source - Linux kernel source with Ubu ...

  3. linux驱动学习(二) Makefile高级【转】

    转自:http://blog.csdn.net/ghostyu/article/details/6866863 版权声明:本文为博主原创文章,未经博主允许不得转载. 在我前一篇写的[ linux驱动学 ...

  4. 编写一个通用的Makefile文件

    1.1在这之前,我们需要了解程序的编译过程 a.预处理:检查语法错误,展开宏,包含头文件等 b.编译:*.c-->*.S c.汇编:*.S-->*.o d.链接:.o +库文件=*.exe ...

  5. Android驱动中的Kconfig文件与Makefile文件

    内核源码树的目录下都有两个文档Kconfig(2.4版本是Config.in)和Makefile.分布到各目录的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文 ...

  6. linux驱动编写(电源管理驱动)

    对于嵌入式设备来说,合适的电源管理,不仅可以延长电池的寿命,而且可以省电,延长设备运行时间,在提高用户体验方面有很大的好处.所以,各个soc厂家在这方面花了很多的功夫.下面,我们可以看看linux是如 ...

  7. Linux驱动编写(块设备驱动代码)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 按照ldd的说法,linux的设备驱动包括了char,block,net三种设备.char设备 ...

  8. linux驱动编写之poll机制

    一.概念 1.poll情景描述 以按键驱动为例进行说明,用阻塞的方式打开按键驱动文件/dev/buttons,应用程序使用read()函数来读取按键的键值.这样做的效果是:如果有按键按下了,调用该re ...

  9. linux驱动编写(pwm驱动)【转】

    本文转载自:https://blog.csdn.net/feixiaoxing/article/details/79889240 pwm方波可以用来控制很多的设备,比如它可以被用来控制电机.简单来说, ...

随机推荐

  1. 如何优雅的使用vue+Dcloud(Hbuild)开发混合app

    如何优雅的使用vue+Dcloud(Hbuild)开发混合app 最近在做混合app,前端框架用的是vue,打包app使用的是Dcloud,不过在开发过程中有一点不爽的是,如果想使用Dcloud提供的 ...

  2. 数据库SQL实战练习

    http://blog.csdn.net/iamyvette/article/details/77151925

  3. 《ajax学习》之ajax+JavaScript事件验证用户名是否可注册

    当用户注册时,服务器数据库需要对用户输入的用户信息(以用户名为例子)进行验证,在不刷新页面的情况下又需要页面和服务器进行数据请求,最好的方法是用ajax异步请求. 一.实现思路: 1.用户输入信息 2 ...

  4. cf 55D 数位dp 好题

    /* 刚开始我考虑0的情况,想将他剔除就将lcmn设为-1,这样还要判断0和lcmn是-1的情况很麻烦而且但是一直出错 后来觉得不用管0的情况就行了,可以认为符合. 解:将lcmn离散化,因为1-9的 ...

  5. poj 1733离散化(map)+并查集

    http://blog.sina.com.cn/s/blog_803d08c00100y2yy.html #include<stdio.h> #include<iostream> ...

  6. 【BZOJ3669】魔法森林(LCT)

    题意:有一张无向图,每条边有两个权值.求选取一些边使1和n连通,且max(a[i])+max(b[i])最小 2<=n<=50,000 0<=m<=100,000 1<= ...

  7. CentOS7使用mount命令来挂载CDROM

    https://blog.csdn.net/testcs_dn/article/details/41448557

  8. HTML5学习之语义化标签

    一.为什么HTML5要引入新语义标签 在HTML5出现之前,我们一般采用DIV+CSS布局我们的页面.但是这样的布局方式不仅使我们的文档结构不够清晰,而且不利于搜索引擎爬虫对我们页面的爬取.为了解决上 ...

  9. SHARP 加粉

    http://v.ku6.com/show/7ufwm7pqfF8D_f13IdCaag...html

  10. jmeter的master-slave模式

    要求: 1.相同的jmeter版本 2.最好相同的java版本 jmeter可以通过master-slave的方式实现更大的并发,但是作为master的机器将会消耗更多的资源,因为所有的slave的压 ...