Linux内核开发_2_Initramf
目录
什么是Initramf?
1.1 Initramf起源
1.1.1 tmpfs
1.1.2 Initramf诞生原因
1.2 qemu命令重新说明
什么是Initramf?
1.1 Initramf起源
1.1.1 tmpfs
在最初,Linus(Linux内核的作者)早期想要编写一个能够与chech(CPU缓存)的文件系统,Linus在rasmfs(ram(与内存交互的文件系统)上的chech(缓存功能)上做了封装,使其能够对主板上的L1和L2等不同级别的缓存进行交互,名字叫tmpfs,也被叫做临时的根文件系统,因为原本的交互一般使用的都是ramfs文件系统与内存交互,与磁盘会使用ext的文件系统与之交互,这一切都会通过一个叫VFS的Linux子系统来完成与这些文件系统的挂载并交互。
1.1.2 Initramf诞生原因
文件系统的编写也是需要要规范的,必须满足VFS的架构,后面我们在详细讨论这个。
但是如果我们想要定制Linux内核,比如一些发行版,开机都会有定制画面,或者加载一些第三方的DLIB库,这些工作在内核态是万万不能的,因为内核态是不能去做除了初始化硬件,和初始化内核态所需的一些变量参数,同时内核也不能进行浮点数运算,原因很简单,浮点数在内存中和其它整数的表示不一样,且运算指令集也不同,使用的运算器件也不一样,且如果用户态此时在进行浮点数运算,那么内核态就需要等待用户态完成浮点数运算才能进行下一次的浮点数运算,在硬件上浮点数的计算是比较复杂的,这些我后面会在CPU底层原理方面详细说一下。
同时内核只能做线程调度还有内存管理一些工作,其它的内核绝对不能参与,因为这样会大幅度降低内核效率,且内核是绝对不允许使用任何运行时还要去动态加载的第三方lib库,太过于耗时。内核一定要精简,效率高,你可以在Linux内核里看到大量宏,或者内联,以及汇编的代码,这些代码都是优化代码,因为内核掌管硬件,从事过单片机开发的都只能,单片机开发,绝对不能使用编译器优化命令,这样容易导致某些关键指令被优化导致某些电路开关无法打开。
且Initramf要求是SVR格式的文件。可以使用CPIO来做格式化处理(详细参考:https://blog.csdn.net/bjbz_cxy/article/details/106089338)
如开GPIO1的电路,但是开完立马关掉如下代码:
GPIO1 = 1;
sleep(2);
GPIO = 0;
编译器会认为最终结果GPIO等0,会直接把上面代码省略掉,直接赋予GPIO0
后来,一些发行版的内核开发人员们想了一个办法,那就是在tmpfs上进行一个简单的封装,因为tmpfs是内核初始化结束后,运行VFS子系统时,会去主动加载一个临时根文件系统,也可以不加载,这里根据内核配置与内核启动参数,在这个上面去完成我们想要的工作,去加载我们要加载的第三方lib库,或者输出开机启动画面等等工作,这个就叫Initramf,就相当于是要加载的根文件系统的一个应用程序。它是建立在tmpfs上的,在执行完之后会去加载我们的根文件系统,如果没有指定内核参数,则加载默认的。
1.2 qemu命令重新说明
这里我们把上一篇文章的qemu启动命令在重新说一遍:
qemu-system-x86_64 \-kernel ./bzImage 内核文件-initrd ./rootfs 临时根文件系统-append "root=根文件系统 rdinit=第一个init程序"
-initrd 就是指定我们的临时根文件系统目录,同时临时根文件系统的格式只能是SVR4的归档格式,详细可以参考我上一篇的文章,指定了之后,-append给内核传递启动参数时立马的rdinit意思是从临时根文件系统里寻找第一个执行的程序,如果是init=则是从根文件系统里寻找,这个需要使用root=指定根文件系统
Linux内核开发_2_Initramf相关推荐
- Linux 内核开发特点
Linux 内核 开发的特点 无 libc 库抑或无标准头文件库 GUN C 没有内存保护机制 不要再内核中轻易使用浮点数 容积小而且固定的栈 同步和并发 可移植性的重要性 参考文献 开发的特点 相对 ...
- Linux内核开发工作方向
Linux内核开发工作方向
- 嵌入式系统Linux内核开发工程师必须掌握的三十道题
嵌入式系统Linux内核开发工程师必须掌握的三十道题 如果你能正确回答以下问题并理解相关知识点原理,那么你就可以算得上是基本合格的Linux内核开发工程师,试试看! 1) Linux中主要有哪几种内核 ...
- linux 内核开发_25年Linux内核开发中的9课
linux 内核开发 由于Linux内核社区在2016年庆祝了25年的开发历史,因此许多人向我们询问了该项目的长寿和成功秘诀. 我通常会开玩笑,说我们真的不知道如何到达这里. 在此过程中,该项目面临许 ...
- Linux学习总结(68)——Linux 30年专访:Linus Torvalds谈Linux内核开发与Git
三十年前,当Linus Torvalds(林纳斯·托瓦兹,下文统称Linus)首次发布Linux内核时,他还是赫尔辛基大学(University of Helsinki)的一名21岁的学生,他宣布说: ...
- Linux 30年专访:Linus Torvalds谈Linux内核开发与Git
作者 | Jeremy Andrews 译者 | 火火酱,责编 | Carol 出品 | CSDN(ID:CSDNnews) 三十年前,当Linus Torvalds(林纳斯·托瓦兹,下文统称Linu ...
- 嵌入式Linux内核开发工程师必须掌握的三十道题
如果你能正确回答以下问题并理解相关知识点原理,那么你就可以算得上是基本合格的Linux内核开发工程师. 1. Linux中主要有哪几种内核锁?(进程同步与互斥) (1)自旋锁:非睡眠锁 (2)信号量: ...
- 如何进行linux内核开发,2. 开发流程如何工作 — The Linux Kernel documentation
2.1.总览¶ 内核开发人员使用一个松散的基于时间的发布过程,每两到三个月发布一次新的主要 内核版本.最近的发布历史记录如下: 4.11 四月 30, 2017 4.12 七月 2, 2017 4.1 ...
- 何为 Linux 内核开发,怎么学好 Linux 内核?
此文包含 Linux 系统的学习路径和书籍推荐. 我觉得学习 Linux 系统,内核驱动时,最开始只需要 'Know what, not know how '. 不用去探究细节,只需要知道整体的框架, ...
最新文章
- Debian6 Squeeze上安装xen
- sed搜索某行在行末追加_linux shell 用sed命令在文本的行尾或行首添加字符
- 这Hadoop分布式文件系统
- 死磕java concurrent包系列(六)基于AQS解析信号量Semaphore
- 深入理解Activity启动流程(二)–Activity启动相关类的类图
- android封装oauth2,Android AccountAuthenticator和OAuth2
- Django:快速搭建简单的Blog
- Linux环境下实现unsigned char*向string的转换
- Node 中用 ESLint 验证代码
- 十分钟一起学会ResNet残差网络
- myBatis + SpringMVC上传、下载文件
- HDU-5889 Barricade
- linux下启动jboss脚本,Linux下配置JBoss自动启动
- 《深入解析Windows操作系统第4版》随笔记录03
- NOIP总结与反思及对今后的期望
- Epicor10自定义更新
- 深入了解现代 Web 浏览器(第 4 部分)【合成器线程详解】
- 范冰:增长黑客入门训练营
- 中标麒麟linux配置网卡,中标麒麟Linux v7系统下设置双网卡bond或team绑定详细过程...
- android身高控件_android 测身高标准体重 示例源码
热门文章
- j循环赋予li id_《Science》子刊:超强Li-S电池诞生!硫负载量高达15mg·cm-2
- android 点赞动画_Android MotionLayout动画:续写ConstraintLayout新篇章
- python opencv识别点个数_python+OpenCV 特征点检测
- 最详细 Spring Boot 入门(-)
- 航空航天工程用不用学c语言,2020年北京航空航天软件工程991答疑
- update mysql.user set password_使用update命令来修改Mysql的root密码
- R语言ggplot2画图3
- 数据挖掘、数据分析、人工智能及机器学习课程资源
- python爬虫设计思路_python网络爬虫(9)构建基础爬虫思路
- 查看php-fpm进程数_查看php-fpm开启的进程数以及每个进程的内存限制