精华内容
下载资源
问答
  • 2020-12-23 14:01:07

    编译时内核怎么生成的ko文件?

    接我的上一贴,我用的是嵌入式Linux,在内核生成modules时出现问题。

    1首先我在make menuconfig时选择了我想编译进内核的模块,比如CONFIG_USB_SERIAL, CONFIG_USB_STORAGE。

    2编译内核成功

    3make *modules

    4make module module_install

    但是在我的开发板$(target)/lib/modules/(version)/kernel中却只有STORAGE的ko文件。回到内核中查看,~usb/storage中生成了ko但是~usb/serial中只有o没有ko,说明根本没有生成。

    比较了两个文件夹的Kconfig与Makefile,发现木有大的功能上的差别,也没有提到模块的生成问题。

    查看了一下根目录的.config中CONFIG_USB_SERIAL明明定义了的,auto.conf也定义了。现在实在不明白为什么没有生成我配置了的ko文件?在哪里改定义?

    估计现在生成以及安装的模块可能都是某个文件中默认的,不过在哪里改?希望板上大牛指教,或者交流一下!

    先多谢!

    更多相关内容
  • 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的输出级别也不管用。有网友知道的可以告诉我。

    互相交流

    读者你好!如果你对本文内容感兴趣,我十分希望能够和你互相学习,可以扫码和我联系!一起进步

    在这里插入图片描述

    展开全文
  • 编译内核模块,应该是没有报错.但什么文件没有生成.请高手解答下面是显示信息=============================================================================================================make-C/linux-...

    编译内核模块,应该是没有报错.但什么文件都没有生成.请高手解答

    下面是显示信息

    =============================================================================================================

    make -C /linux-2.6.29 M= modules ARCH=arm CROSS_COMPILE=/usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-

    make[1]: 正在进入目录 `/linux-2.6.29'

    CHK     include/linux/version.h

    make[2]: “include/asm-arm/mach-types.h”是最新的。

    CHK     include/linux/utsrelease.h

    SYMLINK include/asm -> include/asm-arm

    CALL    scripts/checksyscalls.sh

    :1097:2: warning: #warning syscall fadvise64 not implemented

    :1265:2: warning: #warning syscall migrate_pages not implemented

    :1321:2: warning: #warning syscall pselect6 not implemented

    :1325:2: warning: #warning syscall ppoll not implemented

    :1365:2: warning: #warning syscall epoll_pwait not implemented

    Building modules, stage 2.

    MODPOST 123 modules

    make[1]:正在离开目录 `/linux-2.6.29'

    =============================================================================================================

    我的Makefile文件如下

    =============================================================================================================

    ifneq ($(KERNELRELEASE),)

    obj-m := memdev.o

    else

    KDIR := /linux-2.6.29

    all:

    make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=/usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-

    clean:

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

    endif

    =============================================================================================================

    执行后什么文件都没有生成.

    急盼高手解答!!~

    |

    make -C /linux-2.6.29 M= modules ARCH=arm CROSS_COMPILE=/usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-

    make[1]: 正在进入目录 `/linux-2.6.29'

    执行的命令不对 应该 M=

    你的Makefile没问题,关键是M=$(PWD)。

    你的shell环境变量PWD没设或者shell不支持PWD变量,你检查一下:echo $(PWD)

    你可以M直接设置成你模块源码所在的路径。

    展开全文
  • Linux 2.6 下内核模块的Makefile  # Makefile 2.6  obj-m += hello.o  KDIR:=/lib/modules/$(shell uname -r)/build  # PWD=$(shell pwd)  all:  make -C $(KDIR) M=$(PWD) modules  clean:  make -...
  • 假设模块的源文件为hello.c,源码如下:#include #include #include #include #include #define HELLO_MAJOR 231#define DEVICE_NAME "HelloModule"static int hello_open(struct inode *inode, struct file *file){...

    假设模块的源文件为hello.c,源码如下:

    #include

    #include

    #include

    #include

    #include

    #define HELLO_MAJOR 231

    #define DEVICE_NAME "HelloModule"

    static int hello_open(struct inode *inode, struct file *file)

    {

    printk(KERN_EMERG "hello open.\n");

    return 0;

    }

    static ssize_t hello_write(struct file *file, const char __user *buf,

    size_t count, loff_t *ppos)

    {

    printk(KERN_EMERG "hello write.\n");

    return 0;

    }

    static struct file_operations hello_flops = {

    .owner = THIS_MODULE,

    .open = hello_open,

    .write = hello_write,

    };

    static int __init hello_init(void)

    {

    int ret;

    ret = register_chrdev(HELLO_MAJOR, DEVICE_NAME, &hello_flops);

    if (ret < 0) {

    printk(KERN_EMERG DEVICE_NAME

    " can't register major number.\n");

    return ret;

    }

    printk(KERN_EMERG DEVICE_NAME " initialized.\n");

    return 0;

    }

    static void __exit hello_exit(void)

    {

    unregister_chrdev(HELLO_MAJOR, DEVICE_NAME);

    printk(KERN_EMERG DEVICE_NAME " removed.\n");

    }

    module_init(hello_init);

    module_exit(hello_exit);

    MODULE_LICENSE("GPL");

    使用该文件编译内核模块。

    正常情况下,Makefile文件内容如下:

    ifneq ($(KERNELRELEASE),)

    obj-m:=hello.o

    $(info "2nd")

    else

    KDIR := /lib/modules/$(shell uname -r)/build

    PWD:=$(shell pwd)

    all:

    $(info "1st")

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

    clean:

    rm -f *.ko *.o *.mod .*.cmd *.symvers *.mod.c *.mod.o *.order .hello*

    endif

    执行make命令,生成hello.ko文件。

    执行sudo insmod hello.ko命令,安装该模块。

    执行lsmod命令,查看安装的模块。就会看到第一行的就是hello模块。

    但是,如果想自定义模块名称为xmodule,而不是默认的hello,如何实现呢?方法如下:

    在Makefile中重命名obj-m并将obj-m的依赖关系设置为原始模块(hello)

    修改后的Makefile文件内容如下:

    ifneq ($(KERNELRELEASE),)

    obj-m:=xmodule.o

    xmodule-objs := hello.o

    $(info "2nd")

    else

    KDIR := /lib/modules/$(shell uname -r)/build

    PWD:=$(shell pwd)

    all:

    $(info "1st")

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

    clean:

    rm -f *.ko *.o *.mod .*.cmd *.symvers *.mod.c *.mod.o *.order .hello*

    endif

    将obj-m设置为xmodule.o,并使xmodule.o依赖于hello.o.

    执行make命令后,生成xmodule.ko, 而不是hello.ko,

    安装命令: sudo insmod xmodule.ko

    查看命令:lsmod,就会看到被安装名为xmodule的模块。

    展开全文
  • 这时候就需要在yocto种编译内核模块,接下来就探索编译ko;以cv2x串口模块lte为例。 代码流程 代码目录结构 ├── cv2x-support_1.0.bb └── files └── cv2x-support-1.0 ├── comgt ├── COPYING ...
  • 这里需要注意一下,官方的镜像,分为2019-09-26-raspbian-...笔者先用的是lite版本的,但是一直不成功,驱动编译不了,会一直报错,详细如下说明。使用2019-09-26-raspbian-buster-full版本的镜像,能够顺利的编...
  • 对于外部模块,不需要修改config等,只需要写好Makefile,方便进行模块的编写和测试。Makefile单文件格式为obi -m += xxx.o多文件obj-m += focaltech_ts.ofocaltech_ts-objs := focaltech.ofocaltech_ts-objs += ...
  • 调试内核模块时,不想每次都要整个工程一起编译,只想编译单独的ko文件,也不影响模块间的依赖关系(会修改mod.depend信息)。 1 确认必要的环境变量 创建env.sh文件,并chmod +x env.sh #!/bin/bash function run...
  • 一、安装内核模块、 二、安装内核、 三、重启系统、 四、查看当前内核版本
  • 在Linux内核中单独编译KO文件

    千次阅读 2018-03-08 08:58:27
    转载地址:... 在当前模块目录下创建Makefile: obj-m := mxt224.o 然后再该模块目录下打开终端输入:make -C /home/kernel_path/ M=$(pwd) modules /home/kernel_path/ 是内核所在路径
  • 2021-11-13内核模块编译

    2021-11-13 09:26:25
    内核模块编译方法 新功能加载 分为静态加载和动态加载两部分。 1.静态加载 将新的驱动代码即.c文件加到内核源码的相应驱动目录下(即同一目录下),并修改同一目录下的Makefile和Kconfig文件,并且在make menuconfig...
  • ubuntu下编译和加载内核模块ko

    千次阅读 2018-04-27 10:30:35
    这时,在hello.c 所在文件夹就会有 hello.ko,这个就是我们需要的内核模块啦 #sudo make clean 清理编译垃圾,hello.ko 也会清理掉。 4. 插入模块,让其工作。注意必须是root权限 #sudo insmod ./hello.ko 我们用...
  • # 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...
  • 1. 查看内核版本 [root@localhost test]# uname -r 3.10.0-862.el7.x86_64 2. 切换到相应的内核源码中 [root@localhost test]# cd /usr/src/kernels/3.10.0-862.el7.x86_64/drivers/ [root@localhost test]# ...
  • 第一次在android平台上单独编译内核模块并且insmod,过程比较难受,毕竟啥事第一次做都不怎么顺畅! 本文基于Android5.1 msm8909 因为笔者使用的平台物理串口只有两个,一个已经作为系统的debug调试串口,那就相当...
  • 一、前言        也学了10天左右的linux驱动开发了,一般学习新知识的时候,我都喜欢首先...正如我前面写的几篇博客,主要内容包括linux内核和linux发行版的概念与区别;linux系...
  • Android 编译内核ko文件

    千次阅读 2020-04-29 09:46:34
    一种方法是修改对应模块的Makefile,编译ko文件,需要指定 make -C 内核源码路径。 KSRC := /home/xxx/imx6_android4/filesystem/kernel_imx make -C $(KSRC) EXTRA_CFLAGS=-fno-pic M=$(PWD) modules 另一种方法...
  • linux内核模块编译makefile

    千次阅读 2020-07-15 11:18:38
    本篇文章中只讨论linux内核模块编译的makefile,linux内核makefile总览可以参考另一篇博客:linux内核makefile概览 本篇博客参考官方文档。 linux内核使用的是kbuild编译系统,在编译可加载模块时,其makefile的风格...
  • linux内核模块编译 两种编译

    万次阅读 2018-04-09 18:51:27
    linux内核模块编译方法有两种: 1.放入linux内核源码中编译。 2.独立编译模块。 (1)放入linux内核源码中编译 这里先了解Kconfig和Makefile的作用 Kconfig:对应内核模块的配置菜单。 Makefile:对应内核...
  • Linux系统中编写驱动程序,使用多个.c和.h源文件编译得到一个.ko模块,简单举例并编译运行。
  • 一、 问题描述 1. 内核目录 Linux内核源代码非常庞大,随着版本的发展不断增加。它使用目录树结构,并且使用Makefile组织配置...顶层目录的Makefile是整个内核配置编译的核心文件,负责组织目录树中子目录的编译管理,
  • 通过网上的资料我自己的实际内核编译,我把对Linux内核编译的过程写在这里,也许对其他的Linux爱好者的编译学习有些帮助,其中很大部分是网上的资料,另外就是我在实际编译过程中的一些实际经验。内核简介内核,是一...
  • 原标题:单独编译某个内核模块对开发内核驱动和文件系统的人来说,经常需要编译某个内核模块。 当然从编译角度,有built-in kernel module和external kernel module之分。 怎么编译一个外部内核模块,google一下...
  • Makefile独立编译ko文件

    千次阅读 2021-11-25 20:32:58
    如果这个ko文件需要多个c文件共同编译生成的话,最好以如下的模板来完成编译较好 #首先指定好编译链工具 CROSS_COMPILE=/opt/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- #指定用...
  • 最近在做LDD书上的一些例子, 为了统一管理代码的编译,使内核模块编译跟应用程序的编译过程一致,决定使用CMake来做工程的编译,编译脚本如下:cmake_minimum_required(VERSION 2.8)project(ldd)set(KERNEL_DIR /usr/...
  • linux 内核编译驱动模块ko的配置以及加载模块、卸载模块实例测试一、要让linux系统支持动态加载驱动模块必须先对linux 内核进行相关的配置,不然编译不过,加载模块也会加载失败甚至导致设备重启。1、勾选内核Enable...
  • 内核设计风格:redhat,suse核心:动态加载 内核模块 在目录/boot/vmlinuz-版本号内核:/lib/modules/"内核版本号命令的目录"/vmlinuz-2.6.32/lib/modules/2.6.32/单内核:linux核心:ko (kernel object)微内核:...
  • 大纲: 1.交叉编译环境搭建 2.内核模块的编写 3.将开发板连接上PC串口测试,加载模块 4.内核模块参数 5.总结
  • linux编译ko文件(不同内核源码版本)

    万次阅读 2017-09-30 18:50:21
    网上下载与我的linux系统相同的版本,编译的时候过不去(每次都是编译到sound文件夹下时提示找不到xxx.c文件),后来经过多次的实验后便把内核换了别的版本作为系统内核启动成功编译ko文件,下面贴上具体过程:只...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,588
精华内容 8,235
关键字:

内核模块编译没有ko文件