zoukankan      html  css  js  c++  java
  • linux驱动编写(Kconfig文件和Makefile文件)

      在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 页表之类的,但至少能理解内核线程有没有用户空间内存描述?为什么不同进程的用户空间内存没有影响?为什么多线程用户态空间共享,那么内核态栈是否也共享?

    [cpp] view plain copy
     
    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.   
    9.       <http://support.intel.com/support/network/adapter/pro100/21397.htm>  
    10.   
    11.       For general information and support, go to the Intel support  
    12.       website at:  
    13.   
    14.       <http://support.intel.com>  
    15.   
    16.       More specific information on configuring the driver is in   
    17.       <file:Documentation/networking/e1000.txt>.  
    18.   
    19.       To compile this driver as a module, choose M here. The module  
    20.       will be called e1000.  

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

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

    [cpp] view plain copy
     
    1. obj-$(CONFIG_E1000) += e1000/  

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

    [cpp] view plain copy
     
    1. obj-$(CONFIG_E1000) += e1000.o  
    2.   
    3. 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编译也是可以的。

  • 相关阅读:
    3.Linux系统信息
    2.LINUX常用命令
    1.CMD命令
    8.变量内存CPU原理
    17.I/O系统访问方式和类型
    16.磁盘调度
    15.大容量存储结构
    cluvfy comp命令用法
    禁用DRM
    Oracle数据库升级前必要的准备工作
  • 原文地址:https://www.cnblogs.com/jiangzhaowei/p/7372266.html
Copyright © 2011-2022 走看看