如何从初始化二进制程序向ramoops中记录启动消息?
自定义init程序向ramoops存储消息的问题与解决方案
问题描述
我希望通过自定义初始化二进制程序向ramoops存储启动阶段的消息,当前的init.c代码如下:
#include <sys/stat.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> int main() { int result = mknod("/dev/console", 0600, 0); result = system("/etc/init.d/rcS"); printf("Hello, World! %i\n", result); sleep(999999999); return result; }
系统启动后内核并未输出Hello World信息,想请教:能否在/etc/init.d/rcS中挂载pstore后,执行echo $(ls /) > /sys/fs/pstore/custom-message将消息存储到ramoops中?
解决方案与说明
关于printf无输出的问题
- 你的
printf没有输出到控制台,是因为stdout默认是行缓冲,此时未关联正确终端设备导致缓冲无法刷新。可以直接写入/dev/console替代printf,或者调用fflush(stdout)强制刷新输出缓冲,示例代码:printf("Hello, World! %i\n", result); fflush(stdout); - 另外你创建
/dev/console的方式有误,mknod的第三个参数需要正确的设备号(主、次设备号组合),正确写法应为mknod("/dev/console", S_IFCHR | 0600, makedev(5, 1));,同时需要包含<sys/sysmacros.h>头文件,否则无法生成可用的控制台设备节点,导致输出无法定向到控制台。
关于通过pstore/ramoops存储消息的可行性
- 完全可以通过该方式将消息存入ramoops,但需满足以下前提:
- 内核已启用
CONFIG_PSTORE和CONFIG_PSTORE_RAM(ramoops)相关配置,且已通过内核启动参数(如ramoops.mem_address、ramoops.mem_size)正确设置ramoops的内存区域参数。 - 在
/etc/init.d/rcS中正确挂载pstore文件系统:执行mount -t pstore pstore /sys/fs/pstore,确保挂载操作执行成功。 - 执行
echo $(ls /) > /sys/fs/pstore/custom-message时,当前运行身份需拥有/sys/fs/pstore目录的写入权限,启动阶段以root身份运行通常不会有权限问题。
- 内核已启用
- 注意事项:ramoops存储区域大小固定,内容超出限制时旧消息会被新消息覆盖;只有系统异常重启或崩溃后,pstore中的内容才会被内核读取输出,正常关机后内容会保留,但需手动挂载pstore才能查看。
内容的提问来源于stack exchange,提问作者Bret Joseph
相关产品推荐
相关产品推荐

