zoukankan      html  css  js  c++  java
  • 内核Makefile编写

    对于大部分内核模块或设备驱动的开发者和使用者来说,最常接触到的就是各层目录下基于kbuild架构的kbuild Makefile文件。主要部分有:
    1、目标定义,目标定义就是用来定义哪些内容要做为模块编译,哪些要编译链接进内核。
    最简单的只有一行,如
    obj-y += foo.o
    表示要由foo.c或者foo.s文件编译得到foo.o并链接进内核,而obj-m则表示该文件要作为模块编译。除了y,m以外的obj-x形式的目标都不会被编译。
    由于既可以编译成模块,也可以编译进内核,更常见的做法是根据.config文件的CONFIG_ 变量来决定文件的编译方式,如:
    obj-$(CONFIG_HELLO_MODULE) += hello.o ,这个已经在7.2.3.1中说明过。
    除了obj-形式的目标以外,还有lib-y library库,hostprogs-y 主机程序等目标,但是基本都应用在特定的目录和场合下
    2、多目标
    一个内核模块由多个源文件编译而成,这是Makefile有所不同。
    采用模块名加 –objs后缀或者 –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_EXT2_FS的值是y也没有关系,在此过程中生成的 ext2.o将被链接进built-in.o最终链接进内核。这里需要注意的一点是,该kbuild Makefile所在的目录中不应该再包含和模块名相同的源文件如ext2.c/ext2.s
    或者写成如-objs的形式:
    obj-$(CONFIG_ISDN) += isdn.o
    isdn-objs := isdn_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文件的内容来决定的
    4、不同的模块编译方式
    编译模块的时候,你可以将模块放在代码树中,用Make modules的方式来编译你的模块,你也可以将模块相关文件目录放在代码树以外的位置,用如下命令来编译模块:
    make -C path/to/kernel/src M=$PWD modules
    -C指定内核源码的根目录,$PWD 或 `PWD` 是当前目录的环境变量,告诉kbuild回到当前目录来执行build操作。
    5、模块安装
    当你需要将模块安装到非默认位置的时候,你可以用INSTALL_MOD_PATH 指定一个前缀,如:
    make INSTALL_MOD_PATH=/foo modules_install
    模块将被安装到 /foo/lib/modules目录下

     

    注意2.6和2.4版本编译结果的不同,内核模块在2.6下是.ko后缀,取代了2.4下的.o后缀,使内核模块和普通的目标文件区别开。(比较好呀)
  • 相关阅读:
    Codeforces Beta Round #25 (Div. 2 Only) D. Roads not only in Berland(DFS+并查集)
    HDU 3473 Minimum Sum(划分树)
    Oracle锁表与解锁 对象锁与解锁
    Java实现多个客户端聊天程序
    Javacript实现颜色渐变的效果
    生成对象的模式(PHP)
    C语言实现的简单通讯录例子
    C语言实现加密通讯录雏形
    TP中Model
    php整合Apache
  • 原文地址:https://www.cnblogs.com/caiyao/p/3837802.html
Copyright © 2011-2022 走看看