Linux内核中的BogoMIPS详解

🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习

🎬擅长领域:驱动开发,嵌入式软件开发,BSP开发

❄️作者主页:一个平凡而乐于分享的小比特的个人主页

✨收录专栏:Linux,本专栏目的在于,记录学习Linux操作系统的总结

欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

Linux内核中的BogoMIPS详解

一、什么是BogoMIPS?

1.1 基本定义

BogoMIPS = Bogus (虚假的) + MIPS(每秒百万条指令)

  • 不是真实的CPU性能指标
  • Linux内核启动时计算的一个校准值
  • 用于内核内部延迟循环的时间控制

1.2 核心比喻

text 复制代码
想象场景:
你需要在没有秒表的情况下等待"大概1秒钟"

普通人:       快速数"1-2-3..." (每个人的语速不同)
Linux内核:     运行一个校准过的循环(BogoMIPS就是"语速测量器")

二、BogoMIPS的工作原理

2.1 内核启动时的计算过程

复制代码
启动流程:
[BIOS/UEFI] → [Bootloader] → [Linux内核加载]
                           ↓
                    [BogoMIPS校准]
                    ├── 开始计时
                    ├── 运行固定次数的空循环
                    ├── 停止计时
                    └── 计算:循环次数/时间 = BogoMIPS值

2.2 可视化计算原理

复制代码
时间轴:      |------- t 毫秒 -------|
CPU活动:     [空循环][空循环][空循环]... (N次)
             ↑开始计时           ↑结束计时

计算公式:
BogoMIPS = (N次循环 × 2) / (t秒 × 1,000,000)

示例:
假设:N=1000万次循环,t=0.1秒
BogoMIPS = (10,000,000 × 2) / (0.1 × 1,000,000) = 200.0

三、BogoMIPS vs 真实MIPS:详细对比

对比维度 BogoMIPS 真实MIPS(如Dhrystone)
目的 内核延迟校准 CPU性能基准测试
准确性 粗略近似值 相对精确的度量
使用场景 内核内部使用 硬件评测、比较
稳定性 单次启动固定 多次测试取平均
计算内容 空循环(无实际工作) 实际指令混合
依赖因素 CPU频率、微架构 完整系统性能
典型值范围 几十到几千 几千到几万(现代CPU)

四、实际场景示例

4.1 查看BogoMIPS

bash 复制代码
# 方法1:查看内核启动信息
$ dmesg | grep -i bogomips
[    0.000000] Calibrating delay loop... 499.71 BogoMIPS (lpj=2498560)

# 方法2:查看/proc/cpuinfo
$ cat /proc/cpuinfo | grep bogomips
bogomips    : 4997.12

4.2 不同CPU的典型值对比

复制代码
CPU类型             频率     BogoMIPS值     说明
------------------  ------  -----------    ----------------------
Raspberry Pi 4     1.5GHz   108.00         ARM Cortex-A72
Intel Core i7-8700 3.2GHz   6384.00        现代x86处理器
Intel Pentium 4    3.0GHz   5990.40        古老NetBurst架构
ARM Cortex-A53     1.4GHz   38.40          低功耗ARM核心

4.3 为什么需要BogoMIPS?

场景模拟

c 复制代码
// 内核需要实现一个微秒级延迟
void udelay(unsigned long usecs)
{
    // 没有BogoMIPS:硬编码循环次数 ❌
    // for(i=0; i<1000; i++);  // 在不同CPU上时间不同!
    
    // 有BogoMIPS:动态计算 ✅
    loops = (usecs * loops_per_jiffy * HZ) / 1000000;
    // loops_per_jiffy 来自BogoMIPS校准
    while(loops--);  // 精确延迟
}

五、BogoMIPS的局限性

5.1 常见误解澄清

text 复制代码
误解:"我的CPU有5000 BogoMIPS,比朋友4000的快25%"
事实:BogoMIPS不能用于跨平台/跨架构的性能比较!

原因:
┌─────────────────────────────────────────────┐
│ 影响因素:                                   │
│ 1. CPU微架构差异(ARM vs x86 vs RISC-V)    │
│ 2. 编译器优化差异                           │
│ 3. 内存速度影响                             │
│ 4. 节能模式状态                             │
└─────────────────────────────────────────────┘

5.2 现代内核的变化

复制代码
传统方法问题:
+ 只测试主CPU核心
+ 假设所有核心频率相同
+ 不考虑动态频率调整

现代改进(部分内核):
           ┌─ 多核心分别校准
BogoMIPS ──┼─ 考虑Turbo Boost/降频
           └─ 更精确的计时方法

六、动手实验:理解BogoMIPS

6.1 简单测试脚本

bash 复制代码
#!/bin/bash
# bogomips-demo.sh

echo "=== BogoMIPS演示 ==="
echo "1. 系统BogoMIPS值:"
grep -m1 bogomips /proc/cpuinfo

echo -e "\n2. 简单性能测试对比:"
echo "CPU型号: $(grep 'model name' /proc/cpuinfo | head -1 | cut -d: -f2)"

echo -e "\n3. 实际计算演示:"
echo "假设需要1ms延迟"
echo "根据BogoMIPS,内核会计算需要循环多少次空操作"

6.2 BogoMIPS计算流程图

内核启动
开始计时
执行空循环 N次
结束计时
计算循环速度
BogoMIPS = 2N/时间

单位:百万次/秒
设置loops_per_jiffy

用于后续延迟
继续启动过程

七、技术细节深入

7.1 内核源码中的关键位置

c 复制代码
// 文件:init/calibrate.c
// 简化版校准逻辑
static unsigned long calibrate_delay_converge(void)
{
    unsigned long lpj;
    int i;
    
    lpj = (1<<12);  // 初始猜测值
    
    // 逐步逼近精确值
    for (i = 0; i < 5; i++) {
        lpj = calibrate_delay_direct(lpj);
    }
    
    // 计算BogoMIPS值
    printk(KERN_DEBUG "%lu.%02lu BogoMIPS (lpj=%lu)\n",
           lpj/(500000/HZ),
           (lpj/(5000/HZ)) % 100,
           lpj);
    
    return lpj;
}

7.2 与jiffies的关系

复制代码
关键概念关系:
BogoMIPS → loops_per_jiffy → 精确延迟

1 jiffy = 1/HZ 秒(通常HZ=250,所以1 jiffy=4ms)
loops_per_jiffy = (BogoMIPS * 500000) / HZ

示例计算:
BogoMIPS = 2000, HZ = 250
loops_per_jiffy = (2000 * 500000) / 250 = 4,000,000

八、总结与实用建议

8.1 核心要点总结

  • BogoMIPS是校准值,不是性能指标
  • 用于内核延迟循环,保证时间一致性
  • 不可用于比较不同CPU的性能
  • 每个CPU核心可能有不同的值
  • 现代系统中仍有重要作用

8.2 什么时候关注BogoMIPS?

复制代码
需要关注的场景:
┌───────────────┬─────────────────────────────────┐
│ 场景          │ 原因                             │
├───────────────┼─────────────────────────────────┤
│ 嵌入式开发    │ 确保时间敏感操作的准确性          │
│ 内核调试      │ 检查CPU频率/校准问题              │
│ 虚拟化环境    │ 确保guest时钟准确                 │
│ 旧硬件移植    │ 新内核在老CPU上的兼容性           │
└───────────────┴─────────────────────────────────┘

8.3 进一步学习资源

  1. 内核文档Documentation/timers/NO_HZ.txt
  2. 源码分析init/calibrate.c
  3. 历史背景:早期Linux在80486上的实现
  4. 替代方案:现代高精度计时器(hrtimers)

记住:BogoMIPS就像一把自制的尺子,它可能不精确也不标准,但对于制作它的人来说,足够测量自己的桌子了。Linux内核用它来"测量"自己的时间需求,而不是用来比较不同的"桌子"(CPU)大小。

相关推荐
橘颂TA2 小时前
【Linux 网络】TCP 拥塞控制与异常处理:从原理到实践的深度剖析
linux·运维·网络·tcp/ip·算法·职场和发展·结构与算法
zbguolei2 小时前
CentOS 7.6离线安装Nginx
linux·nginx·centos
苏宸啊2 小时前
Linux开发工具(二)
linux
Linux技术芯3 小时前
黄益平《金融的价值》解码:从浙金中心风暴看金融风险识别与普通人理财生存指南
linux
2401_873587823 小时前
Linux——应用层协议定制
linux·运维·网络协议
小王努力学编程4 小时前
LangChain——AI应用开发框架(核心组件1)
linux·服务器·前端·数据库·c++·人工智能·langchain
Trouvaille ~5 小时前
【Linux】进程间通信(二):命名管道与进程池架构实战
linux·c++·chrome·架构·进程间通信·命名管道·进程池
EndingCoder5 小时前
属性和参数装饰器
java·linux·前端·ubuntu·typescript
馨谙5 小时前
shell编程三剑客------sed流编辑器基础应用大全以及运行示例
linux·运维·编辑器