You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从初始化二进制程序向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,但需满足以下前提:
    1. 内核已启用CONFIG_PSTORE和CONFIG_PSTORE_RAM(ramoops)相关配置,且已通过内核启动参数(如ramoops.mem_address、ramoops.mem_size)正确设置ramoops的内存区域参数。
    2. 在/etc/init.d/rcS中正确挂载pstore文件系统:执行mount -t pstore pstore /sys/fs/pstore,确保挂载操作执行成功。
    3. 执行echo $(ls /) > /sys/fs/pstore/custom-message时,当前运行身份需拥有/sys/fs/pstore目录的写入权限,启动阶段以root身份运行通常不会有权限问题。
  • 注意事项:ramoops存储区域大小固定,内容超出限制时旧消息会被新消息覆盖;只有系统异常重启或崩溃后,pstore中的内容才会被内核读取输出,正常关机后内容会保留,但需手动挂载pstore才能查看。

内容的提问来源于stack exchange,提问作者Bret Joseph

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 01:25:04