精华内容
下载资源
问答
  • Linux内核模块

    2019-04-17 22:09:00
    Linux内核模块的特点: (1)模块本身不被编译入内核镜像,从而控制了内核的大小。 (2)模块一旦被加载,它就和内核中的其他部分完全一样。 2. Linux内核模块操作指令 (1)lsmod 显示系统中已加载的所有模块...

    1. Linux内核模块

    Linux本身是宏内核(单内核),但是又提供了模块这样一种机制,构成了Linux独有的模块特性。

    Linux内核模块的特点:

    (1)模块本身不被编译入内核镜像,从而控制了内核的大小。

    (2)模块一旦被加载,它就和内核中的其他部分完全一样。

    2. Linux内核模块操作指令

    (1)lsmod

            显示系统中已加载的所有模块,实际就是读取并分析“/proc/modules”文件。

            注:内核中已安装的模块的信息也存在于“/sys/module”目录下。

    (2)insmod

            向系统中加载模块。

    (3)rmmod

            从系统中卸载模块。

    (4)modinfo

            获取模块信息,包括模块作者、模块的说明、模块所支持的参数以及vermagic。

            注:向系统加载模块时,会比较模块的vermagic和Linux内核的vermagic是否一致。若不一致,不加载。

    (5)modprobe

            它的功能比insmod强大,向系统中加载模块,并同时加载模块所依赖的其他模块。

    3. Linux内核模块结构

    (1)模块加载函数

            当通过insmod或modprobe命令加载内核模块时,模块的加载函数会自动被内核执行,完成本模块的相关初始化工作。

    (2)模块卸载函数

            当通过rmmod命令卸载某模块时,模块的卸载函数会自动被内核执行,完成与模块加载函数相反的功能。

    (3)模块许可证声明

            许可证(LICENCE)声明描述内核模块的许可权限。如果不声明LICENCE,模块被加载时,会受到内核被污染(Kernel Tainted)的警告。

            在Linux内核模块领域有很多许可证声明,在大多数情况下,内核模块应遵循GPL兼容许可权权。Linux内核模块最常见的是以MODULE_LICENCE("GPL v2")语句声明模块采用GPL v2。

    (4)模块参数(可选)

            模块参数是模块被加载时可以传递给它的值,它本身对应模块内部的全局变量。

    (5)模块导出符号(可选)

            内核模块可以导出的符号(symbol,对应于函数或变量),若导出,其他模块则可以使用本模块中的变量或函数。

    (6)模块作者等信息声明(可选)

    4. 模块加载函数

            Linux内核模块加载函数一般以__init标识声明,典型的模块加载函数:

    static int __init initialization_function(void)
    {
        /* 初始化代码 */
    }
    module_init(initialization_function);

            模块加载函数通过“module_init(函数名)”的形式指定,若初始化成功,返回0,;若初始化失败返回错误编码。

            注:在Linux内核里,错误编码是一个接近于0的负值,在<linux/errno.h>中定义,包含-ENODEV、-ENOMEM之类的符号值。总是返回相应的错误编码是种非常好的习惯,因为只有这样,用户程序才可以利用perror等方法把它们转换成有意义的错误信息字符串。

            注:在Linux内核中,可以使用request_module(const char *fmt)函数加载内核模块。

    5. 模块卸载函数

            Linux内核模块加载函数一般以__exit标识声明,典型的模块卸载函数:

    static void __exit cleanup_function(void)
    {
        /* 释放代码 */
    }
    module_exit(cleanup_function);

            模块卸载函数不返回任何值,且必须以"module_exit(函数名)"指定。

    6. 模块参数

            使用"module_param(参数名, 参数类型, 参数读/写权限)"定义参数。

            在装载内核模块时,可以使用"insmod (或modprobe) 模块名 参数名=参数值"的形式传递参数,如果不传递,参数将使用模块内部的缺省值。

            注:若模块被内置,就无法insmod了,但是bootloader可以通过在bootargs里设置"模块名.参数名=值"的形式给该内置的模块传递参数。

            注:模块被加载后,在/sys/module目录下将出现以此模块命令的目录。当模块有参数并且“参数读/写权限”不为0时,在此模块的目录下将出现parameter目录,其中包含以参数命名的文件节点。这些文件的权限就是传入module_param()的“参数读写权限”,而文件的内容为参数的值。

    7. 导出符号

            模块可以使用如下宏导出符号:

            EXPORT_SYMBOL(符号名);

            EXPORT_SYMBOL_GPL(符号名);        --        只适用于包含GPL许可权的模块

            导出的符号可以被其他模块使用,使用前只需声明一下即可。

            注:模块导出的符号会放入内核符号列表中。Linux的"/proc/kallsyms"文件对应着内核符号列表,它记录了符号以及符号所在的内存地址。

    8. 模块的声明与描述

            在Linux内核模块中,使用MODULE_AUTHOR、MODULE_DESCRIPTION、MODULE_VERSION、MODULE_DEVICE_TABLE、MODULE_ALIAS分别声明作者、描述、版本、设备表和别名。

    9. 模块的使用计数

            在Linux2.6以后的内核提供了模块计数管理接口:try_module_get(&module)和module_put(&module)。

            注:在这里该部分仅仅提一下,具体的到后面再详细分析。

    10. 模块编译

    # Ubuntu的Linux内核源码位置:若在Ubuntu中加载,取消下面两行的注释
    #KERN_VER = $(shell uname -r)
    #KERN_DIR = /lib/modules/$(KERN_VER)/build	
    
    		
    # 开发板的Linux内核源码位置
    KERN_DIR = /root/driver/kernel
    
    # 内核模块
    obj-m += hello.o
    
    # 内核模块编译标志
    #EXTRA_CFLAGS = -g -O0
    
    all:
    	make -C $(KERN_DIR) M=`pwd` modules 
    
    clean:
    	make -C $(KERN_DIR) M=`pwd` modules clean

            注:模块编译的工作原理就是使用make -C进入到内核源码目录下,然后在内核源码目录下借用内核源码中定义的模块编译规则去编译这个模块,编译完成后,把生成的文件拷贝到当前目录下,完成编译。

            注:若一个模块包含多个.c文件(如file1.c、file2.c),则使用如下方式编写Makefile:

            obj-m := modulename.o

            modulename-objs := file1.o file2.o

    展开全文
  • 什么是内核模块

    2016-04-18 14:52:47
    1、什么是内核模块 Linux内核的整体结构非常庞大,其包含的组件也非常多,如何使用这些组件呢? 方法1:把所有组件都编译进内核文件,即zImage或bzImage。...内核模块的特点: 1.模块本身并不被编译进内

    1、什么是内核模块

    Linux内核的整体结构非常庞大,其包含的组件也非常多,如何使用这些组件呢?

    方法1:把所有组件都编译进内核文件,即zImagebzImage

    这样会导致一个问题:占用内存过多

     

    有没有一种机制能让内核文件本身并不包含某组件,而是在该组件需要被使用的时候,动态的添加到正在运行的内核当中呢?

    方法2:内核模块

    内核模块的特点:

    1.模块本身并不被编译进内核文件zImage或者bzImage

    2.可以根据需求,在内核运行期间动态安装或卸载

     

    安装:insmod

    例:insmod  /home/usb_dwn.ko

    卸载:rmmod

    例:rmmod   usb_dwn

    查看:lsmod

    展开全文
  • 内核模块的加载与卸载

    万次阅读 2012-03-16 11:04:03
    Linux内核是个很庞大的东西,要全部了解清楚是很难的,所以我们所做的内核上的开发也是为驱动做...一、内核模块的特点  a) 不会被编译进内核之中,这样的话可以尽可能的控制Linux内核的大小。  b) 在内核运行期

    Linux内核是个很庞大的东西,要全部了解清楚是很难的,所以我们所做的内核上的开发也是为驱动做一些基本的准备。

    其中Linux的系统的构成、内核的构成还有内核的目录结构在这里就不去做过多的解释,有兴趣的可以自己查找相关的资料。

     

    一、内核模块的特点

        a)        不会被编译进内核之中,这样的话可以尽可能的控制Linux内核的大小。

        b)        在内核运行期间,可以动态的进行加载或卸载。

     

    二、相关函数的介绍

        a)        module_init宏表示在加载模块的时候,自动调用这个宏所指示的函数。

        b)        module_exit宏表示在卸载模块的时候,自动调用这个宏所指示的函数。

     

    例如:

             代码中:

                       module_init(funa);

                       module_exit(funb);

             当加载该模块时,自动调用funa函数,同理当卸载该模块时,自动调用funb函数。

     

    三、模块的相关命令

        a)        加载模块:insmod   modprobe

        b)        卸载模块:rmmod

        c)        查看模块:lsmod

     

    insmod和modprobe的区别:

             当a模块与b模块有依赖关系时,假设安装b模块需先安装a模块。

             如果用insmod命令那么需要先insmod  a.ko 然后再insmod  b.ko。

             如果用modprobe命令那么直接可以modprobeb.ko。

             其中/lib/modules/“内核版本号”/modules.dep中记录了模块之间的依赖关系。

     

             rmmod命令:只需要调用模块名即可,比如安装的时候是inmod  a.ko 安装完毕后该模块存在于内核中的名字为a,那么卸载该模块只需要rmmod  a即可。


    展开全文
  • 内核模块基础

    2012-08-06 12:53:23
    一、内核模块的特点  a) 不会被编译进内核之中,这样的话可以尽可能的控制Linux内核的大小。  b) 在内核运行期间,可以动态的进行加载或卸载。   二、相关函数的介绍  a) m

    Linux内核是个很庞大的东西,要全部了解清楚是很难的,所以我们所做的内核上的开发也是为驱动做一些基本的准备。

     

    一、内核模块的特点

        a)        不会被编译进内核之中,这样的话可以尽可能的控制Linux内核的大小。

        b)        在内核运行期间,可以动态的进行加载或卸载。

     

    二、相关函数的介绍

       a)        module_init宏表示在加载模块的时候,自动调用这个宏所指示的函数。

       b)        module_exit宏表示在卸载模块的时候,自动调用这个宏所指示的函数。

     

    例如:

             代码中:

                      module_init(funa);

                      module_exit(funb);

             当加载该模块时,自动调用funa函数,同理当卸载该模块时,自动调用funb函数。

     

    三、模块的相关命令

        a)        加载模块:insmod  modprobe

        b)        卸载模块:rmmod

        c)        查看模块:lsmod

     

    insmod和modprobe的区别:

             当a模块与b模块有依赖关系时,假设安装b模块需先安装a模块。

             如果用insmod命令那么需要先insmod a.ko 然后再insmod b.ko。

             如果用modprobe命令那么直接可以modprobeb.ko。

             其中/lib/modules/“内核版本号”/modules.dep中记录了模块之间的依赖关系。

     

             rmmod命令:只需要调用模块名即可,比如安装的时候是inmod a.ko 安装完毕后该模块存在于内核中的名字为a,那么卸载该模块只需要rmmod a即可。

    前面讲了内核模块怎么安装和卸载,那么现在就正式讲解一下内核模块怎么编写。

    以一个在内核中打印出”helloworld”到终端的例子讲解。

    1、 首先要写模块加载时的入口函数和模块卸载时的入口函数

    static  int  hello_init()

    {

              printk(“<0>hello  world\n”);

              return 0;

    }

     

    static  void  hello_exit()

    {

              printk(“<0>exit\n”);

    }

     

    module_init(hello_init);

    module_exit(hello_exit);

     

    这几段代码就是一个模块函数代码了,其中有几个需要注意:

        a)        static是为了防止函数命名污染。

        b)        在内核中的打印函数是printk,其中<0>表示该信息的等级,数字越小,级别越高。

        c)        用module_init和module_exit宏来指定入口函数。

     

    当在命令行安装该模块时,会自动调用hello_init这个函数,当卸载该函数时,对自动调用hello_exit函数。

     

    2、 模块可选信息

    模块有一些用来表示相关信息的宏:

               MODULE_LICENSE                     用来告诉内核遵循什么协议  GPL GPLv2等

               MODULE_AUTHOR                    作者

               MODULE_DESCRIPTION            描述

               MODULE_VERSION                    版本

               MODULE_ALIAS                         别名

     

     

    例如:

             MODULE_LICENSE("GPL");

             MODULE_AUTHOR("yangboyuan");

             MODULE_DESCRIPTION("KernelLink Module");

              MODULE_ALIAS("asimplestmodule"); 

     

    内核模块的初始化函数,撤消函数通常是这样的形式:

            static int __init xxx-init(.....);        //函数没有参数就写void,init前是两个_

            staticvoid __exit xxx-exit(....);

            其中__init属性标志, 表明该段代码位于代码段的子段初始化段,初始化段的程序只执行一次,执行完后它所占用的内存空间将被回收。当模块加载时,__init属性的函数就被执行;

              __exit修饰词标记函数只在模块卸载时使用,如果模块被直接编进内核则该函数就不会被调用。如果内核编译时没有包含该模块,则此标记的函数将被简单地丢弃。

     

    3、 Makefile文件的编写

    大家都知道make命令,所以Makefile文件的作用在这里就没必要做过多介绍,我们先看看内核模块的Makefile怎么写的:

     

    ifneq ($(KERNELRELEASE),)

    obj-m := hello.o

    else

    KDIR := /lib/modules/2.6.35.6-45.fc14.i686/build

    all:

             make-C $(KDIR)M=$(PWD) modules

    clean:

             rm-f *.ko *.o*.mod.o *.mod.c *.symvers

    endif

     

    其中:

       a)        KERNELRELEASE是在内核源码的顶层Makefile中定义的一个变量。

                   ifneq($(KERNELRELEASE),)  判断该变量是否为空。

                    在第一次读取执行此Makefile时,KERNELRELEASE没有被定义,
                    所以make将读取执行else之后的内容。

     

      b)        KDIR := /lib/modules/2.6.35.6-45.fc14.i686/build 是给KDIR这个变量赋值,值为当前linux运行的内核源码。2.6.35.6-45.fc14.i686是我的Linux下的,可以直接

                   KDIR :=/lib/modules/ $(shell  uname  -r) /build 这样写。

     

       c)        当make的目标为all时,-C$(KDIR) 指明跳转到内核源码目录下读取那里的Makefile;M=$(PWD)表明然后返回到当前目录继续读入、执行当前的Makefile。当从内核源码目录返回时,KERNELRELEASE已被被定义,kbuild也被启动去解析kbuild语法的语句,make将继续读取else之前的内容。

       d)        我们可以把上述的Makefile文件作为一个模板,只需要改动obj-m :=hello.o这条语句就可以了:obj-m=XXX.o。

     

     编写ARM上的Makefile只需要对上面的Makefile作简单的修改即可

    ifneq($(KERNELRELEASE),)

    obj-m := hello.o

    else

    KDIR := /home/liye/forlinux/linux-2.6.36

    all:

             make-C $(KDIR)M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-

    clean:

             rm-f *.ko *.o*.mod.o *.mod.c *.symvers

    endif

     

    4、Makefile文件编写好了之后,在内核模块代码的当前目录下敲命令:”make”


    展开全文
  • 内核 模块开发

    2019-09-30 13:17:58
    linux内核整体结构非常庞大,组件合成分为2种: (1):把所有组件都编译进内核文件,即zImage或bzImage。这种有两个缺点: ...内核模块特点: (1)模块本身并不被编译进内核文件(ZImage/bzImage...
  • 一、内核模块的概念 1、什么是模块? 内核模块是一些可以让操作系统内核在需要时载入和执行的代码,同时在不需要的时候可以卸载。这是一个好的功能,扩展了操作系统的内核功能,却不需要重新启动系统,是一种动态...
  • 1. Linux内核与微内核 1.1 两者整体框图比较 1.2 单内核 操作系统各个子系统,比如说文件系统,内存管理,进程管理...特点,由于各个模块访问是通过通信方式访问,所以效率比较低,但是每个服务器相对独立,
  • 内核模块开发

    2015-06-01 20:04:46
    2.内核模块特点:模块本身并不被编译进入内核文件;在内核运行期间动态安装或者卸载 3.内核模块操作:  3.1安装:insmod  3.2卸载:rmmod  3.3查看:lsmod 4.新使用组件思路:动态加载和卸载。也...
  • 内核模块嵌入式

    2018-04-30 16:31:23
    linux内核模块编程特点:1&gt;不能使用C库和C标准头文件2&gt;必须使用GNU规范3.没有内存保护机制4.不能处理浮点运算5.注意同步和并发问题6.注意可移植性一,模块函数(1)加载函数://将模块函数用关键字...
  • Linux内核模块开发

    2019-06-03 21:38:51
    1.LINUX内核模块基础 1.1 什么是内核模块? Linux内核整体结构非常庞大,其包含组件也非常多,如何使用这些组件呢?方法1:把所有组件都编译进内核文件,即... 内核模块具有如下特点: 1)模块本身并不被编...
  • 什么是内核模块 Linux内核的整体结构非常庞大,其中包含的组件也非常多,如何使用这些组件。一种方式是把所有的组件都编译进内核文件,...内核模块的特点: 1.模块本身并不被编译进内核文件 2.在内核运行期间动态...
  • linux内核模块简介

    2014-07-31 11:36:28
    模块的特点 l  模块本身不被编译入内核镜像,从而控制了内核的大小。 l  模块一旦被加载,他就和内核中能够的其他部分完全一样。   Linux内核模块的组成部分 1、  模块加载函数:用insmod和modprobe加载内核...
  • linux内核模块开发

    2017-04-02 21:55:58
    linux内核模块开发 什么是内核模块?  linux内核整体结构非常庞大,其包含... 因此需要我们的内核模块机制,其具有以下特点: 1、 模块本身并不编译进内核文件 2、 可以根据需求,在内核运行期间动态
  • linux内核模块的安装与卸载

    千次阅读 2014-02-17 11:00:05
    Linux提供了一种动态加载内核机制,这种机制称为模块(Module),模块具有...为了方便理解,下面从一个最简单的内核模块“Hello World” 开始。 1、在/home/china/test中编写hello.c文件 如下: #include #inclu
  • 总之,模块是一个为内核(从某种意义上来说,内核也是一个模块)或其他内核模块提供使用功能代码块。  准确地说,模块就是一个已编译但未连接可执行文件。  前面反复介绍Linux是一个一体化内核,由于内核...
  • (1)内核模块是具有独立功能程序,它可以被单独编译,但是不能独立运行,他必须连接到内核作为内核一部分在内核空间中运行。 (2)模块编程与内核版本密切相关,由于不同内核版本中某些函数函数名会有...
  • Linux - 内核模块

    2020-11-03 10:00:25
    一、linux内核模块编程特点: 1.不能使用C库和C标准头文件 2.必须使用GNU规范 3.没有内存保护机制 4.不能处理浮点运算 5.注意同步和并发问题 6.注意可移植性 二、加载函数和卸载函数格式 加载函数 int xxx(void) /...
  • Linux内核模块的编译基础知识

    千次阅读 2011-04-19 19:14:00
    1 内核模块的概念介绍内核模块的同时,也说明一下和应用程序的区别。虽然内容很多,但觉得都很有用。1、内核模块是一些可以让操作系统内核在需要时载入和执行的代码,同时在不需要的时候可以卸载。这是一个好的功能...
  • Linux 内核模块简介

    2014-03-27 11:45:52
    模块具有这样的特点:  模块本身不被编译入内核映像,从而控制了内核的大小。  模块一旦被加载,它就和内核中的其它部分完全一样。 一、模块的组成  一个Linux内核模块主要由如下几个部分组成:  (1)模块...
  • linux内核模块

    2012-08-27 17:12:57
    1.linux内核的整体机构已经能够非常庞大,而其包含的组件也非常多,我们怎么把需要的部分都包含的内核中呢? 一种方法就是把所有需要的功能都编译到linux ...模块具有这样的特点: 1.模块本身不被编译入内核镜像
  • 第四章 Linux内核模块

    2017-06-29 17:39:03
    内核模块特点: 1)模块本身不被编译进内核映像中,从而控制内核大小。 2)模块被加载后,它跟内核中其他部分完全一样。 内核加载命令: lsmod 内核卸载命令: rmmod 加强型内核加载函数: modprobe——...
  • Linux内核模块编程

    2019-01-30 17:19:30
    1.Linux内核模块编程特点 1)不能使用C库和C标准头文件 2)必须使用GNU规范 3)没有内存保护机制 4)不能处理浮点运算 5)注意同步和并发问题 6)注意可移植性 2.函数架构 int xxx(void) {  return 0;//成功 ...
  • 前言:Linux 设备驱动会以内核模块的形式出现,因此,学会编写 Linux 内核模块编程 是学习 Linux 设备驱动的先决条件 一、模块的作用 Linux 内核的整体结构非常庞大,其包含的组件也非常多,如果把所有需要的功能都...
  • linux内核模块开发基础

    千次阅读 2016-05-06 20:35:50
     内核模块具有以下两个特点:1. 模块本身并不被编译进内核文件(zImage或bzImage),可以根据需求,在内核运行期间动态安装或卸载。 2. 为什么需要内核模块  原因:Linux内核整体结构非常庞大,其包含组件也...
  • 二、内核模块的Makefile 的编写 三、内核模块的安装、卸载 四、模块的可选信息 五、内核模块导出 六、内核加载常见的问题 一、内核模块代码的特点  何谓内核模块?为什么需要内核模块?...
  • 知识点1--模块Module简介: 模块的理解 得编译出的内核本身并不需要包含所有功能,而在这些功能需要被使用的时候, ...一个 Linux 内核模块主要由以下几个部分组成。 1) 模块加载函数(必须)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 937
精华内容 374
关键字:

内核模块的特点