initramfs编译到内核似乎没运行,都怪自己没看官方教程
现象
Kernel挂载自定义的文件系统后似乎没有任何提示,不知文件系统制作是否成功。
背景
Linux的根文件系统调试方式有很多种,uboot传递相应参数告知从Kernel从哪里挂载根文件系统: MTD、硬盘、NFS、SD卡、initramfs。这里我选择的是initramfs的方式挂载,目的是尽可能 排除其他环境因素影响文件系统测试,包括:NFS root没有执行权限;uboot的NAND纠错算法(ECC)和 Kernel的不一致导致MTD数据载入错误。
initramfs是直接和Kernel绑定在一起,同时解压到内存,踩坑的概率要小很多 ,保证文件系统 足够小、内存足够大,基本不会遇到问题。
之所以写这篇文章是没仔细读取Kernel官方文档:Documentation/filesystems/ramfs-rootfs-initramfs.rst。
1. 制作方式
上文说了initramfs要保证文件系统足够小、内存足够大。没有什么比一句话代码的容量更小。 万能的儿童版Hello world教程,这个例位于linux源码 Documentation 目录下,注意后面的休眠2秒,
为什么休眠2秒,这里先埋个包袱 。
源码最好静态编译,避免遗漏拷贝 .so 影响测试。
配置内核填入initramfs的根目录
uboot传递启动参数:setenv bootargs ‘console=ttyAM0,115200n8 rdinit=/sbin/init’ 。
Kernel的ramdisk_execute_command字符串接受这个参数,rdinit是initramfs执行的第一个程序位置, 进程的PID是1。
console这么传递请参考上一篇文章《uboot传递console究竟怎么填?ttyX傻傻分不清》。
Kernel最后加载文件系统阶段首先检查是否存在rdinit所指的文件,不存在则从其他媒介设备 挂载文件系统。从Kernel角度来说,无论是rdinit和其他媒介设备的文件系统内核都同等对待, 只是找到谁就执行谁而已。
相关源码位于init/main.c
走你,咦!内核启动结束后没看到期待的 “Hello world” 。
2. 提出排查方向
起初怀疑3个方向:
文件没有找到文件找到了,却没执行权限文件找到了,也执行了,但没找到stdout3. 排除设想1、2
从输出结果怀疑方向,首先最先排除的是“设想1”,肯定是找到/sbin/init,否则不会出现倒数第二行 “CPU 0执行的init进程PID 1 退出”,没执行哪来的退出,于是排除“设想2”。
验证方案也很简单,删除/work/ramfs/sbin/init再测试一次。
输出内容有明显差异,输出意思:rdinit所指文件不存在,尝试从其他媒体设备挂载文件系统,而其他媒体 设备位置却没有传递,请纠正 “root=” 参数。
5. 确认设想3
回头看 Warning: unable to open an initial console 。某个console没有打开?会不会是 “设想3”的stdout呢?
该字符串出现在源码 init/main.c。尝试打开/dev/console作为标准输入/输出/错误,节点的信息照抄 本地PC的 “ls -l /dev/console”。照葫芦画瓢创建节点。
sudo mknod -m 622 console c 5 1
再次上电测试成功看到 “Hello world”
为什么延时2秒
延时2秒是为了看效果,系统正常运行时是不允许PID 1退出,它很特殊起到脱孤进程的作用,一旦退出系统认为出大事咯,立即打印出堆栈信息,并停止运行。
注意不是内存!谁在影响手机的存储(ROM)性能?
就好像新款PC的主硬盘已经全面过渡到SSD一样,如今智能手机的闪存也都经历了一次较大的迭代,就是从eMMC闪存跨越到了UFS闪存。那么,又有谁在影响UFS闪存的性能呢?
RAM和ROM的区别
直到现在还有不少朋友搞不清RAM和ROM的差异,本文我们就再做次小科普。RAM代表手机内存(又称“运存”),就好像PC上的内存条,只是手机内存都是一颗单独的芯片。ROM代表存储空间(又称“闪存”),类似PC上的硬盘,而手机上的ROM依旧是以一颗NAND闪存芯片的形态存在。
闪存标准
早期智能手机都内置eMMC闪存,它是在NAND闪存芯片的基础上,额外集成了主控制器,并将二者“打包”封装封成一颗BGA芯片,从而减少了对PCB主板的空间占用。eMMC的最新标准为eMMC 5.1,常见于千元以内的入门级手机市场,读取速度最高只有400MB/s左右。
UFS是eMMC的进阶版,它是由多个闪存芯片、主控、缓存组成的阵列式存储模块。UFS弥补了eMMC仅支持半双工运行(读写必须分开执行)的缺陷,可以实现全双工运行,所以性能得以翻番。
UFS目前存在UFS2.0(读取速度700MB/s)、UFS2.1(900MB/s)、UFS2.2(900MB/s)、UFS3.0(1700MB/s)和UFS3.1(1900MB/s)等标准,UFS2.x常见于中低端产品,UFS3.x则是高端手机的标配。
闪存通道
和内存一样,UFS闪存也存在单通道和双通道之别,两者读写性能相差30%~50%之间。好消息是,如今新款手机都已标配双通道UFS,所以咱们只要简单了解一下即可。
Write Turbo技术
Write Turbo是UFS3.0时期引入的一项虚拟技术,很多品牌主打的闪存增强技术大多是基于它优化而来。我们都知道,现在手机闪存都是TLC介质的NAND芯片,它的优势是可以在每个存储单元中保存3bit,能以低成本实现更大的容量,但读写,特别是写入速度远不如SLC NAND。
所谓的Write Turbo,其实就是虚拟SLC技术。它会将部分TLC闪存容量虚拟成SLC,当手机在写入数据时,系统会优先将其写入到虚拟的SLC空间,由于后者每个存储单元只需保存1bit数据,所以写入速度会有大幅提升(读取速度也有明显提升)。
但是,如果一次写入的数据容量超过了虚拟SLC容量,读写速度便会骤降至TLC的水平上。
各大手机厂商会在虚拟SLC的容量和调度规则上存在差异,比如有些厂商会选择全盘虚拟SLC的方式,随着使用空间的逐渐增加,速度会逐渐下降。因此,都是内置UFS3.1+Write Turbo闪存的手机,它们之间的实际体验可能也有高低之分。
最新量产的UFS2.2,本质上其实就是UFS2.1+Write Turbo,可以将持续写入速度从250MB/s提升到500MB/s以上。
磁盘阵列存储系统
除了使用Write Turbo虚拟SLC以外,黑鲨4 Pro和黑鲨4S系列还给我们带来了一个全新的思路——磁盘阵列存储系统。
简单来说,这款手机除了内置闪存芯片以外,还额外添加了一颗来自群联的SSD芯片,并将二者组成了Raid 0阵列,如此让手机的读写速度都有着50%以上的提升。
RAMDISK磁盘加速器
黑鲨4 Pro和4S系列同时还主打一项名为RAMDISK磁盘加速器的功能。提起“RAMDISK”很多朋友应该非常熟悉,很早以前CFan曾多次报道过如何将电脑闲置内存使用虚拟成RAMDISK“内存盘”,保存其中的程序运行飞快,但每次关机内存盘都会被清空,下次开机后还需重新加载程序。
电脑领域的RAMDISK内存虚拟硬盘软件
黑鲨的RAMDISK磁盘加速器的原理和内存盘差不多,都是直接通过内存模拟闪存存储空间,让游戏文件直接在内存中完成读写,游戏的启动、加载和运行速度更是大幅提升。需要注意的是,该功能仅限标配12GB或16GB内存的高配版本,8GB内存版则不支持RAMDISK技术。
原因也很简单,在当前的应用环境8GB内存都不嫌多,哪里还有额外空间供你虚拟闪存?此外,同一时间仅有一款游戏可以运行在基于RAMDISK技术的极速模式下,想切换其他游戏时必须等待一定的时间让极速模式挂载完成。
闪存内存合二为一
作为手机内部最占用PCB主板空间的“大户”,内存(包括隐藏在其下面的SoC)和闪存的体型都不小,如果能将这颗存储芯片也和处理器内存摞在一起,不就可以更加节省主板空间了吗?2020年底,美光发布的uMCP5闪存技术就有望实现这个梦想。
简单来说,uMCP5是全球首次通过MCP多芯片封装的方式,在单颗芯片内就完整集成了自家的LPDDR5内存芯片、NAND闪存芯片以及UFS 3.1控制器,它采用TFBGA封装格式,最大可选12GB+256GB容量。其中,该产品LPDDR5内存的部分支持6400Mbps的数据传输率,UFS3.1闪存部分的编程/擦写循环次数可达到5000次。
总之,美光uMCP5的出现,可以进一步提升手机的存储密度,节省内部空间、成本和功耗,而我们也期待这种“二合一”的存储芯片可以早日在手机领域量产,并有机会用于笔记本等其他计算设备领域。
小结
作为影响手机性能输出的“铁三角”,闪存和内存的重要性不次于处理器,因此每次它们的技术革新,都会带来切实的实际体验提升。希望大家今后在选购手机时,可以将目光多多投向这两个领域的优化和升级上。
相关问答
为什么nfs一直 挂载 失败-ZOL问答用NFS方式挂载根文件系统由于原来的内核是用ATBOOT的方式下载的,不知道怎么传递参数(好像不能,网上查的nfs方式都是用U-boot的方式挂载的),因此决定用u-boot重...