[kernel 启动流程] (第三章)第一阶段之——proc info的获取

本文深入探讨了Linux Kernel在arm平台上启动的第一阶段,特别是如何获取CPU ID和对应的proc info。讲解了通过mrc指令获取CPU ID,以及通过__lookup_processor_type函数找到匹配的proc info结构体。proc info包含CPU ID、MMU标志等关键信息,用于初始化阶段的内存管理和MMU配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文是基于arm平台。例子都是以tiny210(s5pv210 armv7)为基础的。
参考《ARM 的 CP15 协处理器的寄存器》

[kernel 启动流程]系列

建议参考文档

================================================

零、说明

本文是《[kernel 启动流程] (第一章)概述》的延伸,
阅读本文前建议先阅读《[kernel 启动流程] (第一章)概述》

1、kernel启动流程第一阶段简单说明

arch/arm/kernel/head.S

  • kernel入口地址对应stext
ENTRY(stext)
  • 第一阶段要做的事情,也就是stext的实现内容

    • 设置为SVC模式,关闭所有中断
    • 获取CPU ID,提取相应的proc info
    • 验证tags或者dtb
    • 创建页表项
    • 配置r13寄存器,也就是设置打开MMU之后要跳转到的函数。
    • 使能MMU
    • 跳转到start_kernel,也就是跳转到第二阶段

本文要介绍的是“获取CPU ID,提取相应的proc info”的部分。

2、疑问

主要带着以下几个问题去理解

  • 为什么要获取CPU ID和proc info?也就是说proc info存放了什么东西以至于有必要在第一阶段、打开MMU之前就去获取?
  • 如何获取对应CPU的proc info?

3、对应代码实现

    __HEAD
ENTRY(stext)
    mrc p15, 0, r9, c0, c0      @ get processor id,用于获取CPU ID,具体参考第二节
    bl  __lookup_processor_type     @ r5=procinfo r9=cpuid,根据cpu id获取proc info,具体参考第一节和第三节。
    movs    r10, r5             @ invalid processor (r5=0)?,判断proc info是否存在
 THUMB( it  eq )        @ force fixup-able long branch encoding
    beq __error_p           @ yes, error 'p'

mrc p15, 0, r9, c0, c0 @ get processor id,用于获取CPU ID,具体参考第二节
bl __lookup_processor_type @ r5=procinfo r9=cpuid,根据cpu id获取proc info,具体参考第一节和第三节。

一、procinfo

1、说明
procinfo使用proc_info_list结构体,用来说明一个cpu的信息,包括这个cpu的ID号,对应的内核数据映射区的MMU标识等等。

2、数据结构定义
arch/arm/include/asm/procinfo.h

struct proc_info_list {
    
<think>嗯,用户的问题是关于如何在Linux中查看或监控内核日志消息,特别是通过/proc/kmsg。用户可能是一位系统管理员或开发者,需要实时监控内核行为来调试硬件问题或系统错误。用户在上次对话中已经接触过/proc文件系统的概念,这次是更具体的实践需求。 首先需要明确/proc/kmsg的特殊性——它是内核环形缓冲区的接口,提供原始日志流。这和常见的dmesg命令或syslog不同,后者可能经过格式化或过滤。用户可能没意识到的是:直接读取/proc/kmsg需要root权限,且读取后消息会从缓冲区移除,这点必须重点说明。 注意到引用[3]提到/proc/stat的结构,说明用户对/proc下的文件已有基础认知。但kmsg的访问方式更底层,需要强调实时性和独占性。工具建议部分要覆盖从基础命令(dmesg)到高级方案(tailf),再到系统级方案(rsyslog配置),形成梯度。 安全提示很重要:用户若在生产环境操作,需知道意外清空缓冲区的风险。最后生成的问题要引导用户深入——比如日志过滤需求往往是实际使用中紧接着会遇到的问题。</think>在 Linux 系统中查看或监控内核日志消息(`/proc/kmsg`)主要有以下几种方法: ### 一、核心方法:/proc/kmsg 1. **实时原始日志流** `/proc/kmsg` 是内核环形缓冲区的直接接口,提供**原始未过滤**的日志流: ```bash sudo cat /proc/kmsg # 需要 root 权限 ``` *⚠️ 特性*: - 多个进程同时读取时,只有第一个进程能获取完整日志 - 读取后消息会从缓冲区移除 - 适合需要原始日志流的场景[^1][^3] --- ### 二、常用工具 1. **`dmesg` 命令** ```bash dmesg | less # 查看历史日志 dmesg -w # 实时监控新日志(需较新内核) dmesg --level=err # 过滤错误级别日志 ``` 2. **`tailf` 或 `tail -f`** 结合 syslog 文件实现持续监控: ```bash tail -f /var/log/kern.log # Debian/Ubuntu tail -f /var/log/messages # RHEL/CentOS ``` --- ### 三、系统日志服务(推荐) 1. **rsyslog 配置** 编辑 `/etc/rsyslog.conf` 确保包含: ```conf kern.* /var/log/kern.log ``` 重启服务生效: ```bash sudo systemctl restart rsyslog ``` 2. **systemd-journald** 使用 `journalctl` 查看结构化日志: ```bash journalctl -k # 仅内核日志 journalctl -k -f # 实时跟踪 journalctl -k --since="1h ago" # 时间范围过滤 ``` --- ### ⚠️ 重要注意事项 1. **权限要求** 直接访问 `/proc/kmsg` 需 root 权限,普通工具如 `dmesg` 可通过用户组授权: ```bash sudo usermod -aG adm $USER # Debian/Ubuntu sudo usermod -aG wheel $USER # RHEL/CentOS ``` 2. **缓冲区限制** 内核日志缓冲区大小固定(默认 128KB),可通过内核参数调整: ```bash sudo sysctl kernel.printk_ringbuffer=512 # 调整为 512KB ``` 3. **日志优先级** 内核使用 0-7 的优先级(0=紧急, 7=调试),可通过 `dmesg -n 4` 设置控制台显示级别。 --- ### 操作示例 ```bash # 实时监控内核错误/警告 sudo dmesg -w --level=err,warn # 追踪特定设备日志(如 USB) sudo tail -f /var/log/kern.log | grep usb ``` > **最佳实践**:生产环境建议使用 `journalctl` 或配置 `rsyslog` 集中管理日志,避免直接操作 `/proc/kmsg`[^1][^3]。 --- ### 相关问题 1. `/proc/kmsg` 和 `dmesg` 输出的日志有何本质区别? 2. 如何配置系统在启动时自动记录内核恐慌(Kernel Panic)信息? 3. 怎样通过内核参数永久调整日志缓冲区大小? 4. 如何过滤 `journalctl` 输出的特定驱动模块日志? [^1]: 引用自 Linux `/proc` 文件系统文档,描述其作为内核信息接口的特性。 [^3]: 参考 `/proc/stat` 的内核信息访问方式,类似机制适用于 `/proc/kmsg`。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值