服务器:实验室Arch Linux电脑
目录:/home/guoguo/Documents/Program/Git/kernel-modules-playground
目前版本信息:6.15.0-rc3-00094-g02ddfb981de8(include/config/kernel.release)
环境:Visual Studio Code + Tmux(Session 1)
先别管你那破环境了,先整个能开机的buildroot和内核再说!
使用toolbox创建fedora 42环境,然后安装上必要的软件,再在上面编译buildroot和内核
首先看到helloworld节的内核模块,遇到一个之前没遇到过的函数 printk ,那我应该看看它是干啥的。
然后发现,这玩意可以在 include/linux/printk.h 找到,有空的时候可以读一下这里面的内容~最后会调用上
int _printk(const char *fmt, ...);
这个那要怎么编译呢?其实只要在当前目录写好内核模块的代码,然后直接调用 Makefile 就可以了,然后内核模块调用当前系统的内核源码~如果你用的是直接克隆的代码,那应该也是同理的。为什么不用上面的buildroot了?可能是突然发现系统自带的内核会更方便吧QAQ
Makefile 里面写好各个操作步骤,比如 -C 指定内核目录,-M指定模块目录
然后一编译就出现了一个错误
看起来现在强制要求内核模块的许可证了呢,那就补上吧,直接加一个
MODULE_LICENSE("WTFPL")
,然后再次make就完事了,会在目录生成若干个文件,可以通过 modinfo hello-1.ko 来看这个内核模块文件的一些细节。可以看到刚刚设置的LICENSE已经有显示了,当然也可以继续写上一些作者之类的信息。然后就可以尝试插入一下了。
那我们再尝试修改一下返回值为非0值,会发生什么呢?
看到了十分眼熟的报错,之前在折腾像mesa之类的东西的时候也遇到过类似的东西,不过目前还不知道怎么这些内容(coredumpctl之类的)