Skip to content

Latest commit

 

History

History
47 lines (36 loc) · 2.38 KB

File metadata and controls

47 lines (36 loc) · 2.38 KB

第 1 周

文档准备

  • 老师告知文档的重要性,结合我们的实际情况(缺乏写文档的经验),决定在文档方面借鉴成功经验。
  • 从《2022年操作系统大赛技术方案》中得知,对于功能设计赛道,“项目的设计实现过程(代码/文档/交流信息等)在竞赛官网上全程公开”;
  • 从 4 月 29 日组委会的视频会议中了解到,在初赛中的投入是很重要的,最好用 git 连续进行有意义的提交,而不是集中在某一时间段;
  • 4 月 29 日与赛题导师进行线上沟通,得知类似的信息,决定进行开发记录,可能用文档记录下具体进行的学习和重要的交流。

项目介绍

  • 询问老师,如果选一个比较复杂的功能,一个月后可以只实现主要功能吗?老师回答可以。
  • 导师介绍,相对于 FreeRTOS 之类,Linux 是复杂的操作系统,实时性无法达到硬实时 OS 的要求。题目希望完成一个探针性质的工具,对开关中断、持有内核锁等的进程进行监测,同时对内核本身尽量少作或不作修改。
  • 导师解释本题的目的是想让我们掌握内核开发的基础,创新点方面可能不够直接。
  • 经交流,确定前期采用 CentOS 8.5 x86_64 作为环境。

Kernel Module 学习

参考资料: 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