在编译Linux内核中增加程序需要完成以下3项工作:
  • 将编写的源代码拷入Linux内核源代码的相应目录。
  • 在目录的Kconfig文件中增加关于新源代码对应项目的编译配置选项
  • 在目录的Makefile文件中增加对新源代码的编译条目

下面给出在内核中新增驱动代码目录和子目录的实例

假设我们要在内核源代码drivers目录下为ARM体系结构新增如下用于 test driver的树形目录:
|--test
      |-- test.c
        在内核中增加目录和子目录,我们需要为相应的新增目录创建Makefile和Kconfig文件,而新增目录的父目录中的Kconfig和Makefile能被引用。
        在新增的test目录下,应该包含如下Kconfig文件:
#
# TEST driver configuration
#
menu "TEST Driver "
comment " TEST Driver"
 
config TEST_DRIVER
bool "TEST support "
 
config TEST_DRIVER_USER
tristate "TEST user-space interface"
depends on TEST_DRIVER
help
TEST Driver Configuration
 
endmenu
        由于 test driver对于内核来说是新的功能,所以需要首先创建一个菜单TEST Driver。然后显示“TEST support”,等待用户选择;接下来判断用户是否选择了TEST Driver,如果是(CONFIG_TEST_DRIVER=y),则进一步显示子功能:用户接口与CPU功能支持;由于用户接口功能可以被编译成内核模块,所以这里的询问语句使用了tristate。
注意:这里config TEST_DRIVER语句最终被同一层Makefile读取到的变量是CONFIG_TEST_DRIVER
        为了使这个Kconfig能起作用,修改drivers/Kconfig文件,增加:

source "drivers/test/Kconfig"

        脚本中的source意味着引用新的Kconfig文件。
        在新增的test目录下,应该包含如下Makefile文件:
# drivers/test/Makefile
#
# Makefile for the TEST
#
obj-$(CONFIG_TEST_DRIVER_USER) += test.o
 
obj-$(CONFIG_XXX_XXX) += xxx/
(如果还有子目录的话需要在Kconfig中添加相应的变量并且在Makefile中添加上面这句话)
        在drivers/Makefile中加入

obj-$(CONFIG_TEST_DRIVER) += test/

使在用户进行内核编译时能够进入test目录。
        增加了Kconfig和Makefile之后的新的test属性目录为:
|--test
     |-- test.c
     |-- Makefile
     |-- Kconfig
        在内核顶层目录中输入

make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- menuconfig

(如果是x86就不需要ARCH和CROSS_COMPILE这两个变量了,我是交叉编译linux)
找到Device Driver---> TEST DRIVER目录:
进入该目录以后可以看到如果没有选中TEST SUPPORT,那么下面的菜单式不会弹出来的,这是由于前面Kconfig中:
config TEST_DRIVER_USER
tristate "TEST user-space interface"
depends on TEST_DRIVER

的配置,使得这个需要依赖于CONFIG_TEST宏,如下图所示:

        选择TEST DRIVER以后就会出现下面的TEST user-space interface选项,我们将它选成M,也就是变成内核模块

配置完成以后保存配置 ,然后编译内核模块,这里由于是进行交叉编译,所以会多出ARCH=arm以及CROSS_COMPILE=arm-xilinx-linux-gnueabi-两个变量:

$ make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- modules -j8
  CHK     include/linux/version.h
  CHK     include/generated/utsrelease.h
make[1]: \u201cinclude/generated/mach-types.h\u201d\u662f\u6700\u65b0\u7684\u3002
  CALL    scripts/checksyscalls.sh
  CC [M]  drivers/test/test.o
  Building modules, stage 2.
  MODPOST 23 modules
WARNING: modpost: Found 1 section mismatch(es).
To see full details build your kernel with:
'make CONFIG_DEBUG_SECTION_MISMATCH=y'
  CC      drivers/test/test.mod.o
  LD [M]  drivers/test/test.ko

35、在编译Linux内核中增加程序需要完成以下3项工作的更多相关文章

  1. (repost)在ARM Linux内核中增加一个新的系统调用

    实验平台内核版本为4.0-rc1,增加一仅仅打印Hello World的syscall,最后我们在用户空间swi验证 实验平台内核版本为4.0-rc1,增加的系统调用仅仅是简单打印一个Hello Wo ...

  2. 【转】Linux驱动模块编译进内核中

    原文网址:http://blog.chinaunix.net/uid-29287950-id-4573481.html BQ27501驱动编译进内核 一.       驱动程序编译进内核的步骤 在 l ...

  3. 【总结】嵌入式linux内核中Makefile、Kconfig、.config的关系及增加开机Hello World【转】

    本文转载自:http://blog.csdn.net/fengyuwuzu0519/article/details/73772109 为了弄清内核的组织结构,我们先来实现下面这个简单的例子. 一.增加 ...

  4. 调皮的程序员:Linux之父雕刻在Linux内核中的故事

    本文内容由公众号“格友”原创分享. 1.引言   (不羁的大神,连竖中指都这么帅) 因为LINUX操作系统的流行,Linus 已经成为地球人都知道的名人.虽然大家可能都听过钱钟书先生的名言:“假如你吃 ...

  5. 为什么要编译Linux内核?

    新的内核修订了旧内核的bug,并增加了许多新的特性.如果用户想要使用这些新特性,或想根据自己的系统度身定制一个更高效,更稳定的内核,就需要重新编译Linux内核. 通常,更新的内核会支持更多的硬件,具 ...

  6. Linux内核中的jiffies及其作用介绍及jiffies等相关函数详解

    在LINUX的时钟中断中涉及至二个全局变量一个是xtime,它是timeval数据结构变量,另一个则是jiffies,首先看timeval结构struct timeval{time_t tv_sec; ...

  7. 嵌入式C语言自我修养 01:Linux 内核中的GNU C语言语法扩展

    1.1 Linux 内核驱动中的奇怪语法 大家在看一些 GNU 开源软件,或者阅读 Linux 内核.驱动源码时会发现,在 Linux 内核源码中,有大量的 C 程序看起来“怪怪的”.说它是C语言吧, ...

  8. Linux内核中内存cache的实现【转】

    Linux内核中内存cache的实现 转自:http://blog.chinaunix.net/uid-127037-id-2919545.html   本文档的Copyleft归yfydz所有,使用 ...

  9. Linux 内核中的 GCC 特性

    https://www.ibm.com/developerworks/cn/linux/l-gcc-hacks/ GCC 和 Linux 是出色的组合.尽管它们是独立的软件,但是 Linux 完全依靠 ...

随机推荐

  1. deep-in-es6(二)

    es6-生成器Generators: eg: function* quips(name) { yield "您好"+name+"!"; if(name.star ...

  2. css3--简单的加载动画

    .load-container { width: 30%; height: auto; position: relative; margin: 1rem auto; } .load { width: ...

  3. coverage python 代码覆盖率工具使用(django 使用)

    1. 安装包 pip install coverage 2.启动程序 coverage run -m pytest 3.获取html格式的报告文件 coverage html 4.创建配置文件 .co ...

  4. 洛谷 P1226 取余运算||快速幂

    P1226 取余运算||快速幂 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出“b^p mod ...

  5. iOS -读书笔记-网络请求

    知道"3次握手"吗?突然想起这个词 什么是3次握手? TCP三次握手/四次挥手详解 这里是3次握手的详解 3次握手就是为了可靠的传送数据,TCP(什么是TCP呢?TCP就是一种可靠 ...

  6. C++的class的样例

    私有就是仅仅可以通过内部调用,在类外面是不可以使用私有成员的 简单的写一个  Class A {  public:    //你能够通过公有的函数去訪问私有成员    Demo()   //能够在这使 ...

  7. 程序猿的量化交易之路(14)--Cointrader数据表(2)

    Cointrader表结构 转载须注明出处:http://blog.csdn.net/minimicall?viewmode=contents,http://cloudtrader.top 设置(se ...

  8. 转:Java的一道面试题----静态变量初始化过程

    public class Test{ private static Test tester = new Test(); //step 1 private static int count1; //st ...

  9. stm8开发环境配置及测试

    需要准备的软件,硬件,IAR for stm8 (EWSTM8).stm8s标准固件库.ST-LINK.STM8s003f3核心板 安装IAR(其中包括st-link的驱动), 到这个网址下载stm8 ...

  10. Linux shell command学习笔记(二)

    <cut> 作用:从输入文件或者命令的输出中析取出各种域 用法:cut –c{字符串范围} –d{字段间分割符} –f{字段索引编号} 举例: (1)查看在线用户:who | cut –c ...