Kernel可以搭配不同的bootloader,uboot只是bootloader的一种,如果需要kernel不初始化Bootloader初始化过的硬件其实是可以做到的,但是增加了耦合。在定制化的启动流程中是可以做的,但是目前没有一种通用的设计能在bootloader 跳转过程中把所有初始化的配置共享,虽然现在都可以使用相同的dts来初始化,但是要做到兼容还是需要一定的改动,目前也没有看到两者硬件初始化整合的迹象,可能唯一启动速度的提高并不是主要推动的动力。补充关键的一点,内存管理方式的不同是关键,除非两个部份能共享存储初始化信息的内存,技术上能做到,但是太客制化了,不是一个通用解决方案。找到其他再补充……
驱动程序的侧重点不同,API/ABI也不兼容。
这是两个不同的启动阶段,每个阶段都有适用于自己的驱动程序。每个阶段的程序本身也可以完全不同。并且即便同一阶段也可能存在不同的程序,比如u-boot与grub都是bootloader阶段的程序。
当然,目前也有你描述的实现方式,比如UEFI Firmware service,RISC-V的opensbi等。它们都是在引导进入主操作系统后,仍然在运行的上一阶段的服务程序。它们与主操作系统之间的通信是通过特殊的系统调用指令,一般效率不高,并且限制较多(严格的标准规范)。一般用于特殊的控制逻辑(比如关机控制)。
uboot和kernel各做各的事。uboot能在各种情况下把kernel加载就完成任务了,操心太多没用。同样,kernel再强大,也没必要做uboot的工作。
驱动不只是用来初始化硬件设备。CPU进入OS之后uboot程序就不运行了,OS没法用uboot的驱动来响应应用层的请求。