严格来说,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构建逻辑理解的更多相关文章

  1. 【MM系列】SAP库龄报表逻辑理解

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP库龄报表逻辑理解   第一篇 ...

  2. 【MM系列】SAP SAP库龄报表逻辑理解

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP SAP库龄报表逻辑理解   ...

  3. [C# 基础知识系列]专题七: 泛型深入理解(一) (转载)

    引言: 在上一个专题中介绍了C#2.0 中引入泛型的原因以及有了泛型后所带来的好处,然而上一专题相当于是介绍了泛型的一些基本知识的,对于泛型的性能为什么会比非泛型的性能高却没有给出理由,所以在这个专题 ...

  4. LVS专题-(3) 虚拟ip理解

    1.虚拟IP是什么? 要是单讲解虚拟 IP,理解起来很困难,所以干脆把 动态 IP .固定 IP .实体 IP 与虚拟 IP都讲解一下,加深理解和知识扩展 实体 IP:在网络的世界里,为了要辨识每一部 ...

  5. docker 镜像构建上下文理解

    原文 写得贼好,特别鸣谢,哈哈 如果注意,会看到 docker build 命令最后有一个 . . . 表示当前目录,而 Dockerfile就在当前目录,因此不少初学者以为这个路径是在指定 Dock ...

  6. 数据分析 | 数据可视化图表,BI工具构建逻辑

    本文源码:GitHub·点这里 || GitEE·点这里 一.数据可视化 1.基础概念 数据可视化,是关于数据视觉表现形式的科学技术研究.其中,这种数据的视觉表现形式被定义为,一种以某种概要形式抽取出 ...

  7. Java技术专题之JVM逻辑内存回收机制研究图解版

    一.引言 JVM虚拟机内存回收机曾迷惑了不少人,文本从JVM实现机制的角度揭示JVM内存回收的原理和机制. 一.Java平台逻辑架构 二.JVM物理结构 通过从JVM物理结构图我们可以看到: 1.JV ...

  8. 【WPF学习】第五十八章 理解逻辑树和可视化树

    在前面章节中,花费大量时间分析了窗口的内容模型——换句话说,研究了如何在其他元素中嵌套元素,进而构建完整的窗口. 例如,考虑下图中显示的一个非常简单的窗口,该窗口包含两个按钮.为创建该按钮,在窗口中嵌 ...

  9. 安卓开发经验分享:资源、UI、函数库、测试、构建一个都不能少(转)

    除了高超的武艺,每位黑忍者还需要装备最好的武器.在软件开发的世界里,好的工具能让我们的生活变得更轻松,在更短的时间里写出更棒的代码. 时光回到2008年,那时安卓还很年轻.只有几个相关的博客和谷歌官方 ...

随机推荐

  1. kafka manager遇到的一些问题

    1.启动后第一个报错如下: [error] k.m.a.c.BrokerViewCacheActor - Failed to get broker metrics for BrokerIdentity ...

  2. linux中软连接和硬链接的区别

    linux中创建软连接和硬链接的方法: 软连接: ln -s oldfile slink 硬连接: ln oldfile hlink linux中创建软连接和硬链接的区别:        原理上,硬链 ...

  3. HTML5: HTML5 表单元素

    ylbtech-HTML5: HTML5 表单元素 1.返回顶部 1. HTML5 表单元素 HTML5 新的表单元素 HTML5 有以下新的表单元素: <datalist> <ke ...

  4. 82、TensorFlow教你如何构造卷积层

    ''' Created on 2017年4月22日 @author: weizhen ''' import tensorflow as tf #通过tf.get_variable的方式创建过滤器的权重 ...

  5. 仿flask写的web框架

    某大佬仿flask写的web框架 web_frame.py from werkzeug.local import LocalStack, LocalProxy def get_request_cont ...

  6. 21. Blog接口开发

    一般的系统由登录.增删改查所组成.我们的Blog同样如此.我们会开发登录.创建博客.删除博客.修改博客.查询博客等功能.话不多说,我们直接展开实践吧. 思路分析 创建项目.既然我们要创建一个blog, ...

  7. UML各种线的含义

    内容目录: 从一个示例开始 类之间的关系 时序图 附录:<图说设计模式> 看懂UML类图和时序图 这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关系: 能看懂类图中各个类之 ...

  8. python tkinter 实现 带界面(GUI)的RSA加密、签名

    代码环境,python3.5.2 RSA加密的过程是:使用公钥加密,私钥解密 RSA签名的过程是:使用私钥签名,公钥验证 所以核心代码就是,生成公钥私钥,使用公钥私钥分别进行加密解密. 在实际编码的时 ...

  9. 暴力穷举zip、rar压缩文件的密码

    生成密码的方式类似与时钟,末尾遍历完了第k位所有的字符,就让第k位的前一位到下一位字符,第k位回到第0个字符. 对python还不太熟悉,效率比较低,但是能破解简单的密码. import zipfil ...

  10. mysql-视图及索引简介

    一.视图的创建.作用及注意事项 1.创建:create view 视图名 as select 语句: 2.删除:drop view 视图名 3.作用: 数据库视图允许简化复杂查询 数据库视图有助于限制 ...