zoukankan      html  css  js  c++  java
  • 编译多个文件到内核模块

     

    KERNEL_PATH  = /usr/src/kernels/2.6.29.4-167.fc11.i586/
    CURRENT_PATH = /tmp/tmp/procfs/myfs
    obj-m = myfs.o
    myfs-objs = hello.o  hello_entry.o  mount.o
    all:
        make -C $(KERNEL_PATH) M=$(CURRENT_PATH) modules
    clean:
        make -C $(KERNEL_PATH) M=$(CURRENT_PATH) clean

    以上是已经测试成功的例子,myfs是我希望生成的ko名,整个ko包含hello.c hello_entry.c mount.c三个.c文件和hello.h一个.h文件,这时.h不用管。

    ============================================================================================================

    linux2.6内核Makefile简单语法与应用
    1.1 概述

    2.6 的Makefile的写法和应用相对于2.4有了一些变化,可能对于很多人来说,因为找不到相关的文档,都是模仿内核中已有的文件来写自己的 Makefile。其实,在内核的Documentation / kbuild目录下面,还是有对内核Makefile语法的详细说明的。在这里就2.6内核中Makefile最常见的简单应用情况做一个翻译和归纳介绍。
    2.6内核的Makefile分为5个组成部分:
    l 最顶层的Makefile
    l 内核的.config配置文件
    l 在arch/$(ARCH) 目录下的体系结构相关的Makefile
    l 在scripts/ 目录下的 Makefile.* 文件,是一些Makefile的通用规则
    l 各级目录下的大概约500个kbuild Makefile文件
    顶层的Makefile文件读取 .config文件的内容,并总体上负责build内核和模块。Arch Makefile则提供补充体系结构相关的信息。 Scripts目录下的Makefile文件包含了所有用来根据kbuild Makefile 构建内核所需的定义和规则。
    1.2 Kbuild Makefile
    对于Makefiles的不同组成部分,有一些不同的语法规则。针对的对象也不同,对于大部分内核模块或设备驱动的开发者和使用者来说,最常接触到的就是各层目录下基于kbuild架构的kbuild Makefile文件。
    Kbuild Makefile的语法结构非常简单,核心内容主要包括
    1.2.1 目标定义
    目标定义就是用来定义哪些内容要做为模块编译,哪些要编译链接进内核。
    例如
    obj-y += foo.o
    表示要由foo.c或者foo.s文件编译得到foo.o并链接进内核,而obj-m则表示该文件要作为模块编译。 除了y,m以外的obj-x形式的目标都不会被编译。
    而更常见的做法是根据.config文件的CONFIG_ 变量来决定文件的编译方式,如:
    obj-$(CONFIG_ISDN) += isdn.o
    obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o
    除了obj-形式的目标以外,还有lib-y library库,hostprogs-y 主机程序等目标,但是基本都应用在特定的目录和场合下。
    1.2.2 多文件模块的定义
    最简单的kbuild 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
    1.2.3 目录层次的迭代
    如下例:
    obj-$(CONFIG_EXT2_FS) += ext2/
    如果CONFIG_EXT2_FS 的值为y或m,kbuild将会将ext2目录列入向下迭代的目标中,但是其作用也仅限于此,具体ext2目录下的文件是要作为模块编译还是链入内核,还是有ext2目录下的Makefile文件的内容来决定的。
    1.2.4 模块的编译
    编译模块的时候,你可以将模块放在代码树中,用Make modules的方式来编译你的模块,你也可以将模块相关文件目录放在代码树以外的位置,用如下命令来编译模块:
    make -C path/to/kernel/src M=$PWD modules
    -C指定代码树的位置,M=$PWD 或 M=`PWD` 告诉kbuild回到当前目录来执行build操作。
    1.2.5 模块的安装
    当你需要将模块安装到非默认位置的时候,你可以用INSTALL_MOD_PATH 指定一个前缀,如:
    make INSTALL_MOD_PATH=/foo modules_install
    模块将被安装到 /foo/lib/modules目录下。

  • 相关阅读:
    socket.io的抽象实现:engine.io
    Juicer javascript 模板引擎
    phonegap 开发案例
    安卓升级提示 phoneGap APK软件更新提示
    搭建Titanium开发环境
    phonegap WebApp
    vue-cli 配置vue项目环境笔记
    从一张表里面查询后十条数据的前七条
    js实现文字搬运工
    MySQL —— 数据库数据备份命令 mysqlump 的使用
  • 原文地址:https://www.cnblogs.com/cute/p/1993712.html
Copyright © 2011-2022 走看看