精华内容
下载资源
问答
  • linux学习笔记(五)编译内核模块生成ko驱动文件 文章目录系列文章目录前言一、加载内核简介二、第一个hello world文件1.文件树2.hello.c3.Makefile三 编译命令总结 前言 系统:ubuntu 1604 功能:加载内核模块 ...

    系列文章目录

    linux学习笔记(五)编译内核模块生成ko驱动文件



    前言

    系统:ubuntu 1604
    功能:加载内核模块


    提示:以下是本篇文章正文内容,下面案例可供参考

    一、加载内核简介

    Linux内核的整体架构本就非常庞大,其包含的组件也非常多。而我们怎样把需要的部分都包含在内核中呢?一种方法是把所有需要的功能都编译到Linux内核中。这会导致两个问题,一是生成的内核会很大,二是如果我们要在现有的内核中新增或删除功能,将不得不重新编译内核。

    Linux提供了这样的机制,这种机制被称为模块(Module)。可使得编译出的内核本身并不需要包含所有功能,而在这些功能需要被使用的时候,其对应的代码被动态地加载到内核中。
    模块本身不被编译入内核映像,从而控制了内核的大小。·模块一旦被加载,它就和内核中的其他部分完全一样。
    这篇文章提供了最简单的一个内核模块工程,第一个hello world工程。

    而且是单独编译到内核中,方便安装和删除。

    二、第一个hello world文件

    1.文件树

    
    	├── hello.c
    	├── Makefile
    

    整个工程只有两个文件,一个hello.c,一个用来控制编译的Makefile。

    2.hello.c

    代码如下(示例):

    
    #include <linux/init.h>
    #include <linux/module.h>
    
    static int __init hello_init(void)
    {
    	printk(KERN_INFO "Hello World enter\n");
    	return 0;
    }
    module_init(hello_init);
    
    static void __exit hello_exit(void)
    {
    	printk(KERN_INFO "Hello World exit\n ");
    }
    module_exit(hello_exit);
    
    MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
    MODULE_LICENSE("GPL v2");
    MODULE_DESCRIPTION("A simple Hello World Module");
    MODULE_ALIAS("a simplest module");
    

    代码解析:
    内核模块中用于输出的函数是内核空间的printk()而不是用户空间的printf(),printk()的用法和printf()基本相似,但前者可定义输出级别。printk()可作为一种最基本的内核调试手段。

    一个Linux内核模块主要由如下几个部分组成。
    (1)模块加载函数
    当通过insmod或modprobe命令加载内核模块时,模块的加载函数会自动被内核执行,完成本模块的相关初始化工作。
    Linux内核模块加载函数一般以__init标识声明,模块加载函数以“module_init(函数名)”的形式被指定。它返回整型值,若初始化成功,应返回0。而在初始化失败时,应该返回错误编码。在Linux内核里,错误编码是一个接近于0的负值。
    (2)模块卸载函数
    当通过rmmod命令卸载某模块时,模块的卸载函数会自动被内核执行,完成与模块卸载函数相反的功能。
    Linux内核模块加载函数一般以__exit标识声明,模块卸载函数在模块卸载的时候执行,而不返回任何值,且必须以“module_exit(函数名)”的形式来指定。
    (3)模块许可证声明许可证(LICENSE)
    声明描述内核模块的许可权限,如果不声明LICENSE,模块被加载时,将收到内核被污染(Kernel Tainted)的警告。在Linux内核模块领域,可接受的LICENSE包括“GPL”、“GPL v2”、“GPLand additional rights”、“Dual BSD/GPL”、“Dual MPL/GPL”和“Proprietary”(关于模块是否可以采用非GPL许可权,如“Proprietary”,这个在学术界和法律界都有争议)。大多数情况下,内核模块应遵循GPL兼容许可权。Linux内核模块最常见的是以MODULE_LICENSE(“GPL v2”)语句声明模块采用GPL v2。
    (4)模块参数(可选)
    模块参数是模块被加载的时候可以传递给它的值,它本身对应模块内部的全局变量。
    (5)模块导出符号(可选)
    内核模块可以导出的符号(symbol,对应于函数或变量),若导出,其他模块则可以使用本模块中的变量或函数。
    (6)模块作者等信息声明(可选)

    MODULE_AUTHOR、MODULE_DESCRIPTION、MODULE_VERSION、MODULE_DEVICE_TABLE、MODULE_ALIAS分别声明模块的作者、描述、版本、设备表和别名
    (7)printk
    printk的日志级别定义如下(在include/linux/kernel.h中):

    #define KERN_EMERG 0
      #define KERN_ALERT 1
      #define KERN_CRIT 2
      #define KERN_ERR 3
      #define KERN_WARNING 4
      #define KERN_NOTICE 5
      #define KERN_INFO 6
      #define KERN_DEBUG 7
    

    3.Makefile

    KVERS = $(shell uname -r)
    #shell中输出uname -r会获得内核版本号,这里将版本号存到变量KVERS
    # Kernel modules
    #将后面的东东编译为“内核模块”, obj-y 编译进内核,obj-n 不编译。
    obj-m += hello.o
    
    # 开启EXTRA_CFLAGS=-g-O0,可以得到包含调试信息的hello.ko模块。
    #EXTRA_CFLAGS=-g -O0
    #-C 表示让 make 命令进入指定的内核源代码目录
    build: kernel_modules
    kernel_modules:
    	make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules
    
    clean:
    	make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean
    
    

    :=”表示:它的右边如果为变量,那么该变量在这条语句之前就要定义好,而不能在使用这条语句之后定义的变量
    “=”表示:当它右边如果变量时,这个变量可以在这条语句之前或者之后使用
    “?=”表示:当它左边的变量在这条语句之前没有定义过,则执行本条语句,如果已经定义了,则什么都不做。

    三 编译命令

    make
    #make的提示信息中,CC是编译,LD是链接
    modinfo hello.ko#获得模块的信息
    sudo insmod hello.ko #或者是insmod ./hello.ko
    #加载时输出“Hello World enter”
    lsmod #获得系统中已加载的所有模块以及模块间的依赖关系
    sudo rmmod hello
    #卸载时输出“Hello World exit”。
    lsmod #获得系统中已加载的所有模块以及模块间的依赖关系
    

    总结

    以上代码,在lsmod中确实可以看到能够加载内核模块 ,但是不知道为什么无法打印输出信息。改了printk的输出级别也不管用。有网友知道的可以告诉我。

    展开全文
  • 这里需要注意一下,官方的镜像,分为2019-09-26-raspbian-...笔者先用的是lite版本的,但是一直不成功,驱动编译不了,会一直报错,详细如下说明。使用2019-09-26-raspbian-buster-full版本的镜像,能够顺利的编...

    这里需要注意一下,官方的镜像,分为2019-09-26-raspbian-buster,2019-09-26-raspbian-buster-full,2019-09-26-raspbian-buster-lite这三个版本。笔者先用的是lite版本的,但是一直不成功,驱动编译不了,会一直报错,详细如下说明。使用2019-09-26-raspbian-buster-full版本的镜像,能够顺利的编译过去。个人猜想可能是lite精简版的有些库之类的没有,所以编译不过,full版本的相应的软件功能比较全面。如果有那个老铁知道是什么原因的,欢迎告知。


    使用的官方的lite版本的镜像,需要下一步操作。

    1.用以获取相对应的源代码

    sudo apt-get update

    sudo apt-get install raspberrypi-kernel-headers

     

    pi@raspberrypi:/usr/src/$ls

    linux-headers-4.19.75+  linux-headers-4.19.75-v7+  linux-headers-4.19.75-v7l+  linux-headers-4.19.75-v8+

    2.测试环境是否OK

    makefile文件:

    将内核路径换成:/usr/src/linux-headers-4.19.75 +

    将内核路径换成:/usr/src/linux-headers-4.19.75-v8+

    ./include/uapi/asm-generic/int-ll64.h:12:10: fatal error: asm/bitsperlong.h: No such file or directory

    ./arch/arm/include/uapi/asm/unistd.h:24:10: fatal error: asm-generic/unistd-oabi.h: No such file or directory

     #include <asm-generic/unistd-oabi.h>

    将内核路径换成:/usr/src/linux-headers-4.19.75-v7+

    将内核路径换成:/usr/src/linux-headers-4.19.75-v7l+


     换成full版本的官方镜像,内核模块可以正常编译。

     

    如果出现在insmod的时候:

    可以先通过uname  -a查看版本信息。然后在Makefile文件中将内核的路劲选为相应的内核。

    在Makefile中也要选择相对应的内核版本: 

     note:

    raspberry pi2b and pi3: v7+

    raspberry pi4b: v7l+


     

    参考:

    https://blog.csdn.net/u011031257/article/details/80841957

     

    展开全文
  • Andriod编译内核模块*.ko 分类: Android 2011-08-11 11:36 571人阅读 评论(0) 收藏 举报 在单独编译Android的内核模块之前,必须要成功配置编译过整个Android系统(至少要编译成功boot.img),生成正确的out目录...

    Andriod编译内核模块*.ko

    分类: Android 2011-08-11 11:36 571人阅读 评论(0) 收藏 举报

    在单独编译Android的内核模块之前,必须要成功配置编译过整个Android系统(至少要编译成功boot.img),生成正确的out目录。

     

    1.编写Makefile。按照以下格式编写Makefile。

     
      1 obj-m += aaa.o
      2 #obj-m += abc.o
      3 #abc-objs := aaa.o bbb.o ccc.o
      4
      5 KDIR := ${OUT}/obj/KERNEL_OBJ/
      6
      7
      8 PWD := $(shell pwd)
      9
     10 all:
     11         $(RM) -rf $(PWD)/scripts
     12         ln -s $(KDIR)/scrips $(PWD)/scripts
     13         $(MAKE) -C $(KDIR) M=$(PWD) ARCH=arm CROSS_COMPILE=arm-eabi- $(KDIR).config modules
     14
     15 install:all
     16         $(MAKE) -C $(KDIR) M=$(PWD) modules_install
     17
     18 clean:
     19         $(MAKE) -C $(KDIR) M=$(PWD) clean

    注意:1.若模块中只包含一个c文件,用第1行来关联;若模块中包含一个以上的c文件,用第2、3行来关联,把第1行注释掉。

                2.${OUT}是Andriod源码中的目标生成目录。如:android/out/target/product/xxx/obj

     

    2. make

     把Makefile和模块中用到的c文件和头文件放在同一目录,执行make命令,即可在当前目录下生成内核模块xxx.ko

     

    展开全文
  • 在Linux内核中单独编译KO文件

    千次阅读 2013-08-31 10:25:53
      在Linux内核中单独编译KO文件 在当前模块目录下创建Makefile: obj-m := mxt224.o 然后再该模块目录下打开终端输入:make -C /home/kernel_path/ M=$(pwd) modules /home/kerne
    转自:http://blog.csdn.net/suntao222/article/details/7457886
     

    在Linux内核中单独编译KO文件

    在当前模块目录下创建Makefile: obj-m := mxt224.o

    然后再该模块目录下打开终端输入:make -C /home/kernel_path/ M=$(pwd) modules

    /home/kernel_path/ 是内核所在路径

    或者用该makefile:

    [plain] view plaincopy
    1. #set KERNELDIR and CROSS_COMPILE path yourself  
    2. #  
    3. ifneq   ($(KERNELRELEASE),)   
    4.  obj-m   :=   mxt224.o  
    5. else   
    6.  KERNELDIR   :=   /home/stone/stone_share/Project/t11/t11-2.3/kernel  
    7.  #KERNELDIR   :=   /home/bee/bee_share/mini6410/linux-2.6.36-android/linux-2.6.36-android  
    8.  #KERNELDIR   :=   /opt/mini6440/linux/linux-2.6.36  
    9.  PWD   :=   $(shell pwd)  
    10.  #CROSS_ARCH := ARCH=arm CROSS_COMPILE=/usr/local/arm/4.5.1/bin/arm-linux- #6410-linux-2.6.36  
    11.  CROSS_ARCH := ARCH=arm CROSS_COMPILE=/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-  
    12. default:   
    13.  $(MAKE) $(CROSS_ARCH) -C  $(KERNELDIR)   M=$(PWD)   modules   
    14.   
    15. install:   
    16.  $(MAKE)  $(CROSS_ARCH) -C  $(KERNELDIR)   M=$(PWD)   modules_install   
    17. clean:   
    18.  rm   -rf   *.o   *~   core   .depend   .*.cmd   *.ko   *.mod.c   .tmp_versions *.symvers *.d *.markers *.order  
    19.   
    20. .PHONY:   modules   modules_install   clean  main  
    21. endif  
    展开全文
  • linux内核模块编译 两种编译

    万次阅读 2018-04-09 18:51:27
    linux内核模块编译方法有两种: 1.放入linux内核源码中编译。 2.独立编译模块。 (1)放入linux内核源码中编译 这里先了解Kconfig和Makefile的作用 Kconfig:对应内核模块的配置菜单。 Makefile:对应内核...
  • 经过1个多星期的努力,终于成功在android模拟器运行了一个netfilter的例子whoVisit.ko 首先准备条件: 安装git (版本管理软件) android开发环境 (eclipse , jdk , sdk ) 总之,在这个过程中,他提示你少了什么...
  • 内核模块编译

    千次阅读 2015-06-19 16:39:32
    一.Linux内核介绍 1.Linux 内核很庞大,相应的包含的组件也非常多。...即内核模块机制。3.关于内核模块。有以下特征: (1)不被编译进内核文件 (2)可以动态加载和卸载4.关于内核模块的操作 (1)加载in
  • Linux内核模块编译

    千次阅读 2018-07-25 19:12:52
    如果没有内核模块,需要向内核添加功能就需要自发代码、重新编译内核、安装新内核等步骤。 内核空间中不止一个程序试图访问驱动程序模块,导致一个内核块在没有被调用完毕之前又被其他程序调用,这称之炒代码的重入...
  • linux内核模块编译

    千次阅读 2017-09-01 23:39:12
    最近在学习linux内核模块,在初次编译时遇到了不少坑,下面是完整的内核模块编译流程。 写了一个简单的hello_world.c文件作为内核模块学习的第一步,代码如下: #include #include static int __init hello...
  • 模块编译KO文件Makefile 2.6内核通用

    千次阅读 2011-11-22 19:17:51
    #######hello 单文件编译############## obj-m := hello.o KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: $(MAKE) -C $(KDIR) M=$(PWD) modules clean: rm -rf
  • linux 内核编译驱动模块ko的配置以及加载模块、卸载模块实例测试一、要让linux系统支持动态加载驱动模块必须先对linux 内核进行相关的配置,不然编译不过,加载模块也会加载失败甚至导致设备重启。1、勾选内核Enable...
  • 一种方法是修改对应模块的Makefile,编译ko文件,需要指定 make -C 内核源码路径。 KSRC := /home/xxx/imx6_android4/filesystem/kernel_imx make -C $(KSRC) EXTRA_CFLAGS=-fno-pic M=$(PWD) modules 另一种方法...
  • 但在编译驱动模块前,需要将ARM的内核源码在Ubuntu上先编译一遍,这样才能在Ubuntu顺利make并生成.ko文件。   编译环境说明: 主机操作系统:Ubuntu16.04 编译的linux(ARM)内核:linux-2.6.38 嵌入式系统:tiny...
  • 出现的问题:编译的时候提示缺少头文件 mmzone.h ....bounds.h...等   include/linux/mmzone.h:18:26: error: linux/bounds.h: No such file or directory include/linux/mmzone.h:197:5: warning: ...
  • # ko 文件名 不能与 目标文件名 相同 MODULE_NAME = lkm_test obj-m := $(MODULE_NAME).o #目标文件名 # file1.o file2.o dir1/file3.o $(MODULE_NAME)-objs := test.o else CODEDIR ?= /ho...
  • Android内核模块编译执行

    千次阅读 2017-02-24 23:03:04
    本文以一个“hello”驱动为例,简单介绍内核驱动编写、编译的基本过程,包括内核模块的内建编译和动态加载方式的编译。 0X02 编写 在./goldsifh/drivers文件夹下新建hello目录,在hello目录中新建hello.c文
  • Linux学习记录--内核|内核模块编译

    千次阅读 2014-04-09 21:14:05
    内核|内核模块编译 (对于内核的知识觉得了解不够,等学习完LFS再来详细整理下这方面的知识)   内核:系统上面的一个文件,这个文件包含了驱动主机各项硬件的检测程序和驱动模块。   计算机真正工作的是硬件,...
  • 大纲: 1.交叉编译环境搭建 2.内核模块的编写 3.将开发板连接上PC串口测试,加载模块 4.内核模块参数 5.总结
  • 本篇文章中只讨论linux内核模块编译的makefile,linux内核makefile总览可以参考另一篇博客:linux内核makefile概览 本篇博客参考官方文档。 linux内核使用的是kbuild编译系统,在编译可加载模块时,其makefile的风格...
  • linux内核模块编译学习笔记

    千次阅读 2013-12-13 23:57:36
    # linux内核模块编译学习笔记 # v0.1 2013.11.15 *** 详细的模块编译过程  v0.2 2013.12.12 *** 添加了在源码树中编译模块,Kconfig配置的内容 # 简介:介绍linux内核模块的编译步骤   一、linux模块编译, 采用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,105
精华内容 7,242
关键字:

内核模块编译没有ko文件