1990 年代:前因——“硬盘太慢、驱动太多”

  • 背景:早期 Linux 根文件系统要么在软盘、要么在 IDE 硬盘,内核把对应的软盘/IDE 驱动编进去即可顺利挂载。
  • 矛盾出现:随着 SCSI、PCMCIA、USB、RAID 控制器等百花齐放,如果把所有可能的驱动都静态编进内核,内核体积会爆炸;如果把驱动当模块放在 /lib/modules,又陷入“挂载根文件系统需要根文件系统里的模块”的鸡与蛋问题。
  • 解决思路:在内存里先伪造出一个“小硬盘”(ramdisk),把必备驱动、工具、甚至 fsck 都塞进这个内存盘;内核只要能识别内存本身,就能先挂 ramdisk,再从 ramdisk 里加载真正的存储驱动,最后 pivot 到真正的根文件系统
    这就是 ramdisk 技术诞生的直接原因——启动阶段的“驱动跳板”

1995:首次实现——rd.c 与 ramdisk 的诞生

  • 1995 年左右的内核 1.x/2.0,出现了最早的 rd.c;它把一段连续的物理内存注册成块设备 /dev/ramX,再通过 mke2fs 格式化就能当磁盘用
  • 特点:
    – 大小在编译时固定(默认 4 MB,最多 16 个设备);
    – 需要完整走块设备层,先格式化再挂载,浪费内存和 CPU;
    – 掉电即失,只能放启动时一次性数据 。

1999-2002:initrd 标准化——压缩 cramfs/ext2 镜像

  • 为了解决早期 ramdisk 浪费内存的问题,社区把 ramdisk 做成压缩镜像(ext2、cramfs、romfs),由 bootloader 一次性读入内存,内核解压后挂载为临时根文件系统
  • 这就是我们今天说的 initrd(initial ramdisk)。
  • 启动流程变为:
    1. bootloader 把内核 + initrd.gz 读进内存;
    2. 内核启动→解压 initrd→挂载为 /→执行 /linuxrc 或 /init
    3. /init 加载 udev、驱动、建立 /dev 节点→挂载真正的根文件系统→switch_root
  • 局限性:镜像大小固定,需要事先估算;解压后仍占用整块内存;脚本维护复杂。

2004-2006:initramfs 兴起——ramfs/tmpfs 取代块设备

  • 内核 2.4/2.6 引入 initramfs技术上基于 ramfs/tmpfs,而非块设备
  • 区别:
    不再是块设备,而是直接利用 page cache 当文件系统,省掉一次格式化/缓存复制;
    大小可变,按需增长,可回收;
    – 使用 cpio 格式打包,可无缝嵌入内核镜像(CONFIG_INITRAMFS_SOURCE);
    – 启动脚本统一为 /init,接口更简单 。
  • 结果:initrd 退出主流,initramfs 成为各大发行版的默认启动机制。

2007-至今:brd 模块、tmpfs 日常化

  • 传统 ramdisk 块设备演化为 brd(block ramdisk,drivers/block/brd.c),仍保留在源码,用于:
    – 无盘机、嵌入式系统需要真正“磁盘”语义的场景;
    – 测试块层、文件系统完整性校验等。
  • 日常使用中,tmpfs 全面接管“内存当磁盘”的需求:
    – /tmp、/run、/dev/shm 默认挂载 tmpfs;
    – 读写速度 1 GB/s 以上,空间随用随还;
    – 不再掉坑“固定大小、双份缓存” 。

副作用与经验教训

  • 掉电即失:曾有人把 MySQL 数据目录放在 ramdisk 以求极速,结果断电订单归零 。
  • 内存是昂贵资源:ramdisk 占用不可回收的连续内存,tmpfs 则可用 swap、可回收,性价比更高。
  • 安全场景:ramdisk 的易失性反而成为“解密后即焚”的理想场所,例如高安全级别下的临时解密盘 。

一句话总结
ramdisk 最初是“为了启动而伪造的磁盘”,后来变成“为了速度而牺牲容量”的利器,最终被 initramfs + tmpfs 取代——它完成了“启动跳板”的使命,也留给我们一条宝贵经验:内存不是保险箱,速度和安全必须权衡。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/95604.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/95604.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/95604.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ETH持续上涨推动DEX热潮,交易活跃度飙升的XBIT表现强势出圈

BOSS Wallet 8月15日讯,随着ETH价格在过去24小时内强势拉升至4300美元,整个加密市场再度掀起涨势狂潮,链上交易活跃度空前高涨。其中,去中心化交易所平台迅速成为市场焦点,其平台活跃度与交易量双双上涨,吸…

Stand-In - 轻量级人物一致性视频生成 高保真视频人脸交换 ComfyUI工作流 支持50系显卡 一键整合包下载

Stand-In 是一个轻量级、即插即用的身份保护视频生成框架,只需要上传一张人物照片,加上一段提示词,即可生成高度一致性的高保真人物视频,人脸相似度和自然都几乎达到100%还原水平。 Stand-In 能把任何一张人脸(甚至动漫…

vue3相关基础

1、ref和reactive的区别两者都是响应式数据的声明。Reactive只适用于非基本数据类型&#xff0c;如对象&#xff0c;数组等。而ref是兼容适用于reactive的的数据类型的以及其他数据&#xff0c;灵活性较高。ref声明的变量取值时需要.value。在<template></template>…

云手机存储和本地存储的区别

云手机存储通常指云存储&#xff0c;即数据存储在云端服务器&#xff0c;本地存储则是将数据存储在用户设备硬件中&#xff0c;主要区别体现在存储位置、访问方式、依赖条件等多个方面&#xff0c;具体如下&#xff1a;本地存储主要是将数据存储在用户自有设备的物理硬件中&…

【科研绘图系列】R语言绘制三维曲线图

文章目录 介绍 加载R包 数据下载 导入数据 数据预处理 画图 系统信息 参考 介绍 【科研绘图系列】R语言绘制三维曲线图 加载R包 library(tidyverse) library(ggsignif) library(RColorBrewer) library(dplyr) library(reshape2) library(grid

python常用包

以下按类别列举10个常用Python包&#xff0c;并以一句话概括其核心作用&#xff1a; 一、数据分析与科学计算 NumPy&#xff1a;提供高性能多维数组及数学运算&#xff0c;是数值计算的基础库。Pandas&#xff1a;通过DataFrame结构实现高效表格数据清洗、分析与处理。SciPy&am…

“ 船新版本 ”

在 GeeLark 最新版本中&#xff0c;增强了 AIGC 生成能力以及 AI 协助自定义任务开发功能&#xff0c;给用户优化构建从内容生产到运营自动化的完整技术链&#xff0c;为跨境电商及企业用户提供更完善的智能化解决方案&#xff0c;效率翻倍轻松出海。 AIGC 接入 MiniMax-Hailuo…

力扣 —— 二分查找

搜索插入位置 35. 搜索插入位置 - 力扣&#xff08;LeetCode&#xff09; 算法思想&#xff1a; class Solution(object):def searchInsert(self, nums, target):left0 rightlen(nums)-1while left < right :mid (left right) // 2if nums[mid] < target:left mid 1…

USB ADB 简介

概念 ADB 是 Android 平台的 调试桥接协议&#xff0c;允许主机&#xff08;PC&#xff09;与 Android 设备通信。 通过 ADB&#xff0c;开发者可以执行命令、调试应用、传输文件、访问 shell、调试 logcat 等。 ADB 运行在 USB 或 TCP/IP 上&#xff0c;但最常用的是 USB 连…

【Golang】:数据类型

目录 1. 基本数据类型 1.1 布尔类型 1.2 整数类型 1.3 浮点数类型 1.4 复数类型 1.5 字符类型 1.6 字符串类型 2. 类型转换 2.1 基本数据类型 → string 2.2 string → 基本数据类型 3. 常量 1. 基本数据类型 1.1 布尔类型 Go中的布尔类型取值为true或false&#…

旋钮键盘项目---foc讲解(开环)

这里就不过多的讲解什么原理&#xff0c;公式的变换了&#xff0c;感兴趣的可以看灯哥开源&#xff0c;讲解的非常好的。当然&#xff0c;更细致的讲解&#xff0c;也可以看b站其他教学。 我这里主要讲解我对于开环部分的理解&#xff0c;以及stm32代码的实现逻辑。可以看作是…

数据科学与计算:爬虫和数据分析案例笔记

案例 1&#xff1a;中国大学排名爬取与分析 一、任务描述 目标&#xff1a;爬取高三网中国大学排名一览表&#xff0c;提取学校名称、总分、全国排名、星级排名、办学层级等数据&#xff0c;并保存为 CSV 文件。 网址&#xff1a;2021中国的大学排名一览表_高三网 二、任务…

华测科技的3D GPR数据分析

很高兴得到了张总的支持&#xff0c;获得了他们雷达的数据&#xff0c;并写了雷达数据读取和转换文件。1 背景搜索后发现华测实力很强&#xff0c;因为他们可达到100km/h的时速&#xff0c;以前我只知道中电众益可以达到这个速度。2数据格式分析2.1 华测数据因为长时间不编程&a…

最长链(二叉树直径DFS)

题目描述现给出一棵N个结点二叉树&#xff0c;问这棵二叉树中最长链的长度为多少&#xff0c;保证了1号结点为二叉树的根。输入第1行为包含了一个正整数N&#xff0c;为这棵二叉树的结点数&#xff0c;结点标号由1至N。 接下来N行&#xff0c;这N行中的第i行包含两个正整数l[i]…

802.11 Wi-Fi 竞争机制深度分析:CSMA/CA 与 DCF

802.11 Wi-Fi 竞争机制深度分析&#xff1a;CSMA/CA 与 DCF 一、核心机制&#xff1a;CSMA/CA&#xff08;载波侦听多路访问/冲突避免&#xff09; 传统以太网使用 CSMA/CD&#xff08;冲突检测&#xff09;&#xff0c;但无线环境中无法实现冲突检测&#xff0c;因此802.11采用…

【Go语言-Day 36】构建专业命令行工具:`flag` 包入门与实战

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…

C语言——深入理解指针(四)

C语言——深入理解指针&#xff08;四&#xff09; 数组名的意义sizeof&#xff08;数组名&#xff09;&#xff0c;且数组名单独放在sizeof内部&#xff0c;则这里的数组名表示整个数组&#xff0c;计算的是整个数组的大小&数组名&#xff0c;这里的数组名表示的是整个数组…

LeetCode 刷题【42. 接雨水】

42. 接雨水 自己做 解&#xff1a;双指针左右分割容器 class Solution { public:int trap(vector<int>& height) {int res 0;int len height.size();if(len < 2) //构不成一个容器了&#xff0c;直接返回return res;int end len - 1; //右边界int…

网络的基本概念、通信原理以及网络安全问题

目录 1、 什么是网络&#xff1f; &#xff08;1&#xff09;网络的概念与本质 &#xff08;2&#xff09;电压信号的合并与抵消 &#xff08;3&#xff09;电压的本质 2、中转设备 &#xff08;1&#xff09;背景 &#xff08;2&#xff09;中转设备的处理能力与编程能…

Windows下使用WSL2创建Ubuntu子系统(更改安装位置与启动图形桌面)

Windows下使用WSL2创建Ubuntu子系统&#xff08;更改安装位置与启动图形桌面&#xff09; 本文介绍如何使用WSL2创建Ubuntu子系统&#xff0c;并更改安装位置到其他磁盘&#xff0c;并启动图形桌面Xfce4。 WSL 版本: 2.5.7.0 系统版本: Windows11 23H2 相关工具&#xff1a;Mo…