hello驱动

发布时间 2023-06-06 20:34:05作者: burlingame

1,源代码如下所示:

 1 /*
 2  * a simple kernel module: hello
 3  *
 4  * Copyright (C) 2014 Barry Song  (baohua@kernel.org)
 5  *
 6  * Licensed under GPLv2 or later.
 7  */
 8 
 9 #include <linux/init.h>
10 #include <linux/module.h>
11 
12 static int __init hello_init(void)
13 {
14     printk(KERN_INFO "Hello World enter\n");
15     return 0;
16 }
17 module_init(hello_init);
18 
19 static void __exit hello_exit(void)
20 {
21     printk(KERN_INFO "Hello World exit\n");
22 }
23 module_exit(hello_exit);
24 
25 MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
26 MODULE_LICENSE("GPL v2");
27 MODULE_DESCRIPTION("A simple Hello World Module");
28 MODULE_ALIAS("a simplest module");

1.1 MODULE_LICENSE----(16条消息) linux 内核模块声明 MODULE_LICENSE_whatday的博客-CSDN博客

编写模块必须先包含下面两句:

//这个头文件包含了许多符号与函数的定义,这些符号与函数多与加载模块有关
#include <linux/module.h>               
 
//这个头文件包含了你的模块初始化与清除的函数
#include <linux/init.h>                      

另外,如果你的模块需要用到参数传递,那么你可能就要包含 moduleparam.h 这个头文件了。

再者,模块里常包含一些描述性声明,如:

 1 MODULE_LICENSE("GPL");          // "GPL" 是指明了 这是GNU General Public License的任意版本
 2                                 // “GPL v2” 是指明 这仅声明为GPL的第二版本
 3                                 // "GPL and addtional"
 4                                 // "Dual BSD/GPL"
 5                                 // "Dual MPL/GPL"
 6                                 // "Proprietary"  私有的
 7                                 // 除非你的模块显式地声明一个开源版本,否则内核会默认你这是一个私有的模块(Proprietary)。
 8  
 9 MODULE_AUTHOR                   // 声明作者
10 MODULE_DESCRIPTION              // 对这个模块作一个简单的描述,这个描述是"human-readable"的
11 MODULE_VERSION                  // 这个模块的版本
12 MODULE_ALIAS                    // 这个模块的别名
13 MODULE_DEVICE_TABLE             // 告诉用户空间这个模块支持什么样的设备

 

1.2 makefile---执行生成hello.ko

KVERS = $(shell uname -r)

# Kernel modules
obj-m += hello.o

# Specify flags for the module compilation.
#EXTRA_CFLAGS=-g -O0

build: kernel_modules

kernel_modules:
    make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules

clean:
    make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean

会在 /lib/modules/4.0.0-040000-generic/build 目录下执行该目录下的makefile,如下图所示:

 

2,装载驱动

2.1  insmod ./hello.ko 

2.2  modprobe ./hello.ko 

modprobe在加载时会将其依赖module也加载;

 

3,查看驱动

3.1  lsmod | grep hello 

3.2  cat /proc/modules | grep hello ,结果如下所示:

hello 16384 0 - Live 0xf86ce000 (OE)

 

3.3 加载modle之后,会在 /sys/module/ 目录下生成相应的module文件夹;这里生成的是 /sys/module/hello ,如下所示:

baohua@baohua-VirtualBox:/sys/module/hello$ tree -a
.
├── coresize
├── holders
├── initsize
├── initstate
├── notes
│   └── .note.gnu.build-id
├── refcnt
├── sections
│   ├── .exit.text
│   ├── .gnu.linkonce.this_module
│   ├── .init.text
│   ├── .note.gnu.build-id
│   ├── .rodata.str1.1
│   ├── .strtab
│   └── .symtab
├── srcversion
├── taint
└── uevent

3 directories, 15 files

 

3.4  modinfo hello.ko 查看模块的信息,如下所示:

root@baohua-VirtualBox:/home/baohua/develop/training/kernel/drivers/hello# modinfo hello.ko 
filename:       /home/baohua/develop/training/kernel/drivers/hello/hello.ko
alias:          a simplest module
description:    A simple Hello World Module
license:        GPL v2
author:         Barry Song <21cnbao@gmail.com>
srcversion:     56C45B019D5D953B115F1D4
depends:        
vermagic:       4.0.0-040000-generic SMP mod_unload modversions 686

 

 

4,卸载驱动

4.1  rmmod hello 

4.2  modprobe -r filename 将依赖文件同时卸载掉