使用Linux编写最简单的hello world驱动程序
1、前言
我们在学习C语言或着其他语言的时候第一个程序都是打印hello world,所以我们今天学习驱动程序的开发也是使用hello world作为我们的第一个程序。
在开始编程之前我们需要我们需要搜先准备好我们的编程环境和一些环境的安装,下面根据步骤我们一起开始编写我们的第一个驱动程序。
2、安装
我们使用下面的命令查看我们是否有内核头文件,若和我的显示效果相同,则说明你的电脑是存在内核头文件的,则进行下一步,若不存在该文件,请大家自行百度查看如何下载内核头文件。
apt-cache search linux-headers-$(uname -r)
使用下面的命令进行安装内核头文件,具体代码及执行效果如下图所示:
sudo apt-get install linux-headers-$(uname -r)
3、编写驱动程序
在写第一个驱动程序前,我们需要明白系统调用应用层是如何调用硬件设备的?
应用层通过 open
函数调用C库(glibc
),通过swi
指令发生异常陷入内核态,根据异常的原因调用处理函数sys_open
,然后调用drv_open
,此时就是我们的驱动程序了。
下面是我们写的第一个程序,大家可以将程序复制到自己的Linux下看看能不能正确编译,如果不能正确编译则说明你的驱动环境有问题,需要重新配置我们的驱动环境。
hello.c
文件
#include <linux/module.h>
#include <linux/init.h>/*把上述的结构体告诉内核,所以要注册*/
int __init hello_init(void)
{printk("hello_init!\n");return 0;
}void __exit hello_exit(void)
{printk("hello_exit!\n");
}/*修饰*/
module_init(hello_init);
module_exit(hello_exit);/*许可证*/
MODULE_LICENSE("GPL");
其中语句printk
是用于打印的函数,这点和我们在学习C语言过程中使用的printf
很像,但是又有所不同。
语句module_init(hello_init)
用于定义驱动的入口函数为函数hello_init
,语句module_exit(hello_exit)
用于定义驱动的出口函数为函数hello_exit
Makefile
文件:
KVERSION = $(shell uname -r)
KERN_DIR = /lib/modules/$(KVERSION)/buildall:make -C $(KERN_DIR) M=`pwd` modules clean:make -C $(KERN_DIR) M=`pwd` modules cleanrm -rf modules.orderobj-m += hello.o
- 语句
KVERSION = $(shell uname -r)
读取当前操作系统名称并传递给变量KVERSION
,用于下面KERN_DIR路径; - 变量
KERN_DIR
为Linux内核的源码树目录; - 语句
obj-m += hello.o
指定当前目录要生成的目标模块,然后modules目标指向obj-m变量中设定的模块;
4、编译驱动程序
我们对驱动程序的编译使用make
指令及进行,如下图所示:
5、装载驱动程序
我们装载驱动程序需要使用sudo insmod + 文件名.ko
指令进行
.ko文件是我们make
出来的文件,如下图所示:
指令运行过程截图:
我们在装载完驱动程序后是不会直接进行打印的,我们可以通过lsmod
来查看我们的装载是否成功,执行结果如下图所示:
我们使用sudo rmmod hello+驱动名
可以对已装载的驱动进行卸载,具体如下图所示:
6、打印文字
我们使用sudo dmesg
对打印信息进行显示,具体运行结果如下:
Dmesg
用于显示内核环形缓冲区的内容,内核在其中存储各种消息。在运行 dmesg
时,它会显示大量信息。dmesg
的输出通常通过 less
或 grep
查看,这使得查找要检查的信息更加容易。
结语
上面就是我们运行第一个驱动程序的全部过程,如果你在编写过程中遇到什么问题,欢迎在评论区留言,大家一起交流。
使用Linux编写最简单的hello world驱动程序相关推荐
- linux编写一个简单的端口扫描程序,小弟我在linux下写了个简单的多线程端口扫描程序,运行时出现有关问题,请问一下(2)...
当前位置:我的异常网» Linux/Unix » 小弟我在linux下写了个简单的多线程端口扫描程序, 小弟我在linux下写了个简单的多线程端口扫描程序,运行时出现有关问题,请问一下(2) www. ...
- 用C语言编写一个Linux下的简单shell程序
这是一个简单的C程序,展示了如何进行系统调用执行logout cd ls pwd pid rm mkdir mv cp等命令,这是一个简单的命令解释程序shell,其源代码如下: #include & ...
- 嵌入式linux系统下简单守护进程(daemon)的编写
最近公司项目需要,需要在我们的嵌入式linux设备中创建一个守护进程,用于保护系统中的主进程,防止某些不可预期的意外导致主进程异常结束后,系统完全宕机没有任何反应,破坏用户体验感.但是,查阅诸多资料之 ...
- Linux环境使用命名空间编写一个简单的容器应用程序:namespace,container,cgroups
目录 使用命名空间编写一个简单的容器应用程序 创建一个子进程– fork vs clone 具有clone(2)的命名空间 简单示例 - CLONE_NEWPID 隔离网络接口 - CLONE_NEW ...
- linux实验三:基于mykernel 2.0编写一个简单的操作系统内核
实验内容 按照https://github.com/mengning/mykernel的说明配置mykernel 2.0,熟悉Linux内核的编译:基于mykernel 2.0编写一个操作系统内核,参 ...
- linux系统写一个脚本,编写一个简单的linuxshell脚本
shell脚本和windows平台上的bat批处理是一样的,简化用户处理重复动作的操作,shell脚本由shell命令组成.下面是学习啦小编收集整理的编写一个简单的linuxshell脚本,希望对大家 ...
- NanoPi NEO Air使用八:编写个简单的驱动和应用程序
NanoPi NEO Air使用一:介绍 NanoPi NEO Air使用二:固件烧录 NanoPi NEO Air使用三:OverlayFS.CPU温度和频率.wifi.蓝牙.npi-config ...
- linux平台 一个简单的helloworld动态库的制作与使用
编写一个简单的动态库并调用. 动态库代码: HelloWorld.c /*** 简单动态库文件使用*/ #include "HelloWorld.h"void hello(void ...
- 如何用FFmpeg编写一个简单播放器详细步骤介绍
如何用FFmpeg编写一个简单播放器详细步骤介绍(转载) FFMPEG是一个很好的库,可以用来创建视频应用或者生成特定的工具.FFMPEG几乎为你把所有的繁重工作都做了,比如解码.编码.复用和解复用. ...
最新文章
- 错误:Subquery returns more than 1 row 表示子查询返回了多行数据
- java 界面线性布局_怎么用java代码写一个线性布局;布局里面有两个按钮是水平的...
- 关于Android 传感器坐标与读数的进一步讨论
- Python数据类型-元组类型
- oracle如何规则显示,Oracle语句优化规则汇总
- docker 修改阿里镜像源_使用阿里云容器镜像服务托管私有Docker镜像
- saiku连mysql 使用_saiku应用的调试
- 刷新tabpanel中的子项目内容
- 你觉得sql有多难?
- js中立即执行函数会预编译吗_浅析Vue的生命周期以及JS异步
- java将Word文件转换为html文件
- Java集合Collection之实现原理解读(LinkedList)
- C语言大作业学生选课系统,C语言学生选课管理系统
- 解决Xcode 9.x 没有代码提示
- 黄杏元《地理信息系统概论》考研复习考点精讲(六)
- 独行侠作风之CRM实施阻力
- 如何使用MDK建立STM32H7双核编译工程
- 【记录】那些很实用的Nginx规则
- 国庆、中秋双节同庆 青岛浮山湾灯光秀启动节日模式
- [更新ing]sklearn(十六):Nearest Neighbors *