首页 > 系统相关 >Linux驱动开发-02-编译驱动程序并安装模块

Linux驱动开发-02-编译驱动程序并安装模块

时间:2022-11-08 11:00:58浏览次数:43  
标签:02 驱动程序 MODULE 编译 源码 内核 模块 Linux hello


1. 说明

编译驱动程序既可以在内核源码中进行,这样可以通过make menuconfig来配置,也可以通过使用源码环境而不在源码中编译。生成ko文件,自己进行安装模块。

在内核源码中编译后生成的内核镜像文件包含该模块,启动内核时,模块自动加载。这种方式又称为静态加载。响应的,不把模块编译进内核,而使用命令加载的方式称为动态加载

2. 不在内核源码中编译

源码

这种方式比较简单,主要在于Makefile文件的编写。直接上源码。
hello.c

#include <linux/init.h>
#include <linux/module.h>

MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void){
printk("Hello World enter\n");
return 0;
}
static void hello_exit(void){
printk("Hello World exit\n");
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_AUTHOR("AIZIZAI");
MODULE_DESCRIPTION("A simple Hello World Module~");
MODULE_ALIAS("a simpliest module");

Makefile

CONFIG_MODULE_SIG=n

ifeq ($(KERNELRELEASE),)
ARCH=x86_64
PWD:= $(shell pwd)
CROSS_COMPILE=x86_64-linux-gnu-
CC=$(CROSS_COMPILE)gcc
KERNELDIR=/usr/src/linux-source-4.4.0

hello.ko: hello.c
$(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KERNELDIR) M=$(PWD) modules

else

obj-m += hello.o

endif

hello: hello.c
arm-linux-gnueabi-gcc $< -o $@ -g

clean:
rm -rf *.o *.ko *.mod.c .*.cmd *.markers *.order *.symvers .tmp_versions hello

其中 CONFIG_MODULE_SIG=n是因为自3.7内核以后有了内核签名机制,不加上会提示模块没有签名。

编译后如下图:

Linux驱动开发-02-编译驱动程序并安装模块_linux

安装和卸载模块

sudo insmod hello.ko
sudo rmmod hello.ko

可以使用dmesg来查看模块的打印信息,如图:

Linux驱动开发-02-编译驱动程序并安装模块_#include_02

3. 在内核源码中编译

内核中使用Kconfig来生成make menuconfig的菜单。使用Makefile来进行编译,所以如果要在内核源码中编译自己的驱动模块,就要修改这两个文件,同时又要在make menuconfig菜单中配置选中。

先在内核源码/driver/目录下建立hello文件夹

3.1 新建Kconfig文件

内容如下

Linux驱动开发-02-编译驱动程序并安装模块_自动加载_03


hello module 就是make menuconfig的菜单名

3.2 修改上层(driver目录下的)Kconfig

添加内容如下:

source "drivers/hello/Kconfig"

3.3 修改Makefile 如下

obj-$(CONFIG_HELLO)     += hello/

3.4 在make menuconfig中选中模块

路径:Driver Device - hello module。如图

Linux驱动开发-02-编译驱动程序并安装模块_linux_04


Linux驱动开发-02-编译驱动程序并安装模块_#include_05

3.5 编译

aizizai@ubuntu:/usr/src/linux-source-4.4.0$ sudo make -j12

编译后结果

aizizai@ubuntu:/usr/src/linux-source-4.4.0/drivers/hello$ ls
built-in.o hello.c hello.ko hello.mod.c hello.mod.o hello.o Kconfig Makefile modules.builtin modules.order

使用modinfo查看模块信息

Linux驱动开发-02-编译驱动程序并安装模块_linux_06

4. 更多

自动安装模块

sudo cp hello.ko /lib/modules/$(uname -r)/kernel/
sudo depmod
sudo modprobe hello

depmod 命令用于生成 modules.dep 和 map 文件,该文件用于在启动时 modules 自动加载。该命令生成的文件是 modules 之间依赖的一个列表。

modprobe可载入指定的个别模块,或是载入一组相依的模块。modprobe会根据depmod所产生的相依关系,决定要载入哪些模块。若在载入过程中发生错误,在modprobe会卸载整组的模块


标签:02,驱动程序,MODULE,编译,源码,内核,模块,Linux,hello
From: https://blog.51cto.com/u_13316945/5832332

相关文章

  • 2022NewStarCTF新生赛一些比较有意思的题目wp
    Misc_蚁剑流量分析Pcap的文件可以直接使用工具 编辑器打开目录,一个一个看,可以找到eval危险函数 看到n3wst4r,直接使用linux正则匹配,找出相关内容Url解码,了解一下蚁......
  • Sadegh Aliakbarian-2021-ContextuallyPlausibleDiverse3DHumanMotionPrediction-ICCV
    #ContextuallyPlausibleandDiverse3DHumanMotionPrediction#paper1.paper-info1.1MetadataAuthor::[[SadeghAliakbarian]],[[FatemehSaleh]],[[Lars......
  • 日常Linux命令--vi/vim复制一行,粘贴
    在光标的位置按“yy”,复制当前行;然后再光标的行按“p”,粘贴到下一行,原来的往下顺移。举例:复制前   按"yy",在"p"   另外:删除当前行-------dd复制多行--......
  • .NET周报【11月第1期 2022-11-07】
    国内文章开源·安全·赋能-.NETConfChina2022https://mp.weixin.qq.com/s/_tYpfPeQgyEGsnR4vVLzHg.NETConfChina2022是面向开发人员的社区峰会,延续.NETConf2......
  • AHOI2022山河重整 题解
    首先容易得到\(O(n^2)\)的解法,容易观察得出任意时刻范围都应是\([1,\sum]\)否则直接寄了。考察\(i\)使得\([1,i]\)都能凑出但\(i+1\)不行。则有\(\sum\limits_......
  • 2022NOIPA层联测22
    A.极源流体上和下,左和右是等效的,只考虑下和右。操作顺序不影响结果,按任意顺序操作x次右,y次下后,一个黑格一定会变成一个长为x,宽为y的矩形。可以用两个队列记录位置,这样可......
  • 谜题:打造极小ELF文件输出文件(在Linux环境中精简ELF64文件)
    接前文《谜题:打造极小ELF文件输出文件(使用汇编语言通过系统调用来实现)》在完成了一个232字节的程序后,发现距离186字节的目标还是有一些距离。接下来就要深入研究ELF文件的......
  • Linux虚拟机配置
    1、安装linux虚拟机下载&安装VirtualBoxhttps://www.virtualbox.org/要开启CPU虚拟化可以去任务管理器查看是否开启  2.下载&安装Vagranthttps://app.va......
  • Linux命令分析性能
    一、查看cputop命令   二、查看内存free-m三、磁盘ioiostat-x110如果没有yuminstall-ysysstatdf-h 查看系统磁盘空间四、网络 netstat-......
  • Linux三剑客,日志分析
    一、awk的使用1、awk简介AWK是一种处理文本文件的语言,是一个强大的文本分析工具。之所以叫AWK是因为其取了三位创始人AlfredAho,PeterWeinberger,和BrianKe......