屏蔽linux 的启动打印信息

/***** 适用于比较新的内核 ***** /

vi kernel/printk.c

#define DEFAULT_CONSOLE_LOGLEVEL 7 /* anything MORE serious than KERN_DEBUG */

改为

#define DEFAULT_CONSOLE_LOGLEVEL 3 /* anything MORE serious than KERN_DEBUG */

 

/***** 适用于比较老的内核 ***** /

如果正常配置了输入输出终端,则内核启动过程中会将很多信息输出到控制台上。这些信息中有些表示严重错误,有些只是一般的提示信息。 
在平台成熟后,继续保留这些信息既不美观,也会影响启动速度(串口的波特率很低)。因此要尽量屏蔽不重要的信息。这需要对内核进行一些改造。

内核打印分析

内核启动过程中的打印都是通过printk()输出的,按照重要程度,内核把这些打印分类为8个级别:

============== include/linux/printk.h 7 14 ===================
#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         */

此外,内核还定义了一些宏来表示要输出到控制台上的级别、printk函数的默认级别等,在一个数组中描述:

=============== kernel/printk.c 60 74 =====================
/* printk's without a loglevel use this.. */
#define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */

/* We show everything that is MORE important than this.. */
#define MINIMUM_CONSOLE_LOGLEVEL 1 /* Minimum loglevel we let people use */
#define DEFAULT_CONSOLE_LOGLEVEL 7 /* anything MORE serious than KERN_DEBUG */

DECLARE_WAIT_QUEUE_HEAD(log_wait);

int console_printk[4] = {
    DEFAULT_CONSOLE_LOGLEVEL,   /* console_loglevel */
    DEFAULT_MESSAGE_LOGLEVEL,   /* default_message_loglevel */
    MINIMUM_CONSOLE_LOGLEVEL,   /* minimum_console_loglevel */
    DEFAULT_CONSOLE_LOGLEVEL,   /* default_console_loglevel */
};

=============== kernel/printk.c 60 74 =====================
/* printk's without a loglevel use this.. */
#define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */

/* We show everything that is MORE important than this.. */
#define MINIMUM_CONSOLE_LOGLEVEL 1 /* Minimum loglevel we let people use */
#define DEFAULT_CONSOLE_LOGLEVEL 7 /* anything MORE serious than KERN_DEBUG */

DECLARE_WAIT_QUEUE_HEAD(log_wait);

int console_printk[4] = {
    DEFAULT_CONSOLE_LOGLEVEL,   /* console_loglevel */
    DEFAULT_MESSAGE_LOGLEVEL,   /* default_message_loglevel */
    MINIMUM_CONSOLE_LOGLEVEL,   /* minimum_console_loglevel */
    DEFAULT_CONSOLE_LOGLEVEL,   /* default_console_loglevel */
};

浏览内核代码可以看到,基本上启动过程中的打印都是以默认级别KERN_WARNING及以下级别输出,因此要控制这些信息,只需要修改上面几个宏即可,尤其是将DEFAULT_CONSOLE_LOGLEVEL修改为4即可屏蔽大部分信息。

重新编译内核后尝试启动,可见大部分输出都被屏蔽了。

恢复打印

启动完成后恢复打印

改造后大部分的打印信息消失,但是启动后一些模块的正常printk也会被屏蔽,这会漏失掉很多重要信息,为此在启动完成后要恢复打印,方法是在启动脚本中执行一句: 
echo 7 4 1 7 > /proc/sys/kernel/printk 
就能恢复默认打印级别。

找回启动过程中的打印

如果启动过程异常,是不是打印就找不回来呢?当然不是,内核的printk除了向控制台输出外,还将一些信息输出到了/proc/kmsg中,可以在启动后通过dmsg命令全部找回。

恢复启动时打印

如果需要临时恢复打印,并不需要重新编译内核。在启动参数中配置一项ignore_loglevel即可:

=============== kernel/printk.c 471 479 ==================
static int __init ignore_loglevel_setup(char *str)
{
    ignore_loglevel = 1;
    printk(KERN_INFO "debug: ignoring loglevel setting.\n");

    return 0;
}

early_param("ignore_loglevel", ignore_loglevel_setup);

=============== kernel/printk.c 471 479 ==================
static int __init ignore_loglevel_setup(char *str)
{
    ignore_loglevel = 1;
    printk(KERN_INFO "debug: ignoring loglevel setting.\n");

    return 0;
}

early_param("ignore_loglevel", ignore_loglevel_setup);

在输出时会判断ignore_loglevel变量,如果为真则无论如何都会将信息输出到控制台上。

--------------------------------------------------------------------------------------------------------------------

vi ./kernel/printk/printk.c
static int __init console_setup(char *str)

 str = "/dev/null"; // ql add

 

追加:

如何内核如何不使用uboot 传递过来的参数bootargs:

vi init/main.c


strcpy( boot_command_line, MY_BOOT_CMD_LINE ); // ql add
strcpy( command_line, MY_BOOT_CMD_LINE ); // ql add

<think>好的,我现在需要帮用户解释“通过串口打印信息输入命令是什么意思”。首先,用户可能对串口通信不太熟悉,所以得先简单介绍什么是串口。 用户之前问过ADB连接设备输入命令,现在转向串口,可能是在探索不同的设备通信方式。我需要区分ADB和串口的不同应用场景,比如ADB用于Android调试,而串口更多用于嵌入式系统或硬件调试。 接下来,“打印信息”在这里可能指的是通过串口输出日志或数据,而“输入命令”则是发送指令到设备。需要明确这两个过程:设备通过串口发送数据到电脑(打印信息),电脑通过串口发送命令到设备执行。 用户可能的背景是开发者或硬件爱好者,他们可能在调试嵌入式设备,比如树莓派、单片机等。需要举例说明实际应用场景,比如查看传感器数据或配置路由器。 还要考虑用户可能的疑问点,比如串口连接需要的硬件(USB转串口线)、软件工具(PuTTY、SecureCRT),以及常见的命令示例。需要提到波特率、数据位等参数设置的重要性,因为这是串口通信的基础。 另外,用户可能不知道如何开始,所以步骤要详细,比如安装驱动、连接硬件、配置软件。同时要提醒常见问题,比如连接不稳定或无法通信时的检查步骤。 最后,确保语言通俗易懂,避免过多专业术语,但又要准确。可能需要对比之前的ADB教程,帮助用户建立联系,理解不同工具的使用场景。</think>以下是关于 **“通过串口打印信息输入命令”** 的详细解释: --- ### **1. 什么是串口(Serial Port)?** - **串口** 是一种硬件接口,用于设备之间的**低速、异步、串行通信**(数据逐位传输)。 - 常见于嵌入式系统(如单片机、路由器、工控设备)、传感器调试或老旧设备中。 - 现代计算机可能没有物理串口,但可通过 **USB转串口模块**(如 CH340、CP2102 芯片)实现类似功能。 --- ### **2. “通过串口打印信息输入命令”的含义** - **打印信息**:设备通过串口向电脑发送运行日志、调试信息或状态数据(例如传感器数值、系统启动日志)。 - **输入命令**:用户通过串口向设备发送指令(如配置参数、触发操作或调试代码)。 - **本质**:通过串口实现**双向通信**,既接收设备输出的信息,又能控制设备行为。 --- ### **3. 典型应用场景** 1. **嵌入式开发**:调试单片机程序时,通过串口输出变量值或错误信息。 2. **路由器/工控设备**:通过串口配置网络参数或查看系统日志。 3. **无屏幕设备**:例如树莓派无桌面环境时,通过串口登录终端操作。 4. **自动化测试**:通过脚本向设备发送命令并获取响应。 --- ### **4. 如何操作串口?** #### **4.1 硬件准备** - **设备端**:需支持串口通信(如预留 `TX`(发送)、`RX`(接收)、`GND` 引脚)。 - **电脑端**:使用 USB转串口模块(如 PL2303、FT232)连接设备与电脑。 #### **4.2 软件工具** - **Windows**:PuTTY、SecureCRT、Tera Term 或 Arduino IDE 的串口监视器。 - **Linux/macOS**:`screen` 命令、`minicom` 或 `picocom`。 ```bash # Linux/macOS 示例:连接串口设备(如 /dev/ttyUSB0,波特率 115200) screen /dev/ttyUSB0 115200 ``` #### **4.3 配置参数** - **波特率(Baud Rate)**:如 9600、115200(需与设备端一致)。 - **数据位(Data Bits)**:通常为 8 位。 - **停止位(Stop Bits)**:1 位。 - **校验位(Parity)**:无(None)、奇校验(Odd)或偶校验(Even)。 --- ### **5. 操作示例** #### **5.1 接收设备打印信息** 1. 连接设备与电脑,打开串口工具并配置参数。 2. 设备启动时,自动发送日志到串口,电脑端工具会显示类似内容: ``` System Boot Started... Sensor Calibration: OK IP Address: 192.168.1.100 ``` #### **5.2 向设备输入命令** 1. 在串口工具中输入命令并回车(需设备支持命令解析): ``` > set led on # 发送“点亮LED”命令 > get temperature # 查询温度 ``` 2. 设备执行命令后,可能返回响应: ``` LED Status: ON Temperature: 25.3°C ``` --- ### **6. 注意事项** 1. **电平匹配**:设备串口电平需与转换模块兼容(常见 3.3V 或 5V)。 2. **接线正确**:设备 `TX` 接模块 `RX`,设备 `RX` 接模块 `TX`,`GND` 互连。 3. **权限问题**(Linux/macOS):可能需要 `sudo` 或用户加入 `dialout` 组以访问串口设备。 4. **数据干扰**:长距离通信时,建议使用屏蔽线并降低波特率。 --- ### **常见问题** - **无数据输出**:检查接线、波特率、设备是否启用串口输出。 - **乱码**:波特率或数据格式配置错误。 - **无法输入命令**:确认设备是否支持交互式命令,或是否需要切换为“命令行模式”。 如果需要具体设备(如 Arduino、树莓派)的操作示例,可进一步说明! 🔌💻
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值