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系统底层”的境界。

时间: 2024-10-27 11:31:17

LFS构建逻辑理解的相关文章

Linux基本功杂记——[017]——LFS构建逻辑理解

严格来说,LFS只能称为“pseudo LFS”,WHY? 因为LFS归根结底,还是基于已有的操作系统平台构建而来,并非真正的从0开始,它没有突破所谓“鸡与蛋”的死循环:但它确实有助于理解Linux的运行机理,通过刻意营造一个尽可能接近于原始状态的最小运行环境,给用户一种“接近从0开始”的系统DIY体验. 一.必须理解的概念 C的编译与链接,是一个将源代码转换成可在硬件上运行的程序的过程,从源代码到程序执行,通常需要5步:预编译.编译.汇编.链接.动态加载(动态链接).编译是把人类编写的程序代码

java 业务逻辑理解

细说业务逻辑 2016年10月14日 07:16:28 阅读数:2295 细说业务逻辑   前言 记得几个月前,在一次北京博客园俱乐部的活动上,最后一个环节是话题自由讨论.就是提几个话题,然后大家各自加入感兴趣的话题小组,进行自由讨论.当时金色海洋同学提出了一个话题--"什么是业务逻辑".当时我和大家讨论ASP.NET MVC的相关话题去了,就没能加入"业务逻辑"组的讨论,比较遗憾. 其实,一段时间内,我脑子里对"业务逻辑"的概念也是非常模糊的.

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

公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP SAP库龄报表逻辑理解 前言部分 大家可以关注我的公众号,公众号里的排版更好,阅读更舒适. 正文部分 再贴2篇前辈的写的文章,供大家参考!第一篇: 存货帐龄和呆滞料分析 通常库存周转率高,则帐龄低,存货帐龄高将引起呆滞甚至废料,比如有保质期的食品和药品, 库存账龄超过保质期直接就是废物,某家企业呆滞料竟然高达2亿,对于利润率低

GL-关于日记账传入总账的逻辑理解

在EBS系统中,所有子模块或外部日记账都是需要传送至总账的.在R12中,根据传送的来源不同,则逻辑有不尽相同.目前就我理解的,列示如下,以供参考: 1.各子模块: 1.1 子模块创建会计分录后,会将信息存入xla中,如果勾选了'传送至总账',则系统会将数据由xla中插入接口表gl_interface,然后触发'导入日记账'请求,将数据从接口表中导入总账模块,同时删除接口表的数据.注意:无论是否导入成功,接口表中的数据都会删除(我们无法在接口表中看到从子模块传来的数据). 1.2 如果在子模块创建

如何构建逻辑清晰的可拖拽树的数据结构

在为知笔记上的每日计划已经有好几天没有写实际内容了,抓狂脸.时间真是过得超级快呀,这几天双十一,疯狂的看喜欢的东西和看快递.其实并不是为了双十一降价而买东西,而是近来本来就有买东西的打算,而且撞到了双十一前,那就干脆放购物车里好了,还有就是半年没见降价的零食也打折啦啦啦~~^_^.好喜欢双十一结束后淘宝的宣传片<再见双十一>,接下来的这个星期,就静静的等待幸福来敲门~ 言归正传,今天来分享一下关于如何构建数据结构使得页面逻辑更为清晰的思路. 事情的起因是这样的,boss安排我做一个列表拖拽页面

0220自学Linux_逻辑理解用户进程权限相关+理解文件内各字段(passwd,shadow,group)

11 内核是真正意义上的操作系统 库有动态库也有静态库,Linux的动态库是.so后缀的,也称为共享库 库是不能够独立运行的,只能被调用 Window的动态库是.dll后缀的 我们平时所谓的安装操作系统是装在硬盘上的 我们对于系统而言,最基本的程序就是shell,不然我们无法和系统交互,打开一个命令行窗口,就打开了一个shell进程 硬件之上的是内核,内核之上是进程 如果进程中他需要调用库,那首先启动这个程序,他的进程会把这个调用的库装入内存 ,而如果是共享库,其他进程调用的话就直接在内存调用这

docker 镜像构建上下文理解

原文 写得贼好,特别鸣谢,哈哈 如果注意,会看到 docker build 命令最后有一个 . . . 表示当前目录,而 Dockerfile就在当前目录,因此不少初学者以为这个路径是在指定 Dockerfile 所在路径,这么理解其实是不准确的.如果对应上面的命令格式,你可能会发现,这是在指定上下文路径.那么什么是上下文呢? ??首先我们要理解 docker build 的工作原理.Docker 在运行时分为 Docker 引擎(也就是服务端守护进程)和客户端工具.Docker 的引擎提供了一

Maven 打包 package install deploy-项目构建的理解

项目的构建理解 构建工具能够帮我们自动化构建过程,从清理.编译.测试到生成报告,再到打包和部署.我们只需要输入简单的命令(如 mvn clean install),Maven 就会帮我们处理繁琐的任务:它最大化的消除了构建的重复,抽象了构建生命周期,并且为绝大部分的构建任务提供了已实现的插件.比如说测试,我们只需要遵循 Maven 的约定编写好测试用例,当我们运行构建的时候,这些测试便会自动运行.除此之外,Maven 能帮助我们标准化构建过程.在 Maven 之前,十个项目可能有十种构建方式,但

重构 Rafy 在多线程环境下数据库连接与事务的构建逻辑