You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 18:56:18