我最近阅读了“ LINUX设备驱动程序”,其中提到需要准备内核源代码树。我已经在计算机上的/ usr / src中检查了几个版本的linux。这些实际上是已编译的内核源代码,即内核源树。
一、下载内核
为了使自己熟悉内核代码的安装和编译过程,我重新下载了linux-5.4.0 .tar.xz;。 / pub / linux / kernel / v 5.x / linux- 5.4.tar.xz此版本可以安装和编译。
二、配置linux内核
有许多种配置内核的方法,主要如下:
1.#make menuconfig //基于ncurse库的图形工具界面
2.#make config //基于文本的命令行工具,不推荐
3.#make xconfig //基于X11图形工具界面
4.#make gconfig //基于gtk +的图形工具界面
在此处选择简单输入,在终端中输入以下命令:
make menuconfig讨论配置:
对于每个配置选项,用户都有三个选择,其各自的含义如下:
或[*]将函数编译到内核中
[]-请勿将此函数编译到内核中
[M]-将此函数编译为可以在需要时动态插入内核的代码
此步骤是配置过程。配置您所需要的。配置完成后,保存并退出。
三、编译并安装
cd /usr/src/linux-5.4;
make -j4; //编译内核
make modules_install //安装模块
make headers_install //安装内核头文件
make –j4 install //安装内核四、问题
1、编译时发生错误,TAB键和空格键混入了Makefile中。图片中的灰色区域应该是TAB键的结果,而不是空格。这主要是由于直接复制的问题。自己手动编写代码,请记住使用TAB键。

2、执行insmod时,它提示insmod:错误:无法插入模块hello.ko:文件存在。当出现此提示时,只需执行一次rmmod hello。
五、hello world模块
根据该书开始测试hello world模块。控制台无法打印信息。根据该信息,Linux内核在使用printk时会根据日志级别(即字符设备)将消息打印到当前控制台。从终端输出这些消息的前提是日志输出级别小于console_loglevel。
Internet上提供的解决方案(原始链接:/ wx601056818 / article / details / 80113983)
1)命令
cat /proc/sys/kernel/printk
4 4 1 7第一个“ 4”代表内核打印功能printk的打印级别。只能在控制台上打印更高级别的信息(级别越小级别越高),即0-3级别信息:

#define KERN_EMERG "<0>" /* system is unusable */
#define KERN_ALERT "<1>" /* action must be taken immediately */
#define KERN_CRIT "<2>" /* critical conditions */
#define KERN_ERR "<3>" /* error conditions */
#define KERN_WARNING "<4>" /* warning conditions */
#define KERN_NOTICE "<5>" /* normal but significant condition */
#define KERN_INFO "<6>" /* informational */
#define KERN_DEBUG "<7>" /* debug-level messages */程序中的“ KERN_EMERG”设置为0级,高于4级。换句话说,这不是级别问题。
2)输入以下命令
echo 8 > /proc/sys/kernel/printk //设置当前的日志级别为7 ,最低级别根据此说明,它已更改为8 4 1 7.结果仍然无法打印。
3)打印量不足的信息将被写入日志,并可以通过dmesg命令查看。
dmesg因此,我使用dmesg来检查日志,并发现以下提示:

图2 dmesg获得的日志输出
根据提示查找问题,发现Linux内核从3.7内核版本开始具有内核签名机制。找到我的/usr/src/linux-5.4/.config关于签名部分的设置,如下所示:
CONFIG_MODULE_SIG=y // y 表示开启了签名机制。
# CONFIG_MODULE_SIG_FORCE is not set // 模块必须有正确的签名才能正常使用,此处没设置
CONFIG_MODULE_SIG_ALL=y // y表示 内核在编译的时候,会主动去给模块签名换句话说,我的模块未签名,因为签名机制已打开。
解决方案:
1)添加证书
/usr/src/linux-5.4/scripts/sign-file sha512 /usr/src/linux-5.4/certs/signing_key.pem /usr/src/linux-5.4/certs/signing_key.x509 hello.ko;根据信息并按照上述说明添加证书,结果仍无法打印出来。
2)修改.config的配置。由于usr文件夹受写保护,因此可以在make menuconfig界面中轻松进行修改。具体来说,请在“启用可加载模块支持”中进行修改。

图1内核配置选项
这三个项目是CONFIG_MODULE_SIG,CONFIG_MODULE_SIG_FORCE
有关CONFIG_MODULE_SIG_ALL = y和接口配置参数之间的对应关系,请参见valian1982 :(打开)Linux内核配置中签名的配置选项。
我将与CONFIG_MODULE_SIG对应的模块签名验证设置为n。
重新编译并安装内核。
重新编译hello world模块并执行以下命令:
insmod ./hello.ko结果仍然无法打印,但是执行dmesg的问候提示消失了。
摘要:到目前为止,我的hello模块无法将内容打印到控制台。稍后找到特定问题后,我将添加它。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-345407-1.html
巴菲特呢