不点 发表于 2023-3-21 13:59:18

闲聊 Linux 操作系统的启动

在开发 grub4dos 的时候,就思考过这样的问题,只不过没有深入思考罢了。

这个话题也不是什么要紧的事情,因此,就算是闲聊吧。

进入正题。

Linux 操作系统,一开始貌似就把注意力放在 kernel 上了。kernel 的第一扇区,是引导代码。这也算是兼顾了操作系统的引导。我印象中,在教科书上,操作系统的引导,也属于操作系统的一个方面,或者说是一个步骤,或者说是一个部分,总之,也是不可缺少的。

单扇区的引导代码,针对 1.44M FAT 格式软盘的情况,因而不足以在不断发展的各种复杂场景下成功引导 Linux 内核。所以,这个单扇区引导代码,后来就废弃了。它还在那里放着,没有删除掉,但只是留在那里,不再起引导作用。

与微软作一对比。微软并未在内核里面放置引导代码。引导代码与内核是分开的。虽然由于外部的单扇区引导代码不足以引导 io.sys,微软不得不在 io.sys 的开头(以及 ntldr 的开头)添加一些引导代码用来辅助外部的单扇区引导代码,但是,这是另外一个话题了,因为这仅仅是一种权宜之计,用来 workaround 古老的 PC 启动规范(只有一个扇区用来引导,因此引导的能力薄弱);我们应该注意的是,微软一开始就没有让引导代码与内核合为一体。而 Linux 一开始就要合为一体,结果是以失败而告终(前面说了,那个扇区中的引导代码后来就废弃了)。从 FAT32 开始,微软把外部的引导代码从单扇区扩充为多扇区,这样就不需要在内核(io.sys 或 ntldr)的开头嵌入辅助引导代码了。这里姑且把 ntldr 也称为 “内核”,只不过微软的系统向前发展了,在 ntldr 这个类似于 io.sys 的 “内核” 之后,又要加载更大的内核(这个内核才被认为是真正的内核)。BIOS (或者 MBR 上的引导代码)仍然只加载 FAT32 的一个扇区(即 FAT32 的第一扇区),然而 FAT32 的第一扇区会负责加载后续的多扇区引导代码。至此,多扇区引导代码就能完整加载 io.sys 或 ntldr 了,不管它们的位置在哪里,也不管它们有没有碎片。

好了,这就明确了微软操作系统的引导步骤:第一阶段,负责加载 ntldr,第二阶段,由 ntldr 再 load(加载) 操作系统内核。

而 Linux 缺少了 ntldr 这个中间加载器,这就让第一阶段的 bootloader 的工作量加大了。而且,linux 内核开发者也不开发第一阶段的 boot loader,而是由 grub 团队(或者别的团队)来开发。在 grub4dos 的各种加载方法中,对 Linux kernel 的加载是最复杂的,消耗的代码最多。而对于(比如说)ntldr 的加载,那是非常简单、直接的:把 ntldr 放在内存中合适的位置(分区引导扇区也应放在 0000:7C00 的位置,因为 bpb 表中的数据,还要被后续引导过程使用),然后 jump(跳转)到 ntldr 的开头,就完成了。究其原因,我觉得,那正是因为 linux 缺乏一个像 ntldr 那样的中间加载器。而且,x86 的体系结构,由于历史原因,分成了实模式和保护模式、1M 以内和超过 1M 的处理步骤,这些都增加了加载过程的复杂度。Linux 的 kernel 通常是超过 1M 的,不像 ntldr 那样,体积控制在 500K 以内,可以完全放在实模式内存中。因此,我觉得,linux 本身应该增加一个类似于 ntldr 的功能文件,负责加载 Linux 内核,比如就叫做 knldr(kernel loader 的简写),或者 lxldr(linux loader),这样才算是比较完整的,或者说是完美的。如果这样实现了的话,那么外部加载器的工作量就大大减少了,只需像加载 ntldr 那样加载 knldr 就可以了。

有人说了,linux 内核开发者只负责开发内核,不负责开发引导代码的部分。这么说,倒也合乎逻辑。然而,那些 linux 操作系统的发行者,应该开发出一个类似于 ntldr 的中间加载器。不过,他们都没有开发。因此,这个任务,貌似还是应该由 linux 内核开发者来完成,才比较自然。

另外一个方面的考虑,从 BIOS 演变到 EFI,加载过程发生了变化。EFI 系统直接认识文件系统。这样的话,EFI 就是一个小型操作系统了。我觉得,它占用了硬件的 ROM 空间。虽然硬件不值钱了,可是,占用过多的代码,本身就形成一个庞大的系统,这里面不是钱的问题,而是可能隐藏更多恶意代码,成为国家安全的一个大问题了。甚至一个 CPU 里面都能放得下一个庞大的操作系统,这样,从制造者、控制者的角度来考虑,肯定是多多益善、何乐而不为?硬件不值钱,木马才有价。因此,我认为,EFI 主要不属于技术层面,而是属于谋略层面的。生产者们的想法都是一样的,都想着控制用户的一切。你生产的东西,成为木马,渗透到我的内部;我生产的东西,也得成为木马,渗透到你的内部。这样才能打个平手,否则就是一边倒的局势。所以,你作为生产者,发明出一个 EFI 来,那么,另外一个生产者也不傻,很快就能学会这个思路,也生产出一个 EFI++ 出来。到最后,大家互相之间,都没有信任可言,缺乏互信。互相消耗,正负抵消,在做无用功,白白浪费资源,技术本身在实质上并未进取,一切又回归原点了,从头再开始。从哲学上看,大致也就是这么一个循环往复的规律吧。当然,也可以认为,竞争(或斗争)是循环上升到更高层次了,而不是倒退到原点。


yyz2191958 发表于 2023-3-21 14:49:34

进来学习

szpcnt 发表于 2023-3-21 14:55:55

学习一下,谢谢分享

邪恶海盗 发表于 2023-3-21 15:17:59

围观一下,这种高级的问题不适合我...

879792799 发表于 2023-3-21 15:21:25

互相消耗,正负抵消,在做无用功,白白浪费资源,技术本身在实质上并未进取,一切又回归原点了

xunlei66 发表于 2023-3-21 16:39:07

感谢分享 学习一哈

2011whp 发表于 2023-3-21 17:31:40

EFI 即 BIOS向上提供的中间件(可以理解为虚拟机)
          需要 特殊的开发平台:   C语言 编译到efi代码

这个特殊平台可以 开发:winload.efi类似的程序
            efishell(类dos) 即是官方的示例,不过 BIOS一般默认不带了
               有点像:dos启动win95

旁观者清 发表于 2023-3-21 19:00:42

温故思新。感谢您的演讲。

邪恶海盗 发表于 2023-3-21 19:13:41

2011whp 发表于 2023-3-21 17:31
EFI 即 BIOS向上提供的中间件(可以理解为虚拟机)
          需要 特殊的开发平台:   C语言 编译到efi ...

还有个coreboot项目,号称挑战UEFI的,不知道现在进度咋样了,前几天还看到美帝良心想还刷了一波热度了....

不点 发表于 2023-3-21 20:54:21

如果有个 ntldr 之类的中间引导文件,其好处还有一些吧。这可以让外部引导加载器的加载代码更简化。用一个 “万古不变” 的代码,就可以加载 ntldr,不需要根据操作系统的加载参数,来调整加载代码。而调整操作系统的加载参数,则是属于 ntldr 自己的事情,而不是外部加载器要管的闲事。用 “万古不变” 的代码加载 ntldr,也不会因为操作系统的功能发生了变化,就需要更改、调整外部加载器的代码。外部加载器只需要有个固定代码用来加载 ntldr 便可,剩下的事情,是 ntldr 的事情。ntldr 本身可以随着操作系统的变化而更新。但只要 ntldr 的格式稳定,不发生突变,那么,外部加载器就不需要更改,而用 “万古不变” 的代码,就可以完成这个简单的任务。外部加载器不需要懂得 ntldr 是干啥工作的,只需要闭上眼睛,加载 ntldr,然后把控制权交给 ntldr 便可。微软所采用的这个分阶段加载方案,比较合理,值得其他操作系统开发者学习借鉴。

wintoflash 发表于 2023-3-21 21:34:48

发一个和帖子内容可能没啥关系的文章:
启动链条的逆行者:Chainload,Linux as UEFI Bootloader
https://zhuanlan.zhihu.com/p/615538211
https://github.com/osresearch/safeboot-loader

Climbing 发表于 2023-3-21 21:56:53

无论是引导扇区还是io.sys或者ntldr或者bootmgr,那都是windows的一部分。

同样的,grub也是linux操作系统的一部分。https://cdn.jsdelivr.net/gh/master-of-forums/master-of-forums/public/images/patch.gif

minchengan 发表于 2023-3-22 00:11:39

我就是一直在想,EFI引导会不会很不安全,EFI是不是必须得打开安全启动才能安全,EFI会不会感染病毒?有没有专门针对EFI引导文件的病毒,因为EFI从一开始就获得了所有的控制权(除了硬件层面,如CPU硬盘等)

不点 发表于 2023-3-22 07:04:17

“盲加载 ntldr” 或 “闭上眼睛加载 ntldr”,是 ntldr 方案的优越之处。只要知道 ntldr 的位置,加载了它,必要时,交换磁盘号码,让 ntldr 所在盘号为第一硬盘,这就 OK。而在 bootmgr 的情况,连交换磁盘的步骤都不需要了,bootmgr 自己能够适应盘符为 “非第一硬盘” 的情况。

对比一下 Linux 的情况,你虽然知道 vmlinuz 以及 initrd 的位置,可是你还是无法加载它们,因为它们还需要你填写一些命令行参数之类的。甚至于,vmlinuz 不一定就叫做这个名字,说不定叫做 linux,或者任意一个别的文件名。initrd 也不一定是这个文件名,说不定是 initrd.gz 或 initrd.lz 等其他名字,根本就没有规范来统一。你做不到 “盲加载”。

一个软件,一个操作系统,应该让别的软件能够方便地运行你,或加载执行你。这就是,提高了你与别的软件的 “互操作性”。相当于你修好了路,让别的车辆和行人能够方便地进入,与你做生意。相反地,如果你让别人翻山越岭、跨越沟壑来到你这里,那就不利于你与别人的交往。



烈焱焚天 发表于 2023-3-22 08:50:22

学习学习

jz886 发表于 2023-3-22 08:50:39

没有io.sys,pcdos.com也不会有今天的WINDOWS

2011whp 发表于 2023-3-22 11:35:35

引导 差不多:多阶段加载
      操作系统 基于硬件构造内核


bootx64.efi相当于 ntldr
   执行容易:在efishell下直接执行
                     grub类下   chainloader
                     bootmgfw.efi下,微软不开放

biso移交到 bootx64.efi的方法:(出bios启动菜单)
    UEFI标准:遍历 fat32分区的 efi\boot\bootx64.efi
    其它的:   三方软件可以 后期可以 配置bios(隐含在nvrom中的)



      
   
   

9527sss 发表于 2023-3-22 11:48:09

感谢分享

boaz199 发表于 2023-3-22 13:52:09

顶,谢谢楼主的劳动和分享!感谢你为论坛做出的贡献和对网友们的帮助!

Origami 发表于 2023-3-22 23:59:44


学习一下,谢谢分享

Origami 发表于 2023-3-23 02:00:40



学习一下,谢谢分享

caii 发表于 2023-3-23 02:40:33

感谢分享

南朝 发表于 2023-3-26 00:48:51

这些底层软件逻辑听起来云里雾里,楼主大哥想得很深

langyun 发表于 2023-3-26 10:50:25

xor启动,知道shimx64能启动deepin

仅此而已
可惜安装win时还得转回bcd,不然不能dism++安装win10

ypcok 发表于 2023-4-3 15:29:13

这个问题,不是杞人忧天。
现在的CPU里都有mini OS,所以真正做的安全,必须是完全从CPU做起。

不点 发表于 2023-4-4 10:48:09

我谈的有关学习NTLDR的方式来加载Linux内核的技术性观点,没有一个人明确表示赞同或反对。大家倒是都把注意力放在非技术的话题上了。既然这样,接下来就继续闲聊非技术性的问题吧。

在比较遥远的将来,也许不那么遥远,硬件可能要免费。在没实现之前,可以认为是胡诌。一个预测,如果不被认可,那就会被认为是胡诌。

谈点理由吧。

硬件不光是免费的问题,甚至是倒贴钱给你呢。或者以某种别的方式给你,比如说,买通你的上司,直接强加给你。

为什么会这样呢?

因为,硬件不值钱了,制造硬件的成本降低了。而真正值钱的,是硬件所携带的软件。对了,软件也不值钱,只有你不想要的软件才值钱。你早都猜到我说的软件是啥了:就是木马呀。木马对你不仅没有用处,而且是有害的。但对于生产者就不一样了,肯定对他有利呀。所以,这东西,最终会倒贴钱给你。在实现倒贴钱之前,会有个“廉价”或“免费”的过渡期。





wuwuzz 发表于 2023-4-4 12:42:44

本帖最后由 wuwuzz 于 2023-4-4 12:46 编辑

不用等到遥远的将来,现在就已经是这样。我是花钱换来的亲身体会,肉疼。

一套商用USB2协议分析仪(非国产、非开源产品),读者可以自行搜索价格得多少。包括二手的,
也是价格居高不下。(为什么不提USB3协议分析仪,那个更贵,10万、8万都是小意思)

分析仪硬件本身不贵,千元的数量级(比如$900),上位机软件(主程序UI)可以官网下载,但是,
协议分析模块是单独付费、另算许可的,贵就贵在协议分析模块上。许可费在万元数量级了
(比如$3000-$4000)。

为什么会这样,资本家是一帮什么鸟,举个类比例子你就知道原因。
1.你可以随时拷贝出U盘的512字节MBR(相当于分析仪硬件抓取USB包,价格不高)
2.但是,你要想让软件自动解释这512字节的含义,方便读者理解,就要付高昂的费用。
(相当于要解析出USB包的含义,价格十分昂贵)。

==============================================================================
我为什么要举USB分析仪的例子,因为它是目前唯一能够“直接”看到BIOS/UEFI-U盘间
会话的手段,是研究U启/G4D的利器。否则,我也不会花大价钱买这个了。

ypcok 发表于 2023-4-5 11:38:13

jz886 发表于 2023-3-22 08:50
没有io.sys,pcdos.com也不会有今天的WINDOWS

dos之前有CP/M,
苹果的也走了另外一条路

不点 发表于 2023-4-6 06:52:27

本帖最后由 不点 于 2023-4-6 09:36 编辑

硬件的制造,只要能够保持垄断,按说,应该是无忧的。原则上说,可以通过提价,来保持利润。然而,这里的问题是,硬件的销售,已处于饱和状态,只有百分之一的人,需要购买新硬件,而提价,则会遵从价格规律,遭到抵制,购买者会尽量减少购买。硬件的提价,其带来的利润很小。硬件突然提价一两倍,其带来的利润,不足以抵消软硬件一体化垄断体系庞大的开支。也不可能经常成倍成倍地提价。如果真的遵从价格规律进行提价,那么,硬件价格将十分昂贵,这会刺激其它黑马硬件厂商杀出来,形成竞争,这样垄断者就会失去垄断优势,这结果,不是他想要的。垄断者让硬件的制造,处于低利润、甚至赔本的状态,有助于遏制其它黑马硬件制造商的出现。实际上,垄断者会设法养活硬件制造商,他们在实质上是一个整体,而不是分立的。硬件制造商就相当于垄断者的一个部门。当然,从外观上,那是看不出来的。

硬件不提价,那就只能靠软件了。注意,不要把专有软件扯进来。普通大众不需要专业软件。这里谈的是整体大趋势,不是谈特例。

跟硬件的情况差不多,软件不是也不能提价吗?

软件与硬件的差别在于,硬件是物品,而软件是服务。服务的价格,大家知道,一碗面条值多少钱?其物质成本不高,但做成一碗面条,其服务就可能很贵了。

软件这种服务,从普通软件的情况来看,也像硬件一样,饱和了,掉价了。比如,一个记事本、便笺,就跟一个硬件一样,很普通。你要是把这些功能也提价,也没啥用处,只能破坏生态,刺激黑马早日出现。而专有软件,使用人数少,我们这里又不讨论、不涉及,就是说,忽略不计。

操作系统的技术进步又不可能天天都是突飞猛进,一直让大众处于亢奋状态。

就是说,软硬件都掉价了。

但要注意!硬件还是处于垄断状态,这一点没变。价是可以掉的,但垄断是不可以丧失的。

只要硬件以及软件还处于垄断、半垄断的状态,那就有办法获取利润。

网站强制你注册成为会员,就是获利的手段。将来把通用浏览器淘汰掉,只支持 app,这又是一个获利的手段。而把硬件或操作系统里面植入木马,也是获利的手段。

硬件、软件可能都不值钱了,但获利的手段,总是要有的,否则,这个产业体系就会崩塌,没人生产了。


sunsea 发表于 2023-4-7 08:36:11

正好最近在折腾G4E的启动linux,linux主线更换了加载方式(EFI Handover换成了loadfile2),又造成了一堆不兼容……只能说linux大概确实缺一个ntldr一样的东西,造成了十分麻烦的问题。不知道为什么linux开发者没有思考过这个问题。
页: [1] 2
查看完整版本: 闲聊 Linux 操作系统的启动