Linux 드라이버는 UEFI 펌웨어에서 제공하는 기능을 어떻게 호출합니까?

Linux 드라이버는 UEFI 펌웨어에서 제공하는 기능을 어떻게 호출합니까?

저는 업무용 컴퓨터 아키텍처에 대해 더 많이 배우고 있으며 방금 ACPI를 마쳤습니다. 다른 엔지니어들과 이야기하면서 NVMe와 같은 것에 대해 내가 이해한 바는 OEM이 UEFI NVMe 드라이버를 갖게 되지만 부팅 후에는 OS 드라이버가 해당 기능을 대신하게 된다는 것입니다.

부팅 프로세스 중에 Linux는 UEFI 드라이버를 활용한 다음 로드되면 자체 드라이버로 교체합니다.

내 질문은 소스 코드가 어떻게 생겼는지입니다. 예를 들어, 내가 보고 있는 것은NVMe 소스 코드.

펌웨어가 Linux 드라이버가 호출해야 하는 일부 표준 기반 인터페이스를 노출해야 한다고 가정합니까? (ACPI?)

답변1

오늘날 외부 장치는 일반적으로 PCIe입니다. 각 PCIe 장치에는 자체 PCIe 구성 공간이 있으며 브리지되지 않은 장치의 경우 이 공간의 헤더는 다음과 같습니다.

PCIe 구성 공간

BIOS(또는 UEFI)의 주요 작업 중 하나는 각 PCIe 장치 Base Address Registers(=BAR)에 필요한 메모리 양을 묻고 해당 영역을 CPU 메모리 어딘가에 예약하고 해당 영역의 시작 주소를 다시 쓰는 것입니다.

운영 체제가 부팅되면 각 장치의 PCIe 구성 공간의 Vendor ID값을 확인 Device ID하고 해당 정보를 기반으로 적절한 드라이버를 설정합니다. 드라이버는 BIOS(UEFI)가 작성한 BAR 레지스터에서 값을 읽고 해당 메모리(또는 io)를 사용합니다.

따라서 보시다시피 장치 드라이버에서 UEFI 서비스를 요청하지 않고 기본 정보가 장치 자체에 기록됩니다.

Linux API의 경우 이러한 BAR과 함께 사용할 수 있는 여러 기능이 있습니다. 예를 들어 다음을 확인해 보세요.

unsigned long pci_resource_start(struct pci_dev *dev, int bar);
unsigned long pci_resource_end(struct pci_dev *dev, int bar);
unsigned long pci_resource_flags(struct pci_dev *dev, int bar);

또는

int pci_request_region(struct pci_dev *pdev, int bar, const char *res_name)

더 완전한 문서를 보려면 Linux Device Drivers다음 책을 참조하세요. https://www.xml.com/ldd/chapter/book/ch15.html

또는 PCI에 대한 커널 문서:

https://www.kernel.org/doc/html/latest/driver-api/pci/pci.html#c.pci_request_region

https://www.kernel.org/doc/html/latest/PCI/pci.html

관련 정보