一:linux内核裁剪:

  1:编译内核源码:

    今天的重点内容是内核驱动的编写,在编写驱动之前首先的了解linux内核源码,linux主要是由五个子系统组成:进程调度,内存管理,文件系统,网络接口以及进程间通信;下面是解压的linux内核源码文件:

  下面对linux内核里面的文件进行简单的说明:

  arch目录中包含于体系结构有关的子目录和文件,arm的相关平台信息在arch/arm目录下。

  scripts目录中存放着对核心配置的脚本文件。

  crypto目录中包含着常见的加密算法。

  drivers目录包含各种各样的驱动,包括字符型,快型,网络设备驱动程序。

  fs目录中包括了linux系统所支持的文件系统类型,比如ext4 nfs

  init目录中存放着与linux内核相关的启动代码。

  kernel目录中包含许多linux进程调度子系统相关的源代码。

  lib目录存放linux内核所用的库文件。

  mm目录存放linux内存管理的源代码。

  net目录存放有关网络协议的源代码。

  编译linux内核源码,最重要的是Makefile,在linux内核中每个文件都有一个Makefile,统一由最外层的Makefile来调用:Makefile这个文件中包含了许多linux内核配置的信息,我们Linux内核要编译的平台,交叉编译器的选择(如下图),编译链接Linux内核的参数;

  由于linux源代码非常庞大,我们找起来非常困难;在编译linux之前先介绍一个管理工具ctags

  在linux源码中我们使用命令[root@192 linux-3.5]# ctags -R ./

  等它执行完毕(要几分钟),我们可以用vim任意打开一个文件,在命令模式下输入:ta <需要找的函数名>回车就可以了 

   

  2:linux源码编译

  下面是linux源码编译步骤:

  (1)在编译之前首先使用make clean, make distclean清除原编译和配置文件

  (2)找到运行平台(arm)下面的配置文件拷贝到源码目录一命名为  .config,.config文件是在进行内核配置的时候,经过配置后生成的内核编译参考文件,命令如下

   [root@192 linux-3.5]# cp arch/arm/configs/exynos4_defconfig   .config

  (3)拷贝完成之后就可以运行make命令,这个过程要等很久:

   [root@192 linux-3.5]#make

  (4)编译完成之后就会在arch/armboot目录下生成zImage,生成的这个文件就是linux镜像

   [root@192 linux-3.5]# arch/arm/boot/zImage
   之后我们就可以使用linux的镜像文件了

  (2):linux内核裁剪

   以上编译的是没有裁剪过linux源码,如果我们不想使用源码里面的部分功能,我们就可以通过裁剪的方式阻止它编译:在linux源码包中我们可以使用make menuconfig,图形化界面很容易操作;就可以进行linux的源码的裁剪:

  (1)首先在源码包中运行make menuconfig这个命令

  如果不想使用它的某些功能,取消前面*即可,按空格键来控制选择

  (2)保存退出,执行make

  二:编译可加载模块

  内核模块是Linux内核向外部提供的一个插口,其全称为动态可加载内核模块(Loadable Kernel Module,LKM),我们简称为模块,模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。它在运行时被链接到内核作为内核的一部分在内核空间运行,这与运行在用户空间的进程是不同的。模块通常由一组函数和数据结构组成,用来实现一种文件系统、一个驱动程序或其他内核上层的功能。

  总之,模块是一个为内核(从某种意义上来说,内核也是一个模块)或其他内核模块提供使用功能的代码块。

  Linux内核模块是一种可被动态加载和卸载的可执行程序。通过内核模块可以扩展内核功能,内核模块通常用于设备驱动、文件系统等。如果没有内核模块,需要向内核添加功能就需要自发代码、重新编译内核、安装新内核等步骤;

  下面我们实现一个简单的linux模块:

 #include <linux/init.h>
#include <linux/module.h> MODULE_LICENSE("GPL");//指定GPL协议
MODULE_AUTHOR("BUNFLY"); int bunfly_init()
{
printk("this is bunfly_init\n"); return ;
} void bunfly_exit()
{
printk("this is bunfly_exit\n");
} module_init(bunfly_init);
module_exit(bunfly_exit);

  需要注意的是:编写模块函数时,声明模块的授权协议,如果没有的话,编译器有警告的,如果在模块函数中调用的设备驱动模型的代码,就必须要指定为GPL协议,否则是不能加载到内核中,在linux内核中输出函数不再是printf(), 而是用的是printk();printk相当于printf的孪生姐妹,她们一个运行在用户态,另一个则在内核态。

  模块是动态加载内核中,是内核的一部分,它没有main函数,因此在编译的时候我们要需调用内核中的Makefile来编译模块;下面是Makefile文件内容:

 all:
make -C /home/bunfly/source_code/linux-3.5 M=`pwd` clean:
make -C /home/bunfly/source_code/linux-3.5 M=`pwd` clean obj-m += bunfly.o

在编辑Makefile的时候我们需要注意的是代码第8行:它分为三种模式:

(1)obj-不编入内核

(2)obj -y编入内核

(3)obj-m编译成模块

  如果要将自己的模块写到make menuconfig菜单中去,就要用到另一个配置文件Kconfig,在Linux 内核源码树的每个目录下都有两个文档Kconfig和Makefile。分布到各目录的Kconfig构成了一个分布式的内核配置数据库,每个 Kconfig分别描述了所属目录源文档相关的内核配置菜单。在执行内核配置make menuconfig时,从Kconfig中读出菜单,用户选择后保存到.config的内核配置文档中。在内核编译时,主Makefile调用这 个.config,就知道了用户的选择。这个内容说明了,Kconfig就是对应着内核的每级配置菜单。

linux内核裁剪及编译可加载模块的更多相关文章

  1. linux内核启动以及文件系统的加载过程

    Linux 内核启动及文件系统加载过程 当u-boot 开始执行 bootcmd 命令,就进入 Linux 内核启动阶段.普通 Linux 内核的启动过程也可以分为两个阶段.本文以项目中使用的 lin ...

  2. Linux内核和根文件系统引导加载程序

    续博文<u-boot之u-boot-2009.11启动过程分析> Linux内核启动及文件系统载入过程 当u-boot開始运行bootcmd命令.就进入Linux内核启动阶段,与u-boo ...

  3. Linux驱动之内核加载模块过程分析

    Linux内核支持动态的加载模块运行:比如insmod first_drv.ko,这样就可以将模块加载到内核所在空间供应用程序调用.现在简单描述下insmod first_drv.ko的过程 1.in ...

  4. [driver]linux内核动态加载模块

    问题: 1. 把编译好的模块放到板子/lib/modules对应文件夹下,并且执行了depmod -a, 比如pl2303.ko, 那么下一次插入pl2303的串口线,是否可以识别,也就是自动加载pl ...

  5. 嵌入式 Linux 与linux启动时自动加载模块

    一.在ARM linux 下,一般而言,产品在启动的过程中应该加载模块,最简单的方法是修改启动过程的rc脚本(/etc/init.d/rcS),增加ismod /../xxx.ko这个命令.例如:加载 ...

  6. Linux中实现在系统启动时自动加载模块

    下面是以前学习Linux时写的,后来仔细研究rc.sysinit后发现,只需要修改下列地方就可以了,不必这么麻烦的: rc.sysinit中有这样的一段代码: # Load other user-de ...

  7. Linux内核裁剪的具体步骤

    在menuconfig中配置: 详细介绍内核配置选项及删改情况 第一部分:全部删除 Code maturity level options ---> 代码成熟等级选项 []Prompt for  ...

  8. Linux下c函数dlopen实现加载动态库so文件代码举例

    dlopen()是一个强大的库函数.该函数将打开一个新库,并把它装入内存.该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的.这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了. ...

  9. Java类编译、加载、和执行机制

    Java类编译.加载.和执行机制 标签: java 类加载 类编译 类执行 机制 0.前言 个人认为,对于JVM的理解,主要是两大方面内容: Java类的编译.加载和执行. JVM的内存管理和垃圾回收 ...

随机推荐

  1. FFMPEG列出DirectShow支持的设备

    FFMPEG列出dshow支持的设备: ffmpeg -list_devices true -f dshow -idummy 举例: 采集摄像头和麦克风 ffmpeg -f dshow -i vide ...

  2. STL常用遍历算法for_each和transform的比较

    for_each()和transform()算法比较 1)STL 算法 – 修改性算法  for_each()  copy()  copy_backward()  transform()  merge ...

  3. Erlang cowboy 架构

    Erlang cowboy Architecture架构 Erlang cowboy参考: http://ninenines.eu/docs/en/cowboy/1.0/guide/ 本章Archit ...

  4. 开源组件photoView学习

    功能特性 支持放缩超出边界,多点触控和双击事件 滚动和滑动 和ViewPager等能完美兼容 矩阵变化等有回调,方便前台其他展示的改变 单击,长按都有回调提醒 源码剖析 那么怎么来学习他的源码呢,我们 ...

  5. 四、删除 Delete

    文档目录 开始使用  初始化查询实例: LambdaToSql.SqlClient DB = new LambdaToSql.SqlClient(); 删除单个实体,通过Guid主键删除 var gu ...

  6. 《深入理解JAVA虚拟机》笔记1

    java程序运行时的内存空间,按照虚拟机规范有下面几项: )程序计数器 指示下条命令执行地址.当然是线程私有,不然线程怎么能并行的起来. 不重要,占内存很小,忽略不计. )方法区 这个名字很让我迷惑. ...

  7. Python的基本数据数字、字符串、布尔值及其魔法

    基本数据类型介绍 若要把Pyhton的基本数据类型:数字(int).字符串(str).布尔(bool).列表(list).元组(tuple).字典(dict)都分为一个个不同的角色 如:战士,魔法师, ...

  8. 影响Sql server性能的因素

    目前本人在看<SQL Server性能调优实战> ,以下内容是本人看书笔记 数据库性能取决于各方面综合因素: 硬件,操作系统,软件 硬件:内存,CPU,磁盘 当服务器的物理内存不足时,会产 ...

  9. Angular5 宏观把控

    1.首先,Angular5相对于Angular4有了一些新的特性: (1)i18n国际化管道: (2)一个组件可以以多个名称导出: (3)使用httpClient: 相比于http,httpClien ...

  10. SharePoint2013 列表栏设置

    在实际项目中,会遇到对列表栏的深度操作,比如设置在新建项目也就是newForm是否可见,是否有默认值,默认标题等等,这类深度操作在页面上是无法配置的,因为需要设置SPFild这个对象,但是用share ...