Linux学习笔记(编译一个hello world模块)

最近看了篇编写Linux驱动的文章,觉得不错,于是自己动手试了试,这里记录一下以便以后查阅

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
                         ./+o+-       root@linux
yyyyy- -yyyyyy+ OS: Ubuntu 18.04 bionic
://+//////-yyyyyyo Kernel: x86_64 Linux 5.0.6-laohu-v1.0
.++ .:/++++++/-.+sss/` Uptime: 1d 5h 41m
.:++o: /++++++++/:--:/- Packages: 2044
o:+o+:++.`..```.-/oo+++++/ Shell: bash
.:+o:+o/. `+sssoo+/ Resolution: 2560x1080
.++/+:+oo+o:` /sssooo. WM: GNOME Shell
/+++//+:`oo+o /::--:. WM Theme: Adwaita
\+/+o+++`o++o ++////. CPU: Intel Core i5-4308U @ 4x 3.3GHz [27.8°C]
.++.o+++oo+:` /dddhhh. GPU: intel
.+.o+oo:. `oddhhhh+ RAM: 1807MiB / 3862MiB
\+.++o+o``-````.:ohdhhhhh+
`:o+++ `ohhhhhhhhyo++os:
.o:`.syhhhhhhh/.oo++o`
/osyyyyyyo++ooo+++/
````` +oo+++o\:
`oo++.

编写hello world模块代码

在内核源码driver目录创一个hello_driver的目录,并分别创建hello_kernel.c、Kconfig、Makefile三个文件

hello_kernel.c代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<linux/kernel.h>
#include<linux/module.h>

static int __init hello_init(void)
{
printk("Hello, kernel instaled!\n");
return 0;
}

static void __exit hello_cleanup(void)
{
printk("Good bye, removed!\n");
}

module_init(hello_init);
module_exit(hello_cleanup);
MODULE_LICENSE("GPL");

这里使用内核根目录下的Makefile进行编译,所以这个例程的Makefile非常简单。

Makefile代码如下:

1
obj-$(CONFIG_HELLO_KERNEL) += hello_kernel.o

Kconfig代码如下:

1
2
3
4
5
6
7
8
menu "hello_driver"
config HELLO_KERNEL
tristate "hello_kernel"
default n
help
if you select, you can use it

endmenu

menu:配置选项的菜单

config:要配置的参数

tristate:表示有三种状态可配置,M以模块编译,×编译成.o

default:默认配置,有y,n,还可以写模块(y if xxmod)

help:提示信息,可以自由添加

Kconfig配置有很多,可以copy其他配置多尝试,然后make menuconfig看效果

修改内核配置文件

  1. 打开内核源码drivers目录的Kconfig,在endmenu上面添加source "drivers/hello_driver/Kconfig"

hello-02

在内核源码根目录执行make menuconfig进入Device Drivers,移动到最下面可以看到添加的选项

hello-03

按回车进入,空格键进行配置

hello-04

  1. 编译前还需要修改内核驱动目录Makefile文件

    因为是使用内核源码进行编译,所以需要将新增的hello_driver目录添加到内核源码drivers的Makefile里

    hello-05

  2. 编译内核代码

    内核跟目录下执行make -j4,生成驱动模块

    hello-06

1
2
3
root@linux:/zdisk/linux-5.0.6/drivers/hello_driver# ls
hello_kernel.c hello_kernel.mod.c hello_kernel.o Makefile
hello_kernel.ko hello_kernel.mod.o Kconfig modules.order

验证结果

为了方便,这里手动加载/卸载驱动文件,insmod hello_kernel.ko/rmmod hello_kernel.ko

输入dmesg,查看日志,有打印hello_driver.c中的字符串。

hello-07

------ 本文结束------