前两天把内核关于内核启动参数的一些知识彻底地分析了一遍《Linux内核源码分析--内核启动命令行的传递过程(Linux-3.0 ARMv7)》,发现了一些以前没有注意的细节问题,这里总结如下:

一、2.6.32以后的内核不再对cmdline中的未知参数输出警告信息

以前在移植内核的时候,如果cmdline中有未知的参数,内核一般会打印如下警告:

Unknown boot option `**********': ignoring    但是这次我在uboot的bootargs中添加了内核未知的参数,比如“hello_linux.tekkaman=ninja”,但是在内核启动信息和dmesg中一点错误信息都没有,我感觉很奇怪,然后我又在同事的板子上试了下,一样没有任何错误信息。我查了下代码,按照逻辑,是不会有错误信息输出。哪以前怎么会有错误信息?

后来我通过Git查找了内核针对这方面的修改,发现了如下提交:

commit f066a4f6df68f03b565dfe867dde54dfeb26576e

Author: Rusty Russell

Date: Tue Dec 1 14:56:44 2009 +1030

param: don't complain about unused module parameters.

参数:不抱怨未使用的模块参数。

Jon confirms that recent modprobe will look in /proc/cmdline, so these

cmdline options can still be used.

乔恩证实:新的modprobe会读取/proc/cmdline,所以这些

命令行选项仍然可能被使用。

See

Reported-by: Adam Williamson

Cc: stable@kernel.org

Signed-off-by: Rusty Russell

Signed-off-by: Linus Torvalds

也就是说由于新版本的module-init-tool中的modprobe可以在挂外部.ko模块的时候读取/proc/cmdline(也就是内核启动参数cmdline的备份)中的参数,所有在内核启动的时候还暂时未知的参数可能在系统运行起来,挂载模块的时候被使用。所以在启动的时候提出警告实属不必要。所有这个警信代码被删除了。

这个提交的补丁如下:

$ git diff f066a4f6df^..f066a4f6df

diff --git a/init/main.c b/init/main.c

index 5988deb..4051d75 100644

--- a/init/main.c

+++ b/init/main.c

@@ -251,7 +251,7 @@ early_param("loglevel", loglevel);

/*

* Unknown boot options get handed to init, unless they look like

- * failed parameters

+ * unused parameters (modprobe will find them in /proc/cmdline).

*/

static int __init unknown_bootoption(char *param, char *val)

{

@@ -272,14 +272,9 @@ static int __init unknown_bootoption(char *param, char *val)

if (obsolete_checksetup(param))

return 0;

- /*

- * Preemptive maintenance for "why didn't my misspelled command

- * line work?"

- */

- if (strchr(param, '.') && (!val || strchr(param, '.') < val)) {

- printk(KERN_ERR "Unknown boot option `%s': ignoring\n", param);

+ /* Unused module parameter. */

+ if (strchr(param, '.') && (!val || strchr(param, '.') < val))

return 0;

- }

if (panic_later)

return 0;

这个提交在2.6.32发布前被并入主线:

$ git tag --contains f066a4f6df

v2.6.32

v2.6.33

v2.6.33-rc1

v2.6.33-rc2

v2.6.33-rc3

v2.6.33-rc4

v2.6.33-rc5

v2.6.33-rc6

v2.6.33-rc7

v2.6.33-rc8

就这个问题在:

点击(此处)折叠或打开

From 2009-09-11 16:28:54

When passing a kernel parameter of the type:

radeon.modeset=0

the kernel will throw a warning message that says "Unknown boot option

'radeon.modeset=0'. Ignoring..." However, the parameter is not ignored, it is

passed to (and parsed by) the radeon module.

We (Fedora QA/BugZappers) find people are often confused or worried by this

message when we ask them to use such a parameter, and worry that it is not

being applied correctly. The kernel should not print this warning/error message

when the parameter is of a format that will cause it to be passed to a kernel

module.

-------Comment  From 2009-09-22 02:50:17-------

Is this because modern modprobe is scraping these options from /proc/cmdline?

If so, yes, we should suppress those messages altogether.

CC'd Jon, he'd know.

-------Comment  From 2009-09-22 04:51:52-------

I don't know how it's implemented, exactly, that may well be how it works. I

just know that you can pass any module parameter as a kernel command line

parameter in that format (modulename.moduleparameter=value) and it gets passed

on somehow.

-------Comment  From 2009-11-26 17:43:30-------

ping? this still regularly causes confusion for users when we're trying to

debug various issues, see

for a recent example: it's a 'cosmetic' bug but with unfortunate effects.

-------Comment  From 2010-03-21 12:03:01-------

Yea, exactly that's what happens. Modprobe pulls out those arguments and

processes them.

I don't know why I missed this bug, but that should be fixed now. I even have

daily reminders setup and should get CC'd on every module issue from now on.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

二、使用modprobe挂载.ko模块可以从cmdline中获取参数

从上面的发现又牵出了一个新的发现,原来单独编译的内核模块参数是可以用modprobe挂载的时候从内核的cmdline中获得的。这个是我以前没有注意到的。于是我做了个实验:写一个简单的模块(仅在init函数中打印模块参数),然后在内核启动参数中增加这个参数的初始化。经几次实验,证实了这个功能。

其实通过模块挂载的原理和模块的二进制结构的了解(详见《深入Linux内核构件》 第七章 模块),可以知道:其实这个功能是modprobe实现的。所以实现这个功能的必要条件是modprobe工具必须支持从/proc/cmdline读取字符串,并通过格式(模块名).(变量名)=(值)过滤出参数。

这个大家特别注意一下参数的格式 :

(模块名).(变量名)=(值)

在嵌入式中,高版本的busybox是支持的,现在最新的肯定支持,但是注意了,要配置busybox的时候不能选择"简化版的挂载工具",要配置为编译全功能的modprobe。

在PC系统下也是支持的,在grub的内核启动参数中添加 hello_linux.tekkaman=ninja ,再用modprobe挂载模块。用dmesg看内核信息就可以看到实验结果。实验用的PC信息如下:

Linux Amethyst 3.2.12-gentoo #1 SMP Mon Apr 16 14:16:04 CST 2012 i686 AMD Athlon(tm) 64 X2 Dual Core Processor 4800+ AuthenticAMD GNU/Linuxmodule-init-tools version 3.16

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

嵌入式实验现象如下:

# busybox modprobe hello_linux

Hello, Linux !

(0) Hello, ninja

# cat /proc/cmdline

console=ttyO2,115200n8 root=/dev/nfsroot nfsroot=10.10.10.2:/media/6a55c5a3-f467-4b31-a56a-73b57c5cd2a2/C6A816x/development/targetfs,nolock rw mem=176M@0x80000000 mem=39M@0x9BD00000 vram=90M notifyk.vpssm3_sva=0xBF900000 ip=10.10.10.10:10.10.10.2:0.0.1:255.255.255.0::eth0:off noinitrd earlyprink hello_linux.tekkaman=ninja实验代码如下: test_module_i686.zip

linux内核earlyprink,内核启动参数机制学习笔记相关推荐

  1. 消息机制学习笔记(四)—— 内核回调机制

    消息机制学习笔记(四)-- 内核回调机制 要点回顾 内核调用 实验1:理解内核调用 第一步:编译并运行以下代码 第二步:修改窗口过程函数,重新运行 KeUserModeCallback 实验2:在OD ...

  2. Windows消息机制学习笔记(一)—— 消息队列

    Windows消息机制学习笔记(一)-- 消息队列 基本概念 实验一:使用代码画出最简单窗口 第一步:编译并运行以下代码 第二步:查看运行结果 第三步:使用其它窗口对其进行覆盖,观察效果 总结 消息队 ...

  3. QT-事件机制学习笔记

    QT-事件机制学习笔记 一.事件 二.事件处理函数 三.事件分发机制 四.事件过滤器 五.定时器事件 六.绘图 七.手动触发绘图事件 八.绘图设备 一.事件  事件(event)是由系统或者Qt应用程 ...

  4. Windows消息机制学习笔记(二)—— 窗口与线程

    Windows消息机制学习笔记(二)-- 窗口与线程 要点回顾 消息从哪里来? 实验一:Spy++捕获消息 实验二:消息捕获 消息到哪里去? 窗口在哪? 实验:分析CreateWindowExW 窗口 ...

  5. Windows消息机制学习笔记(三)—— 消息的接收与分发

    Windows消息机制学习笔记(三)-- 消息的接收与分发 要点回顾 消息循环 消息队列 消息的接收 GetMessage 实验1:理解GetMessage 第一步:编译并运行程序A 第二步:编译并运 ...

  6. 三七的活血化瘀和止血机制学习笔记

    三七的活血化瘀和止血机制学习笔记 文章目录 三七的活血化瘀和止血机制学习笔记 前言: 文献一:<景天三七对阿司匹林大鼠的止血活血功效及作用机制研究> 三七的止血与活血机制 文献二:< ...

  7. 黑马程序员新版Linux零基础快速入门到精通——学习笔记

    01初识Linux 1.1.操作系统概述 1.1.1.硬件和软件 我们所熟知的计算机是由硬件和软件组成的. 硬件: 计算机系统中由电子.机械和光电元件等组成的各种物理装置的总称. ​ (看的见.摸得着 ...

  8. Android的LMK机制学习笔记

    初识Android的LMK机制 一.文章背景 1.1 LMK中kill进程的关键log(原生系统):![LMK中kill进程的关键log](https://img-blog.csdnimg.cn/78 ...

  9. 《Linux设备驱动开发详解》学习笔记一

    Linux设备驱动开发详解学习笔记<一> 书名:<Linux设备驱动开发详解>第二版 主机环境:Linux version 2.6.25-14.fc9.i686@Fedora ...

最新文章

  1. JZOJ 5627. 【NOI2018模拟4.3】paint
  2. Kotlin实战指南十五:协程泄漏
  3. Ubuntu中配置FTP服务
  4. html图像区域映射菜鸟,HTML area 标签 | w3cschool菜鸟教程
  5. 协同过滤推荐算法的用户向量相似度计算
  6. mysql所选路径已经存在_5分钟安装好MySQL数据库(建议收藏)
  7. 二叉树的宽度 java_Java语言描述二叉树的深度和宽度
  8. Excel函数大全-04数据库函数
  9. [ZJOI2007]矩阵游戏(二分图匹配、匈牙利算法)
  10. zjs-my-diary-20200609
  11. bt面板从7.1升级到7.5.2之后网络挂了
  12. JavaSwing_3.2: JScrollPane(滚动面板)
  13. 幕客学习CSS3全面基础知识点
  14. 硬件设计知识体系梳理--目录
  15. Java中带标签的break和continue
  16. [教程] 谈谈网页设计中的字体应用 (3) 实战应用篇·上
  17. 集成墙面是怎么做到即装即住的呢?
  18. 发展迅速!2020年,十几所985/211大学成立【人工智能/网络安全】学院!
  19. pytorch之LayerNorm
  20. try/except...else

热门文章

  1. table control 光标定位控制
  2. 拼多多稳了,字节跳动开发新APP,是谁杀死了淘宝?
  3. android gridview item添加checkbox,手把手教你实现GridView中Checkbox全选
  4. smarty php5.5,php5中Iterator与smarty整合
  5. python 动态导入类_从动态导入模块中类的字符串名动态实例化?
  6. mysql最大并行用户设置_mysql 优化配置
  7. matlab 三维矩阵向量化,Matlab:向量化三维矩阵的工艺
  8. python基础教程:对可变对象和不可变对象的详解
  9. python 将字节字符串转换成十六进制字符串
  10. cJSON使用教程(树外构建 out of tree build 概念)(组包概念)