- 老师告知文档的重要性,结合我们的实际情况(缺乏写文档的经验),决定在文档方面借鉴成功经验。
- 从《2022年操作系统大赛技术方案》中得知,对于功能设计赛道,“项目的设计实现过程(代码/文档/交流信息等)在竞赛官网上全程公开”;
- 从 4 月 29 日组委会的视频会议中了解到,在初赛中的投入是很重要的,最好用 git 连续进行有意义的提交,而不是集中在某一时间段;
- 4 月 29 日与赛题导师进行线上沟通,得知类似的信息,决定进行开发记录,可能用文档记录下具体进行的学习和重要的交流。
- 询问老师,如果选一个比较复杂的功能,一个月后可以只实现主要功能吗?老师回答可以。
- 导师介绍,相对于 FreeRTOS 之类,Linux 是复杂的操作系统,实时性无法达到硬实时 OS 的要求。题目希望完成一个探针性质的工具,对开关中断、持有内核锁等的进程进行监测,同时对内核本身尽量少作或不作修改。
- 导师解释本题的目的是想让我们掌握内核开发的基础,创新点方面可能不够直接。
- 经交流,确定前期采用 CentOS 8.5 x86_64 作为环境。
参考资料: Linux kernel的调试技术 Linux 内核之 Module 编写(一)
kernel module 不允许使用在用户空间定义的函数库。想要通过打印进行调试,需要使用 printk,其中日志级别宏与格式字符串之间不加逗号;如果级别低于控制台中的设置,可能将无法显示。
简单的 Linux 内核模块源代码构成:
- 加载函数:加载时调用,函数签名为
static int __init function_name(void)
,须传入module_init
中。 - 卸载函数:卸载时调用,函数签名为
static void __exit function_name(void)
,须传入module_exit
中。 - 模块许可证声明:
MODULE_LICENSE
- 模块作者:
MODULE_AUTHOR
内核模块 Makefile:
TARGET=ModuleNameHere
obj-m := $(TARGET).o
KDIR=/lib/modules/$(shell uname -r)/build
PWD=$(shell pwd)
default:
make -C $(KDIR) M=$(PWD) modules
install:
insmod $(TARGET).ko
uninstall:
rmmod $(TARGET).ko
clean:
make -C $(KDIR) M=$(PWD) clean