当前板子使用设备树启动内核,如果采用UEFI+ACPI模式启动该如何实现
1,RISCV架构的ACPI表是否有参考的源码
2,在UEFI中如何添加ACPI表
3, 如何在内核中启用ACPI表
我吐槽一个:
ACPI 表和 dtb 有啥区别?
无非一个是 UEFI 即时生成的,一个是硬件本身设计时写好的。
在嵌入式系统上,这俩有什么区别?基础硬件不会更换 ACPI 表的动态意义根本就没有。
而随着技术发展,CPU 自己带的硬件控制器会越来越多,有越来越多的外设会变成通用总线的设备。这种情况下 ACPI 表和 dtb 树数据也没啥意义。这些通用总线上的设备,完全可以让操作系统自己启动后再去初始化硬件获取硬件信息。
尤其是 x86 这种 CPU ,甚至于内存都可以作为这种 CPU 的外设。UEFI/BIOS 存储设备也都快可以作为外设而存在了。
标准化和分工,BIOS做抽象和提供统一接口,os负责调用
实际情况是 UEFI 和 BIOS 是两码事,BIOS 是尽可能小的硬件初始化,运行状态和技术上不允许有更多的功能。
但是到了 UEFI ,这东西功能十分强,强大到他有自己的整套操作系统必须的功能,以及需要有对应的驱动。
这个状态下的 UEFI ,你不觉得功能和结构上和 Linux 冲突了吗?
所以现在还有条技术路线是 Linux As UEFI。也就是直接让 Linux 内核成为 UEFI 的内核直接去做 UEFI 的事情。
更何况,现在的操作系统,已经全都给硬件做抽象化统一访问了。x86 下面的 BIOS 提供的 INT 调用也很早也已经被操作系统替代了。
而且现在的趋势,其实是硬件访问函数库化,甚至程序直接访问不调用函数库(忘了这个路线叫什么,类似于裸金属,不过这是裸金属之前的只针对配件硬件的技术),让软件直接去访问硬件来进一步提高性能。
只要不是一家生产整个计算机那么标准是很有必要的,这也是UEFI BIOS取代LEGACY BIOS的首要原因(不是你想的功能强不强大问题)。嗯,你说的很正确,如果需要OS可以做BIOS所做的一切事情,但是为什么放到BIOS里面做,因为OS不可能为每个主板出一款镜像的,这些事情放到BIOS做,BIOS提供标准的接口给OS,那么OS就可以做成通用的。
标准和 UEFI 有什么关系?BIOS 一样是标准。
还有,能不能先把 BIOS 和 UEFI 分开在讨论?
UEFI 可不是那么简单的提高标准接口的事情。
更何况我前面说了,操作系统会自己接管硬件,并不靠 UEFI/BIOS 提供硬件接口。
还有你是不是把硬件虚拟化给混淆了?
现在有个趋势是,操作系统被放到虚拟机里面运行,而计算机启动的时候,直接启动一个硬件级的虚拟机。这样这个虚拟机才需要一个相对功能完善的小型标准接口给操作系统继续启动。
嗯嗯你是对的
这里的讨论完全跑题了。UEFI有其使用的场景,它不适合你不代表就没有用。有关于RISC-V的部分参考
UEFI不代表ACPI,device-tree 或者ACPI都可以。
RISC-V不能仅限于嵌入式,还有PC和服务器市场,如果要想在这两个市场占据一席之位,尤其是服务器市场,因其涉及到了RAS,个人感觉ACPI还是很有必要的。别喷我,喷我就是你对
回归主题。目前国内RISC-V服务器厂商已经开始采用UEFI+ACPI的方式了。楼主可以研究下他们的代码
是的,开发板就是用来学习的,不能自己给自己设限。
另外问一下有没有你说的代码链接
你就搜一下 RISC-V 服务器厂商,应该就能得到想要的结果~
这其实就一句问题:UEFI 到底是什么?
这个问题其实不是 UEFI 和 BIOS 的差异问题。这是一个更上层实现的技术方案路线的事情。
现在很多人认为 UEFI 做的太多了,导致和操作系统重叠。
而 ACPI ,其实问题核心是这个东西到底应该怎么提供硬件信息。预先写入 ROM ,这东西和 device tree还有啥区别?而访问硬件获取,为什么还要 UEFI 读取后再传递给操作系统而不是让操作系统直接访问硬件获取,这和 device tree 还有啥区别?
而这里面其实核心就在于 UEFI 地位问题,ACPI 还是 dtb 其实只是附生问题。
但是一说到这件事,就很多人只关注 ACPI 和 dtb ,而没人关注真正引起问题的其实是 UEFI 。
国内的ARM厂商在进军服务器市场的时候,为啥要抛弃Device Tree改用ACPI,ACPI的作用可不仅仅是提供硬件信息吧?
确实,在硬件驱动上,linux有的驱动,UEFI也有,这是重复了。但是别忘了还有一点,就是安全问题,如何确保当前机器进入的OS,是一个合法的OS?总得有个东西去校验OS的合法性,不能OS自己校验自己吧
当然 ACPI 提供的东西更多。但是我前面说了,问题点其实根本不在这里。
校验并不需要 UEFI 才能实现。实现方法有很多,比如有些 CPU 在启动之前还会有个内嵌固件启动阶段,这个阶段载入系统的时候,可以进行一次校验。这个步骤其实就是启动 UEFI 的步骤,变成了启动 Linux 而已。安全问题上,UEFI 总不能自己校验自己吧?
而 Linux 本身也可以加入一个二级校验机制,现在 Linux 的压缩内核,其实就是前面有个自解压过程,只要保证这部分解压程序安全可靠,它可以再去解压缩内核本体的时候同时进行安全校验。
当然还有其他路线,比如内核存到专属的存储器上,存储器的写入和读取,都依赖控制器校验数据。