如何使用Limine引导加载器获取磁盘信息?已尝试三类请求未成功
在Limine引导加载器中获取磁盘信息的正确方法
要获取磁盘数量、大小、类型等信息,你需要使用Limine提供的**limine_disk_request**接口,你之前尝试的limine_smbios_request、limine_efi_system_table_request、limine_module_request均不负责磁盘信息的传递,因此无法得到预期结果。
实现步骤
1. 定义并声明磁盘请求结构
首先需要在代码中定义Limine磁盘请求的结构体,并声明一个全局请求变量(必须放在指定段中,避免被编译器优化):
#include <stdint.h> // 对应Limine v8.x的磁盘结构体定义 struct limine_disk { uint64_t size; uint32_t type; uint32_t pci_bus; uint32_t pci_device; uint32_t pci_function; uint64_t guid[2]; uint8_t partition_type[16]; uint64_t partition_uuid[2]; uint32_t ahci_port; uint32_t nvme_controller; uint32_t nvme_namespace; uint32_t virtio_blk_device; } __attribute__((packed)); // Limine磁盘请求结构体定义 struct limine_disk_request { uint64_t id; uint64_t revision; struct limine_disk **disks; uint64_t count; } __attribute__((packed)); // Limine v8.x版本磁盘请求的固定ID #define LIMINE_DISK_REQUEST_ID 0x3dcc5a18b7992392 // 全局请求变量,放在.limine_requests段供Limine识别 static struct limine_disk_request disk_request = { .id = LIMINE_DISK_REQUEST_ID, .revision = 0 } __attribute__((used, section(".limine_requests")));
2. 在内核初始化时读取磁盘信息
Limine会在引导内核前自动填充disk_request的disks指针和count字段,你可以在内核入口函数中遍历这些磁盘结构获取信息:
void kernel_main(void) { // 检查Limine是否成功返回磁盘信息 if (disk_request.disks == NULL || disk_request.count == 0) { // 处理无磁盘的异常情况 return; } // 遍历所有磁盘,提取所需信息 for (uint64_t i = 0; i < disk_request.count; i++) { struct limine_disk *curr_disk = disk_request.disks[i]; // 磁盘总数:disk_request.count // 当前磁盘大小(字节):curr_disk->size // 当前磁盘类型:curr_disk->type(枚举值对应不同磁盘类型) switch (curr_disk->type) { case 0: // AHCI/SATA磁盘 // 处理AHCI磁盘逻辑 break; case 1: // NVMe固态硬盘 // 处理NVMe磁盘逻辑 break; case 2: // 虚拟磁盘(如QEMU virtio-blk) // 处理虚拟磁盘逻辑 break; // 其他类型可参考Limine文档的枚举定义 } } }
关键注意事项
- 必须使用正确的请求ID:
LIMINE_DISK_REQUEST_ID是磁盘请求的唯一标识,不能混淆其他请求的ID - 全局请求变量必须添加
__attribute__((used, section(".limine_requests"))),确保编译器不会优化掉该变量,同时让Limine能正确识别 - 确保你的代码与Limine v8.x版本兼容(与你查阅的文档版本一致),不同版本的请求结构可能存在差异
内容的提问来源于stack exchange,提问作者baponkar
相关产品推荐
相关产品推荐

