嵌入式LINUX驱动笔记1---创世纪

        终于开通了CSDN的博客,我希望自己能够每天和各位一起快乐的进步,敲开LINUX的大门

 

 

这是我在CSDN的第一篇学习日记

                            LINUX驱动学习笔记(1

                       ----- LINUX内核中关于驱动的配置和编译

 

内核源码树的目录下都有两个文档KCONFIGMakefile,分配到各目录下Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文档相关的内核配置菜单。make menuconfig时,从Kconfig中读出菜单,用户选择后(一般是图形化界面选择)保存到.config配置文档中。在内核编译时,主Makefile调用这个.config,就知道了用户的选择

 

 简单来讲,Kconfig为一内核配置“菜单”,用户可以随便挑选菜,当然,也可以自己增加菜的项目---如添加新的驱动到内核Makefile目的就是能使这写新增加的或改变的项目make后生效

 

 

Kconfig   

   一个比较典型的内核配置菜单为

    menu "Network device support"
config NETDEVICES
        bool "Enable Net Devices"
        depends on NET
        default y
       help
               This is help desciption

...
endmenu

l       menu/endmenu中的内容会是Network device support的子菜单

每个子菜单项均由config来确定

l       config类型定义:bool布尔类型、 tristate三态:内建、模块、移除 string字符串、 hex十六进制、 integer整型 。其中bool类型只能是选中或是不选中[ ]tristate类型为编译进内核模块,则.config中生成一个CONFIG_HELLO_MODULE=m的配置,若为内加则.config中生成一个CONFIG_HELLO_MODULE=y的配置

l       依赖型定义depends onrequires 指此菜单的出现和否依赖于另一个定义
config HELLO_MODULE
bool "hello test module"
depends on ARCH_PXA
这个例子表明HELLO_MODULE这个菜单项只对XScale处理器有

 

 

 Makefile

 

Makefile     最顶层的Makefile
.config       
内核的当前配置文档,编译时成为顶层Makefile的一部分

arch/$(ARCH)/Makefile
和体系结构相关的Makefile
s/ Makefile.*   
一些Makefile的通用规则

kbuild Makefile     
各级目录下的大概约500个文档,编译时根据上层Makefile传下来的宏定义和其他编译规则,将源代码编译成模块或编入内核。

顶层的Makefile文档读取 .config文档的内容,并总体上负责build内核和模块。Arch Makefile则提供补充体系结构相关的信息。 s目录下的Makefile文档包含了任何用来根据kbuild Makefile 构建内核所需的定义和规则。
(其中.config的内容是在make menuconfig的时候,通过Kconfig文档配置的结果)

 

 

 

别忘了目标定义目标定义
目标定义就是用来定义哪些内容要做为模块编译,哪些要编译链接进内核。如:

obj-y += foo.o

表示要由foo.c或者foo.s文件编译得到 foo.o并链接进内核,而obj-m则表示该文件要作为模块编译。除了ym以外的obj-x形式的目标都不会被编译。而更常见的做法是根据.config文件的CONFIG_ 变量来决定文件的编译方式(该变量如何起作用见文末另一篇文章的链接),如:
obj-$(CONFIG_EXT2) += ext2.o

除了obj-形式的目标以外,还有lib-y library库,hostprogs-y 主机程序等目标,但是基本都应用在特定的目录和场合下。

 

Kconfig中设置好新加的内核模块后,执行make menuconfig 若将其编译进内核,则.config将会相应变化。执行make后, 顶层目录下的makfile负责读取.config内容,并负责将总体上编译

  举个例子:
       
假设想把自己写的一个flash的驱动程式加载到工程中,而且能够通过menuconfig配置内核时选择该驱动该怎么办呢?能够分三步:
  
第一:将您写的flashtest.c 文档添加到/driver/mtd/maps/ 目录下。
  
第二:修改/driver/mtd/maps目录下的kconfig文档:
      config MTD_flashtest
         tristate “ap71 flash"
     
这样当make menuconfig ,将会出现 ap71 flash选项。
第三:修改该目录下makefile文档。
     
添加如下内容:obj-$(CONFIG_MTD_flashtest)    += flashtest.o
      
这样,当您运行make menucofnig时,您将发现ap71 flash选项,假如您选择了此项。该选择就会保存在.config文档中。当您编译内核时,将会读取.config文档,当发现ap71 flash 选项为yes 时,系统在调用/driver/mtd/maps/下的makefile 时,将会把 flashtest.o 加入到内核中。即可达到您的目的。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值