【问题标题】:How use UEFI locate_protocol in a rust project with r_efi crate如何在带有 r_efi crate 的 rust 项目中使用 UEFI locate_protocol
【发布时间】:2021-08-07 23:04:58
【问题描述】:

在一个带有 rust 和 crate r_efi 且没有 rust 标准库的交叉编译教育项目中,我想为 UEFI 系统制作一个小程序。目前,目标是能够使用图形输出协议。

通过使用 r_efi crate,我首先使用系统模块定位 GOP

r_efi::system::BootServices::locate_protocol

定义是:

locate_protocol: extern "win64" fn(_: *mut Guid, _: *mut c_void, _: *mut *mut c_void) -> Status

我的问题是这两个参数:

_: *mut c_void

_: *mut *mut c_void

我不知道如何像在 C 代码中一样返回 core::ffi::c_void 参数:

EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *systemTable) {
      EFI_BOOT_SERVICES *bs = systemTable->BootServices;
      EFI_GRAPHICS_OUTPUT_PROTOCOL *graphicsProtocol;
      EFI_STATUS status;

      status = bs->LocateProtocol(&GraphicsOutputProtocolGUID, NULL, (void**)&graphicsProtocol);

提前感谢您的解释。

【问题讨论】:

  • 引用可以被强制转换成指针,并且指针总是可以相互强制的。可以使用 &mut x as *mut T as *mut core::ffi::c_void 之类的东西获得一个 void 指针。
  • @RuifengXie:嗯,可以吗? &mut ptr::null() as *mut c_void ?但是,对于第二个参数,我真的不明白要返回什么。
  • 我不明白。在提供的 C 代码中,您将指针的地址传递给 EFI_GRAPHICS_PROTOCOL(强制转换为 void**)。但是现在你突然想要传递一个指向空指针的指针......我想在 Rust 中你也想要像 let mut graphics_protocol: *<the corresponding Rust type> = ptr::null_mut(); &mut graphics_protocol as *mut *_ as *mut *c_void 这样的东西。
  • 好的明白了。感谢您的帮助!

标签: rust ffi uefi


【解决方案1】:

好吧,这里有一个代码解决方案(在 virtualbox 上工作)用 r_efi crate 定位图形输出协议:

#[export_name = "efi_main"]
pub extern fn main(_h: efi::Handle, st: *mut efi::SystemTable) -> efi::Status {

     let mut gop: *mut efi::protocols::graphics_output::Protocol = ptr::null_mut();
     let mut guid_gop: efi::Guid = efi::protocols::graphics_output::PROTOCOL_GUID;

     let stats = unsafe { ((*(*st).boot_services).locate_protocol)(
            &mut guid_gop as *mut _,
            ptr::null_mut(),
            &mut gop as *mut _ as *mut *mut core::ffi::c_void,
     )};

     match stats {

        efi::Status::SUCCESS => {...},
        efi::Status::NOT_FOUND => {...},

     }

     efi::Status::SUCCESS
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-10
    • 2017-05-30
    • 2021-11-27
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多