首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Linux内核中的BogoMIPS详解

Linux内核中的BogoMIPS详解

作者头像
一个平凡而乐于分享的小比特
发布2026-02-02 17:22:08
发布2026-02-02 17:22:08
1090
举报

🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习 🎬擅长领域:驱动开发,嵌入式软件开发,BSP开发 ❄️作者主页:一个平凡而乐于分享的小比特的个人主页 ✨收录专栏:Linux,本专栏目的在于,记录学习Linux操作系统的总结 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

在这里插入图片描述
在这里插入图片描述

Linux内核中的BogoMIPS详解

一、什么是BogoMIPS?

1.1 基本定义

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

  • 不是真实的CPU性能指标
  • Linux内核启动时计算的一个校准值
  • 用于内核内部延迟循环的时间控制
1.2 核心比喻
代码语言:javascript
复制
想象场景:
你需要在没有秒表的情况下等待"大概1秒钟"

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

二、BogoMIPS的工作原理

2.1 内核启动时的计算过程
代码语言:javascript
复制
启动流程:
[BIOS/UEFI] → [Bootloader] → [Linux内核加载]
                           ↓
                    [BogoMIPS校准]
                    ├── 开始计时
                    ├── 运行固定次数的空循环
                    ├── 停止计时
                    └── 计算:循环次数/时间 = BogoMIPS值
2.2 可视化计算原理
代码语言:javascript
复制
时间轴:      |------- 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
代码语言:javascript
复制
# 方法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的典型值对比
代码语言:javascript
复制
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?

场景模拟

代码语言:javascript
复制
// 内核需要实现一个微秒级延迟
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 常见误解澄清
代码语言:javascript
复制
误解:"我的CPU有5000 BogoMIPS,比朋友4000的快25%"
事实:BogoMIPS不能用于跨平台/跨架构的性能比较!

原因:
┌─────────────────────────────────────────────┐
│ 影响因素:                                   │
│ 1. CPU微架构差异(ARM vs x86 vs RISC-V)    │
│ 2. 编译器优化差异                           │
│ 3. 内存速度影响                             │
│ 4. 节能模式状态                             │
└─────────────────────────────────────────────┘
5.2 现代内核的变化
代码语言:javascript
复制
传统方法问题:
+ 只测试主CPU核心
+ 假设所有核心频率相同
+ 不考虑动态频率调整

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

六、动手实验:理解BogoMIPS

6.1 简单测试脚本
代码语言:javascript
复制
#!/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计算流程图

七、技术细节深入

7.1 内核源码中的关键位置
代码语言:javascript
复制
// 文件: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的关系
代码语言:javascript
复制
关键概念关系:
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?
代码语言:javascript
复制
需要关注的场景:
┌───────────────┬─────────────────────────────────┐
│ 场景          │ 原因                             │
├───────────────┼─────────────────────────────────┤
│ 嵌入式开发    │ 确保时间敏感操作的准确性          │
│ 内核调试      │ 检查CPU频率/校准问题              │
│ 虚拟化环境    │ 确保guest时钟准确                 │
│ 旧硬件移植    │ 新内核在老CPU上的兼容性           │
└───────────────┴─────────────────────────────────┘
8.3 进一步学习资源
  1. 内核文档Documentation/timers/NO_HZ.txt
  2. 源码分析init/calibrate.c
  3. 历史背景:早期Linux在80486上的实现
  4. 替代方案:现代高精度计时器(hrtimers)

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-01-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Linux内核中的BogoMIPS详解
    • 一、什么是BogoMIPS?
      • 1.1 基本定义
      • 1.2 核心比喻
    • 二、BogoMIPS的工作原理
      • 2.1 内核启动时的计算过程
      • 2.2 可视化计算原理
    • 三、BogoMIPS vs 真实MIPS:详细对比
    • 四、实际场景示例
      • 4.1 查看BogoMIPS
      • 4.2 不同CPU的典型值对比
      • 4.3 为什么需要BogoMIPS?
    • 五、BogoMIPS的局限性
      • 5.1 常见误解澄清
      • 5.2 现代内核的变化
    • 六、动手实验:理解BogoMIPS
      • 6.1 简单测试脚本
      • 6.2 BogoMIPS计算流程图
    • 七、技术细节深入
      • 7.1 内核源码中的关键位置
      • 7.2 与jiffies的关系
    • 八、总结与实用建议
      • 8.1 核心要点总结
      • 8.2 什么时候关注BogoMIPS?
      • 8.3 进一步学习资源
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档