专题:LFS构建逻辑理解
严格来说,LFS只能称为“pseudo LFS”,WHY?
因为LFS归根结底,还是基于已有的操作系统平台构建而来,并非真正的从0开始,它没有突破所谓“鸡与蛋”的死循环;但它确实有助于理解Linux的运行机理,通过刻意营造一个尽可能接近于原始状态的最小运行环境,给用户一种“接近从0开始”的系统DIY体验。
一、必须理解的概念
C的编译与链接,是一个将源代码转换成可在硬件上运行的程序的过程,从源代码到程序执行,通常需要5步:预编译、编译、汇编、链接、动态加载(动态链接)。编译是把人类编写的程序代码“翻译”成机器可理解的二进制代码的过程,但此时生成的结果通常不能独立运行,需要链接器将二进制文件与必要的库文件链接在一起,才能生成最终的可执行程序。
pre-compilier:通常用于清理源代码中的仅为迎合人类逻辑而添加的,但对机器无用的部分;
compilier:将预编译器处理过的人类代码转换成二进制或汇编代码;
assembler:将原始或经编译器转换生成的汇编代码,转换成二进制机器代码;
linker/loader:将编译器或汇编器生成的二进制文件链接在一起,形成最终的可执行代码;
动态加载器:将可执行程序加载到内存并进行执行。
二、系统构造思路
首先,基于一个现有的Linux系统,制造出可用于后续逐层向上制造“新Linux组件“的最小的工具集——Linux系统基本四件套“Gcc+Binutils+Glibc+Kernel”,因为初始的Kernel可以借HOST机的一用,这有助于营造尽可能接近于0的原始环境,因此,只需要构造出一套经过最大“阉割”但仍保有最基本“繁衍”能力的剩下的那“三件套”即可。
当然,“四件套”并不能独立生成所有软件,往往还需要其它一些附加组件,可是刚开始没有怎么办?跟“四件套“的产生逻辑一样,先借用HOST机的组件,生产出一套中间半成品,继而生产出想要的产品。
为了有助于理解,这里讲一个简短的故事。
有个人想要一个已经成年的孙子,怎么办?要生孙子,必须要先有儿子啊!但这个儿子只是个过渡品,生完孙子之后他就挂了(故事情节比较残忍。。。)。
LFS就是孙子,HOST机就是爷爷,中间的那个临时的简陋工具链(toolchain)就是儿子。等这个孙子长大了,这个爷爷对外声称,孙子是他用最先进的技术,用一堆“自然界最基本单位”一个一个拼装而成的。这显然对人形成了误导!确实是爷爷把孙子从婴儿养大成人的,但孙子从“自然界最基本单位”到婴儿这个过程,爷爷是没参与的,也就是说这个爷爷是不知道孙子在分子、原子层面的组成结构的。
看到这里,相信大家都理解LFS是怎么回事了。
三、系统构造过程
以前我一直没想通的一个问题:“为什么各个Linux发行版的文件布局都不同”?
学习了LFS之后,知道这是在各个软件“制造”的过程中,通过GNUMakefile(或Makefile或makefile)按照“统一的逻辑”指定的,这“统一的逻辑”是由发行版各自的软件包管理机制或架构(如yum、apt、portage、yast等)决定的,这就是为什么几乎每个Linux发行版都有一个软件仓库,却互相不能直接通用的原因。
学习LFS确实有助于加深对Linux的理解,但远远不足以达成所谓“了解Linux系统底层”的境界。
专题:LFS构建逻辑理解的更多相关文章
- 【MM系列】SAP库龄报表逻辑理解
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP库龄报表逻辑理解 第一篇 ...
- 【MM系列】SAP SAP库龄报表逻辑理解
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP SAP库龄报表逻辑理解 ...
- [C# 基础知识系列]专题七: 泛型深入理解(一) (转载)
引言: 在上一个专题中介绍了C#2.0 中引入泛型的原因以及有了泛型后所带来的好处,然而上一专题相当于是介绍了泛型的一些基本知识的,对于泛型的性能为什么会比非泛型的性能高却没有给出理由,所以在这个专题 ...
- LVS专题-(3) 虚拟ip理解
1.虚拟IP是什么? 要是单讲解虚拟 IP,理解起来很困难,所以干脆把 动态 IP .固定 IP .实体 IP 与虚拟 IP都讲解一下,加深理解和知识扩展 实体 IP:在网络的世界里,为了要辨识每一部 ...
- docker 镜像构建上下文理解
原文 写得贼好,特别鸣谢,哈哈 如果注意,会看到 docker build 命令最后有一个 . . . 表示当前目录,而 Dockerfile就在当前目录,因此不少初学者以为这个路径是在指定 Dock ...
- 数据分析 | 数据可视化图表,BI工具构建逻辑
本文源码:GitHub·点这里 || GitEE·点这里 一.数据可视化 1.基础概念 数据可视化,是关于数据视觉表现形式的科学技术研究.其中,这种数据的视觉表现形式被定义为,一种以某种概要形式抽取出 ...
- Java技术专题之JVM逻辑内存回收机制研究图解版
一.引言 JVM虚拟机内存回收机曾迷惑了不少人,文本从JVM实现机制的角度揭示JVM内存回收的原理和机制. 一.Java平台逻辑架构 二.JVM物理结构 通过从JVM物理结构图我们可以看到: 1.JV ...
- 【WPF学习】第五十八章 理解逻辑树和可视化树
在前面章节中,花费大量时间分析了窗口的内容模型——换句话说,研究了如何在其他元素中嵌套元素,进而构建完整的窗口. 例如,考虑下图中显示的一个非常简单的窗口,该窗口包含两个按钮.为创建该按钮,在窗口中嵌 ...
- 安卓开发经验分享:资源、UI、函数库、测试、构建一个都不能少(转)
除了高超的武艺,每位黑忍者还需要装备最好的武器.在软件开发的世界里,好的工具能让我们的生活变得更轻松,在更短的时间里写出更棒的代码. 时光回到2008年,那时安卓还很年轻.只有几个相关的博客和谷歌官方 ...
随机推荐
- 未来-YLB-二手市场:二手市场
ylbtech-未来-YLB-二手市场:二手市场 1.返回顶部 1. 二手市场是人们将闲置不用的物品集中起来进行交换.交易的场所.在二手市场中买卖二手物品,价格低廉.二手交易市场又称跳蚤市场. 中 ...
- Java第四次作业,面向对象高级特性(继承和多态)
Java第四次作业-面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能,说 ...
- Git 设置和取消代理(SOCKS5代理)
设置代理 git config --global http.proxy 'socks5://127.0.0.1:1080' git config --global https.proxy 'socks ...
- JVM内存图
- Pandas数据处理 学习
pandas是在numpy的基础上建立的新程序库,提供了一种高效的DataFrame数据结构. DataFrame本质上是一种带行标签和列标签.支持相同数据类型和缺失值的多维数组. 先看版本信息: p ...
- Myeclipse中dtd代码提示
1.Myeclipse -->窗口 --> 首选项 2.输入xml c,然后添加 3.输入键 例如:http://struts.apache.org/dtds/struts-2.3.dtd ...
- 代码编译与反编译 (.py文件与.pyc文件互转)
# 将.py文件转化为.pyc文件,实现代码隐藏的需要,转化后的.pyc文件将在当前目录的__pycache__文件夹下. # .pyc文件的使用与.py文件的使用相同. .py -> .pyc ...
- Git中crlf自动转换的坑
新上手一个项目,克隆了代码下来搭环境,一路坑.其中一个sh脚本执行不了,报IOException,java日志除了"找不到文件或文件夹"之外看不出任何信息,手动运行脚本才发现是脚本 ...
- python 爬取拉勾网
import requestsimport randomimport timeimport osimport csvimport pandas as pdreq_url = 'https://www. ...
- vue 表单校验报错 "Error: please transfer a valid prop path to form item!"
vue 表单校验报错 "Error: please transfer a valid prop path to form item!" 原因:prop的内容和rules中定义的名称 ...