《Linux设备驱动程序》——Hello World模块(手把手)

秒速五厘米 2022-11-21 11:52 247阅读 0赞

编译这个模块,其实不一定是需要Linux2.6.10,根据当前的虚拟机版本就行,因为你挂载也是挂载到这个虚拟机上而不是2.6.10上

我当前Ubuntu的内核的版本是

在这里插入图片描述
把下列源码复制粘贴

Hello.c

  1. #include <linux/init.h>
  2. #include <linux/module.h>
  3. #include <linux/kernel.h>
  4. //指定license版本
  5. MODULE_LICENSE("GPL");
  6. //设置初始化入口函数
  7. static int __init hello_world_init(void)
  8. {
  9. printk(KERN_DEBUG "Yang Jie!!!!!!!!\n");
  10. return 0;
  11. }
  12. //设置出口函数
  13. static void __exit hello_world_exit(void)
  14. {
  15. printk(KERN_DEBUG "Liu Yu Ting!!!!!!!\n");
  16. }
  17. //将上述定义的init()和exit()函数定义为模块入口/出口函数
  18. module_init(hello_world_init);
  19. module_exit(hello_world_exit);

设置为static,是因为不想让这个函数在此文件之外生效,作用范围局限于本文件。

前面的两道下划线,是告诉内核,仅在初始化和退出的时候调用此函数,其余时间不调用此函数。

退出函数没有返回值,所以定义为void。

module_init(hello_world_init)和module_exit(hello_world_exit)是必须写的,此为调用函数进入内核,不调用即不生效。

Makefile

  1. ifneq ($(KERNELRELEASE),)
  2. obj-m := hello.o
  3. else
  4. KDIR:=/lib/modules/$(shell uname -r)/build
  5. PWD:=$(shell pwd)
  6. all:
  7. $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
  8. endif
  9. clean:
  10. rm -f *.o *.ko *.mod.c .hello*

Makefile里面代码具体代表什么意思,你们请参考这个pdf,网上资源很多。

在这里插入图片描述
然后把Hello.c和Makefile一起放到一个文件夹中,将其放到虚拟机文件夹下,比如 /usr/src/hello 文件夹下,在命令行执行make

在这里插入图片描述

此时已经编译出 hello.ko

在root权限下,加载模块
在这里插入图片描述
因为我是用Xshell连接的虚拟机,所以这里没有即时显示,输入dmesg命令可以看到内核打印log。

在这里插入图片描述

并且lsmod可以看到模块挂载成功 hello
在这里插入图片描述
卸载模块

在这里插入图片描述
输入dmesg

在这里插入图片描述
有打印,说明卸载成功。

这就是一个动态往内核加载驱动程序的过程。这里只是一个简单的打印,其余的各种驱动也可以这样动态加载。

发表评论

表情:
评论列表 (有 0 条评论,247人围观)

还没有评论,来说两句吧...

相关阅读

    相关 HELLO WORLD C程序

    "Hello World" 程序是 C 编程语言中最基本的程序之一。它会在屏幕上输出 "Hello World" 字符串。 这是一个简单的 "Hello World" 程序的

    相关 hello world驱动显示

    前几篇博客中,我们实现了内核的移植,根文件系统的制作。 到此,操作系统就可以跑起来了。我们可以来尝试第一个简单的hello world。 初步了解 内核了解,我们将