【驱动开发初级】内核模块静态和动态添加功能的步骤

之前的文章,已经完成了开发板的系统移植:

一、安装交叉编译工具,实现arm交叉编译,参考【系统移植】交叉编译工具链常用工具

二、制作SD卡启动,参考【系统移植】制作SD卡启动------将uboot烧写到SD卡

三、搭建NFS环境,挂载根目录,参考【系统移植】NFS服务器环境搭建------挂载根文件系统

四、搭建TFTP环境,用于传输uImage和dtb文件,参考【系统移植】TFTP服务器环境搭建

五、Uboot的使用,参考【系统移植】Uboot的使用:主要环境变量及命令、tftp下载文件的步骤以及主要存储器访问命令

六、在开发板上加载内核和根目录,参考【系统移植】在开发板上加载内核和根文件系统的三种方法

通过以上一系列的步骤,我们完成了操作系统的移植,现在要考虑如何将新功能添加到开发板,让其在开发板的操作系统中运行。

向内核添加新功能的方法有两种,分别是静态添加法和动态添加法。

一、内核模块静态添加功能

什么是静态添加法

所谓静态添加新功能,就是将新功能源码,与内核其他代码一起编译到uImage,加载到开发板运行。

内核模块静态添加功能的步骤

1、添加的新功能代码添加到内核源码同一目录结构下

具体来说,在内核顶层目录linux-3.14/drivers/char目录下:

通过vi或者vim命令创建一个新源文件myhello.c:

cpp 复制代码
$ vi myhello.c

将下面代码写入该文件,退出,并保存:

cpp 复制代码
#include <linux/module.h>
#include <linux/kernel.h>

int __init myhello_init(void)
{
	printk("#####################################################\n");
	printk("#####################################################\n");
	printk("#####################################################\n");
	printk("#####################################################\n");
    printk("myhello is running\n");
	printk("#####################################################\n");
	printk("#####################################################\n");
	printk("#####################################################\n");
	printk("#####################################################\n");
	return 0;
}

void __exit myhello_exit(void)
{
	printk("myhello will exit\n");
}
MODULE_LICENSE("GPL");
module_init(myhello_init);
module_exit(myhello_exit);

2、给新功能配置Kconfig文件

在myhello.c同级目录下,打开Kconfig配置文件

cpp 复制代码
$ vi Kconfig

添加下面代码

cpp 复制代码
config MY_HELLO
	tristate "This is a hello test"
	help
		This is a test for kernel new function

3、给新功能配置Makefile

在myhello.c同级目录下打开Makefile文件

cpp 复制代码
​$ vi Makefile

在第19行添加下面代码:

cpp 复制代码
obj-$(CONFIG_MY_HELLO)     += myhello.o

注意,是myhello.o文件,不是myhello.c文件

回到内核源码顶层目录

运行make menuconfig命令

cpp 复制代码
$ make menuconfig

在界面中一次做出如下选择

将This is a hello test前面的选项改成<*>

依次退出,并选择保存。

5、在内核顶级目录运行make uImage编译

出现如下结果,说明编译完成

6、将编译好的uImage拷贝到/tftproot/目录下

cpp 复制代码
$ cp arch/arm/boot/uImage /tftpboot/

7、给开发板重新上电,确保之前搭建好的NFS和TFTP环境正常,查看运行结果

开发板系统启动

新功能运行正常

二、内核模块动态添加功能

什么是动态添加法

所谓内核模块动态添加功能,是指新功能与内核其他源码不一起编译,而是独立编译成内核的插件(被称为内核模块)文件.ko。

动态添加法分为两种情况,一种是新功能源码和内核源码在同一目录结构下,另一种是不在同一目录结构下。

新功能源码和内核源码在同一目录结构下

前三步与静态添加法一致,这里不再说,直接从第四步开始

5-6、也与静态添加法一致

重新编译uImage编译并拷贝到/tftproot/目录下,与静态添加法编译方法一样,只是这次没有编译新加功能的源码。

7、运行make modules命令

make modules会在新功能源码的同级目录下生成相应的同名.ko文件(生成的ko文件只适用于开发板linux),注意此命令执行前,开发板的内核源码已被编译。

我们可以看到我们添加myhello.c被编译成myhello.o。

相关推荐
程序员JerrySUN17 小时前
Linux UART 驱动开发全解析:从原理到实战
linux·运维·驱动开发
林政硕(Cohen0415)18 小时前
Linux驱动开发进阶(三)- 热插拔机制
linux·驱动开发·热插拔
sukalot18 小时前
Windows 图形显示驱动开发-WDDM 2.4功能-GPU 半虚拟化(十一)
windows·驱动开发
小麦嵌入式21 小时前
Linux驱动开发实战(十一):GPIO子系统深度解析与RGB LED驱动实践
linux·c语言·驱动开发·stm32·嵌入式硬件·物联网·ubuntu
触角010100011 天前
STM32F103低功耗模式深度解析:从理论到应用实践(上) | 零基础入门STM32第九十二步
驱动开发·stm32·单片机·嵌入式硬件·物联网
sukalot1 天前
Windows 图形显示驱动开发-WDDM 2.4功能-GPU 半虚拟化(三)
windows·驱动开发
星星点灯5082 天前
盛铂科技FlexDDS-NG:12通道相位连续DDS信号发生器,400MHz高频输出赋能量子光学与超冷原子研究
驱动开发·科技·测试工具·量子计算·模块测试·射频工程
小麦嵌入式3 天前
Linux驱动开发实战(九):Linux内核pinctrl_map详解与优势分析
linux·c语言·汇编·驱动开发·stm32·嵌入式硬件·硬件工程
触角010100014 天前
MPU6050模块详解:从原理到STM32驱动指南(上) | 零基础入门STM32第八十九步
驱动开发·stm32·单片机·嵌入式硬件·物联网
VermouthSp4 天前
Linux驱动开发 块设备
linux·驱动开发