Chinaunix首页 | 论坛 | 博客
  • 博客访问: 108858
  • 博文数量: 40
  • 博客积分: 2058
  • 博客等级: 大尉
  • 技术积分: 409
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-07 16:49
文章分类

全部博文(40)

文章存档

2011年(3)

2010年(17)

2009年(14)

2008年(6)

我的朋友

分类: LINUX

2010-09-12 10:32:37


一般而言,驱动工程师在内核源代码的drivers 目录的相应子目录中增加新设备驱动的源代码,并增加或修改Kconfig的配置脚本和Makefile脚本。
具体说来在linux内核中增加程序需要完成一下三项工作:
1.将编写的源代码复制到linux内核源代码的相应目录。
2.在目录的Kconfig文件中增加新源代码对应项目的编译配置选项。
3.在目录的Makefile文件中增加对新源代码的编译条目。
Makefile
Kbuild Makefile 语法包括如下几个方面:
(1)目标定义:用来定义哪些内容要作为模块编译,哪些要编译并连接进内核。
    Obj-y +=foo.o    要由foo.c或者foo.s 文件编译得到foo.o并连接进内核
    Obj-m +=foo.o    表示该文件要作为模块编译
常见的是根据.config文件的CONFIG_变量来决定文件的编译方式,如
obj-$(CONFIG_ISDN) +=isdn.o
obj-$(CONFIG_ISDN_PPP_BSDCOMP) +=isdn_bsdcomp.o
除了y、m以外的obj-x形式的目标都不会被编译。
除了obj-y形式的目标意外还有lib-y library库、hostprogs-y 主机程序等目标
(2)多文件模块的定义:如果一个模块由多个文件组成,这时候应该用模块名-obj 后缀或者-y后缀的形式来定义模块的组成文件。
    如 obj-$(CONFIG_EXT2_FS) +=ext2.o
    ext2-y :=balloc.o bitmap.o
ext2-$(CONFIG_EXT2_FS_XATTR) +=xattr.o
模块的名字为ext2,由balloc.o 和bitmap.o连个目标文件最终连接成ext2.o直至ext2.ko文件,是否包括xattr.o取决于内核配置 文件的配置情况,如果CONFIG_EXIT2_FS的值也是y也没有关系,在此过程中生成的ext2.o将被连接进built-in.o最终链接进内核。这里需要注意的是该kbuild Makefile所在的目录中不能再包含和模块相同的源文件如ext2.c/ext2.s
或者写成这样的形式:
obj-$(CONFIG_ISDN) +=isdn.o
Isdn-objs :=isden_net_lib.o isdn_v110.o  isdn_common.o
(3)目录层次的迭代:
    obj-$(CONFIG_EXT2_FS) +=ext2/
当CONFIG_EXT2_FS的值为y或者m时,kbuild 将会把ext2目录列入向下迭代的目标中,具体ext2目录下的文件是要作为模块编译还是链如内核由ext2 目录下的Makefile文件的内容决定。
Kconfig内核配置脚本文件:
(1)菜单入口
    大多数的内核配置选项都对应Kconfig中的一个菜单入口,如下:
 config VT_HW_CONSOLE_BINDING
         bool "Support for binding and unbinding console drivers"
         depends on HW_CONSOLE
         default n
         ---help---
            The virtual terminal is the device that interacts with the physical terminal through console drivers. On these systems, at least one console driver is loaded. In other configurations, additional console drivers may be enabled, such as the framebuffer console. If more than 1 console driver is enabled, setting this to 'y' will allow you to select the console driver that will serve as the backend for the virtual terminalsSee for more  information. For framebuffer console users, please refer to
            .
Config 关键字定义新的配置项,之后的几行定义了该配置选项的属性包括 类型、数据范围、输入提示、依赖关系、帮助信息和默认值
类型包括:bool,tristate,string,hex,int,其中tristate 和string 是两种基本的类型,其他的类型都属于这两种基本类型。
Bool "Netwroking support"
等价于
bool
Prompt " Networking support"
默认值的一般格式:defualt [if  ]
依赖关系格式如下: depends on(或者requires);如果定义了多个依赖关系,他们之间用“&&”间隔。
反向依赖关系:select [if ]
depends能定义一个symbol的上限,即如果A依赖于B,则B 被配置为“Y”的情况下,A可以为“Y”、“M”、“N”;在B配置为“M”的情况下A可配置为“M”或“N”,在B被配置为“N”的情况下,A只能为“N”。
Select 能限制一个symbol的下限,若A反向依赖于B,则A的配置值会高于或等于B,如果symbol反向依赖于对个对象,则他的下限是这些对象的最大值。
(2)菜单结构:
菜单入口在菜单树结构中的位置可由两种方法决定方法一:
menu :"Network device support"
    depends on NET
config NERDEVICES
……
endmenu
所有处于“menu” 和“endmenu”间的菜单入口都会成为“Network device support”的子菜单。而且所有的子菜单都会继承父菜单的依赖关系。
方法二:通过分析依赖关系生成菜单结构。如果菜单选项在一定程度上依赖于前面的选项,它就能成为该选项的子菜单。如果父选项为“N”,则子选项不可见;父选项为“M”或“Y”,则子选项可见。

阅读(750) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-09-13 15:03:59

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com