文章目录
前言
注意:建议在虚拟机上另外安装一个 linux 操作系统进行开发与调试,本文旨在技术分享与探讨,并不承担任何风险。
本文主要探讨如何在 linux下编写一个Hello World入门级别的驱动程序以及演示驱动程序的加载、卸载以及调试的方法与步骤,由于笔者现在手头上没有开发板因此先暂时在ubuntu 22.04 server上进行演示。
一、准备工作
1.1 安装内核头文件
sudo apt-get update
sudo apt-get install build-essential linux-headers-$(uname -r)
1.2 编写驱动程序代码
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#define HELLO_WORLD_DEBUG
#undef PDEBUG /* undef it, just in case */
#ifdef HELLO_WORLD_DEBUG
#ifdef __KERNEL__
/* This one if debugging is on, and kernel space */
#define PDEBUG(level, fmt, args...) printk(level fmt, ## args)
#else
/* This one for user space */
#define PDEBUG(fmt, args...) fprintf(stderr, fmt, ## args)
#endif
#else
#define PDEBUG(level, fmt, args...) /* not debugging: nothing */
#endif
static int number = 10;
static int __init hello_init(void) {
//printk(KERN_WARNING "Hello, world!\n");
PDEBUG(KERN_WARNING, "number:%d, Hello, world !\n", number);
number--;
return 0;
}
static void __exit hello_exit(void) {
//printk(KERN_WARNING "Goodbye, world!\n");
PDEBUG(KERN_WARNING, "number:%d, Goodbye, world !\n", number);
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("JeffChong");
MODULE_DESCRIPTION("A simple Hello World driver");
MODULE_VERSION("1.0");
1.3 编写Makefile
obj-m += hello_world.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
m