在编译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. 使用Vue动态生成form表单

    form-create 表单生成器 具有数据收集.校验和提交功能的表单生成器,支持双向数据绑定和事件扩展,组件包含有复选框.单选框.输入框.下拉选择框等表单元素以及省市区三级联动,时间选择,日期选择, ...

  2. python2 pip安装包等出现各种编码错误UnicodeDecodeError: 'ascii'(/或者utf-8) codec can't decode byte 0xd2...

    1.问题描述: python2环境,pip安装包时报错UnicodeDecodeError: 'ascii'(/或者utf-8) codec can't decode byte 0xd2... 类似如 ...

  3. 【Django】MEDIA的配置及用法

    如果需要在数据库中存储图片或视频类的数据,我们可以配置MEDIA. 下面的示例将以上传一张图片的形式来说明MEDIA的配置及用法. 第一步 settings.py # media配置 MEDIA_UR ...

  4. 【习题 8-6 UVA - 1611】 Crane

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 想把数字i从位置j移动到位置i 可以这样. 假设mov(x,y)表示将(x..x+len/2-1)和(x+len/2..y)交换. ...

  5. LeetCode 06 ZigZag Conversion

    https://leetcode.com/problems/zigzag-conversion/ 水题纯考细心 题目:依照Z字形来把一个字符串写成矩阵,然后逐行输出矩阵. O(n)能够处理掉 记i为行 ...

  6. 给Linux设置SSH登录邮件提醒

    给Linux设置SSH登录邮件提醒 心血来潮,用 last 命令查看了登录记录,不看不知道,一看就有问题.竟然有两个陌生的IP ,一个是美国欧莱雅的,一个是北京联通的.真是郁闷,密码简单了真不行 后来 ...

  7. 63.当当网txt数据按行切割与合并

    获取文件有多少行 //获取文件有多少行 int getN(char *path) { FILE *pf = fopen(path, "r"); if (pf==NULL) { ; ...

  8. Mahout应用

    不多说,直接上干货! Mahout作为Apache基金会的顶级项目之一,Mahout的应用也极其广泛,一般分为商业应用和学术应用. 在商业应用中,Adobe AMP公司使用Mahout的聚类算法把用户 ...

  9. Spring CORS

    转载:Spring MVC 4.2 增加 CORS 支持 http://spring.io/blog/2015/06/08/cors-support-in-spring-framework http: ...

  10. 洛谷 P1416 攻击火星

    P1416 攻击火星 题目描述 一群外星人将要攻击火星. 火星的地图是一个n个点的无向图.这伙外星人将按照如下方法入侵,先攻击度为0的点(相当于从图中删除掉它),然后是度为1的点,依此类推直到度为n- ...