Linux kernel 如果将Linux用作裸机代码的引导加载程序,PCIe设备驱动程序是否有益?

Linux kernel 如果将Linux用作裸机代码的引导加载程序,PCIe设备驱动程序是否有益?,linux-kernel,embedded-linux,bootloader,pci-e,bare-metal,Linux Kernel,Embedded Linux,Bootloader,Pci E,Bare Metal,我正在PowerPC处理器上开发嵌入式系统,需要通过PCIe与FPGA进行通信。我希望使用Linux/embedded Linux作为引导加载程序,利用其PCIe初始化代码和驱动程序API简化PCIe驱动程序开发。然而,最终我希望运行裸机代码(没有操作系统运行)。因此,我正在考虑使用PetitBoot/kexec从Linux跳转到我自己的代码 这可能吗 我目前对PCIe驱动程序的理解使我相信,一旦设备初始化,只要我有一个指向地址空间的指针,我就应该能够直接执行指向内存空间的MMIO R/W操作。

我正在PowerPC处理器上开发嵌入式系统,需要通过PCIe与FPGA进行通信。我希望使用Linux/embedded Linux作为引导加载程序,利用其PCIe初始化代码和驱动程序API简化PCIe驱动程序开发。然而,最终我希望运行裸机代码(没有操作系统运行)。因此,我正在考虑使用PetitBoot/kexec从Linux跳转到我自己的代码

这可能吗

我目前对PCIe驱动程序的理解使我相信,一旦设备初始化,只要我有一个指向地址空间的指针,我就应该能够直接执行指向内存空间的MMIO R/W操作。因此,即使kexec覆盖了驱动程序代码,我也应该能够使用该设备,因为驱动程序已经完成了它的工作

这是正确的吗


如果没有,我的备选方案是什么?

我认为这种方法不是一个好主意。用Linux操作系统编写的驱动程序将假定操作系统的所有资源都可用,而不仅仅是内存分配。例如,它可以配置中断处理程序,但当操作系统不再可用时,您的硬件可能会挂起,因为没有任何东西在确认和服务其中断请求

我也对内存初始化持怀疑态度。我认为理论上可以分配一些DMA内存,并在裸机应用程序接管时将生成的物理地址传递给它,但整个过程似乎很粗略。在保持PCIe子系统运行的同时,很难确保Linux中的所有设备都干净地关闭。您必须查看驱动程序的关闭例程,并查看它对卡的作用,以确保它不会关闭设备并使其对您的裸机代码无响应


我建议您阅读基于Linux的驱动程序,并将其用作构建新裸机驱动程序的指南。复制您需要的初始化代码,并省略Linux特定的配置详细信息。

如果您需要裸机代码中的PCIe框架,也许您可以在u-boot中找到此类代码。感谢您的建议,我按照建议对u-boot进行了简短的研究。然而,我正在使用一个非常新的cpu,我不相信uboot是为它或我的主板配置的。我正在尝试解决的CPU/主板有一个定制的buildroot环境,“BIOS”引导嵌入式Linux,然后使用PetitBoot加载完整的Linux操作系统。因此,我考虑在嵌入式linux中添加一个设备驱动程序,并使用PetitBoot来加载我的裸机代码,而不是完整的linux操作系统。我的假设是定制uboot会重复buildroot的工作。谢谢您的回复。我同意你的建议开发裸机代码。