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. add list of symbols in latex

    * add list of symbols -- latex 1. createa new tex file named "toc.tex' with the following conte ...

  2. 每周一赛(E题,广搜求方案)

    Description In this problem, you are given an integer number s. You can transform any integer number ...

  3. 将scl分频

    多个scl后一个高脉冲,脉冲宽度一个scl脉冲. always @ ( posedge MCLK or negedge RST_N ) begin if (rClkCount == 24) //如果有 ...

  4. heap corruption detected VS2015 C语言 报错

    申请动态内存时,申请的单元数为n,可用下标为0~n-1 但实际使用时超过了该范围,就会报这个错

  5. hiho一下 第五十周 (求欧拉路径)

    http://hihocoder.com/contest/hiho50/problem/1 这题有重边,所以邻接矩阵用来统计节点u,v之间有多少条边相连,并且用另外一个数组统计每个节点的入度. 然后查 ...

  6. Warm up-HUD4612(树的直径+Tarjin缩点)

    http://acm.hdu.edu.cn/showproblem.php?pid=4612 题目大意:求加一条边最小的桥数 先用Tarjin缩点求出一棵树,然后用bfs求出树的直径,树的直径就是加一 ...

  7. Ubuntu 16.04安装GTX960闭源驱动

    GTX960的闭源要Nvidia 346版才行,闭源驱动能很大提升显卡的性能,例如双显示输出等,缺点是不开源. 有以下方式来安装: 1.命令行: sudo add-apt-repository -y ...

  8. ibatis中isNotNull与isNotEmpty区别

    isNotNull:参数不能为null,空的可以的 isNotEmpty:参数不能为null和空 那什么是空?比如String类型 String a = ""; a就是空

  9. golang convert integer to float number

    There is no float type. Looks like you want float64. You could also use float32 if you only need a s ...

  10. JButton点击事件

    JButton点击事件: 以前都是搞一个JFrame,放个JButton,然后用鼠标点击: 忽然之间: import javax.swing.JButton; public class Page06 ...