🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习
🎬擅长领域:驱动开发,嵌入式软件开发,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 进一步学习资源
- 内核文档 :
Documentation/timers/NO_HZ.txt - 源码分析 :
init/calibrate.c - 历史背景:早期Linux在80486上的实现
- 替代方案:现代高精度计时器(hrtimers)
记住:BogoMIPS就像一把自制的尺子,它可能不精确也不标准,但对于制作它的人来说,足够测量自己的桌子了。Linux内核用它来"测量"自己的时间需求,而不是用来比较不同的"桌子"(CPU)大小。