UEFI 之 RamDisk

概要

ramdisk一般指虚拟内存盘。虚拟内存盘是通过软件将一部分内存(RAM)模拟为硬盘来使用的一种技术;
EDK中支持ramdisk协议的gEfiRamDiskProtocolGuid,bootManage,httpboot使用;

UEFI中RamDiskDxe驱动

头文件位置:
MdePkg/Include/Protocol/RamDisk.h|104| extern EFI_GUID gEfiRamDiskProtocolGuid;

驱动位置:
MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskDriver.c

  //// Install the EFI_RAM_DISK_PROTOCOL and RAM disk private data onto a// new handle//Status = gBS->InstallMultipleProtocolInterfaces (&mRamDiskHandle,&gEfiRamDiskProtocolGuid,&mRamDiskProtocol,&gEfiCallerIdGuid,ConfigPrivate,NULL);if (EFI_ERROR (Status)) {goto ErrorExit;}

注册接口

//
// The EFI_RAM_DISK_PROTOCOL instances that is installed onto the driver
// handle
//
EFI_RAM_DISK_PROTOCOL  mRamDiskProtocol = {RamDiskRegister,RamDiskUnregister
};

提供了2个函数,一个用来注册 RAM Disk 的Register,一个用来销毁 RAM Disk 的 Unregister。对于我们来说,注册的函数是最重要的。

RamDiskRegister原型

ypedef
EFI_STATUS
(EFIAPI *EFI_RAM_DISK_REGISTER_RAMDISK) (IN UINT64                       RamDiskBase,IN UINT64                       RamDiskSize,IN EFI_GUID                     *RamDiskType,IN EFI_DEVICE_PATH              *ParentDevicePath     OPTIONAL,OUT EFI_DEVICE_PATH_PROTOCOL    **DevicePath);

注册一个Ram Disk 需要给定:
RamDiskBase: 新的 Ram Disk 的基地址
RamDiskSize: 新的 Ram Disk 的大小
RamDiskType: 新的 Ram Disk 的类型(似乎可以定义 ISO/RAW之类的)
ParentDevicePath: 指向父设备的 Device Path(不明白这个功能有什么意义)。如果没有可以设置为 NULL
DevicePath: 返回的创建的 Ram Disk 的 Device Path

RamDiskUnregister 原型

typedef
EFI_STATUS
(EFIAPI *EFI_RAM_DISK_UNREGISTER_RAMDISK) (IN  EFI_DEVICE_PATH_PROTOCOL    *DevicePath);///
/// RAM Disk Protocol structure.
///
struct _EFI_RAM_DISK_PROTOCOL {EFI_RAM_DISK_REGISTER_RAMDISK        Register;EFI_RAM_DISK_UNREGISTER_RAMDISK      Unregister;
};

RamDiskDxe驱动交互界面,在Device Manager->RAM Disk Configuration

> Create raw创建的是raw格式,这个格式在biso下显示的是BLK,无法直接使用;
Create from file可以选择镜像进行加载,可以选择fat镜像进行加载,这样的话在Shell下就可以看到FSx

制作镜像

采用dd命令生成的镜像文件(raw镜像,这个映射出来是FS0:)


dd if=/dev/zero of=~/hda.img bs=1 count=10M
mkfs -t vfat ~/hda.img
losetup /dev/loop0 ~/hda.img  #映射loop设备,要找不使用的;
sudo mount /dev/loop0 /mnt/image  #挂载loop设备
......(work in mnt dir)
umount /mnt/image              #卸载loop设备
losetup -d /dev/loop0           #解除loop映射

镜像转换成头文件

xxd -i hda.img  > diskimage-16MB.h

RamDisk应用

应用就是将上面的界面设置用代码实现;

步骤如下:

  1. 查找 RamDiskProtocol 是否安装,因为我们的应用需要协议的支持;
  2. 读取 “”MemTest.Img”到内存中,这是一个fat服务器的二进制镜像,为了在uefi shell中显示FSx必须要用fat镜像;
  3. 用 RamDiskProtocol 的 Register 函数将上面的内存注册为 Ram Disk

代码实现

#include <Uefi.h>
#include <Library/PcdLib.h>
#include <Library/UefiApplicationEntryPoint.h>
#include <Library/BaseLib.h>
#include <Library/UefiLib.h>
#include <Library/PrintLib.h>
// #include <Library/ShellCEntryLib.h>
#include <Protocol/RamDisk.h>
#include <Protocol/DevicePathToText.h>
// #include <Protocol/EfiShell.h>
// #include <Library/ShellLib.h>
#include "diskimage-16MB.h"extern EFI_BOOT_SERVICES         *gBS;
/*
EFI_GUID gEfiVirtualDiskGuid ={ 0x77AB535A, 0x45FC, 0x624B,{0x55, 0x60, 0xF7, 0xB2, 0x81, 0xD1, 0xF9, 0x6E }};*/
/**The user Entry Point for Application. The user code starts with this functionas the real entry point for the application.@param[in] ImageHandle    The firmware allocated handle for the EFI image.  @param[in] SystemTable    A pointer to the EFI System Table.@retval EFI_SUCCESS       The entry point is executed successfully.@retval other             Some error occurs when executing this entry point.**/
EFI_STATUS
EFIAPI
UefiMain (IN EFI_HANDLE        ImageHandle,IN EFI_SYSTEM_TABLE  *SystemTable)
{EFI_STATUS               Status;EFI_RAM_DISK_PROTOCOL    *RamDiskApp;EFI_DEVICE_PATH_PROTOCOL *DevicePath;// Look for Ram Disk ProtocolStatus = gBS->LocateProtocol (&gEfiRamDiskProtocolGuid,NULL,&RamDiskApp);if (EFI_ERROR (Status)) {Print(L"Couldn't find RamDiskProtocol\n");return EFI_ALREADY_STARTED;}//// Register the newly created RAM disk.//Status = RamDiskApp->Register (((UINT64)(UINTN) hda_img),sizeof(hda_img),&gEfiVirtualDiskGuid,NULL,&DevicePath);if (EFI_ERROR (Status)) {Print(L"Can't create RAM Disk!\n");return EFI_SUCCESS;}Print(L"Creat Ram Disk success!\n");return 0;
}

执行过程

FS0:\> RamDiskApp.efi
FSOpen: Open '\RamDiskApp.efi' Success
FSOpen: Open '\RamDiskApp.efi' Success
FSOpen: Open '\RamDiskApp.efi' Success
FSOpen: Open '\RamDiskApp.efi' Success
InstallProtocolInterface: 5B1B31A1-9562-11D2-8E3F-00A0C969723B 90000000F5ABBAC0
Loading driver at 0x90000000F1946000 EntryPoint=0x90000000F1946240 RamDiskApp.efi
InstallProtocolInterface: BC62157E-3E33-4FEC-9920-2D3B36D750DF 90000000F674C798
InstallProtocolInterface: 6A1EE763-D47A-43B4-AABE-EF1DE2AB56FC 90000000F2349EB0
ProtectUefiImageCommon - 0xF5ABBAC0- 0x90000000F1946000 - 0x0000000000A04180
InstallProtocolInterface: 752F3136-4E16-4FDC-A22A-E5F46812F4CA 90000000FE480998
InstallProtocolInterface: 964E5B21-6459-11D2-8E39-00A0C969723B 90000000F5AB91A8
InstallProtocolInterface: A77B2472-E282-4E9F-A245-C2C0E27BBCC1 90000000F5AB91D8
InstallProtocolInterface: 09576E91-6D3F-11D2-8E39-00A0C969723B 90000000F674C998
InstallProtocolInterface: CE345171-BA0B-11D2-8E4F-00A0C969723B 90000000F5AB9EA0
InstallProtocolInterface: 151C8EAE-7F2C-472C-9E54-9828194F6A88 90000000F5AB9EB8BlockSize : 512 LastBlock : 4FFF
InstallProtocolInterface: 964E5B22-6459-11D2-8E39-00A0C969723B 90000000F5A76030
Installed Fat filesystem on 90000000F5ABC918
Creat Ram Disk success!
FSOpen: Open '\' Success
FS0:\>
FS0:\>
FS0:\>
FS0:\>
FS0:\> map -r
Mapping tableFS0: Alias(s):HD1a0b:;BLK1:PciRoot(0x0)/Pci(0x5,0x1)/USB(0x0,0x0)/HD(1,MBR,0x37C937C8,0xFDF00,0x67A100)FS1: Alias(s):F0:;BLK2:VirtualDisk(0x90000000F1949D28,0x90000000F2349D27,0)BLK0: Alias(s):PciRoot(0x0)/Pci(0x5,0x1)/USB(0x0,0x0)
FSOpen: Open '\' Success
FS0:\> 

具体代码

https://github.com/90geek/RamDiskApp

之后应用

有了RamDisk后我们就可以结合tftp或者http工具远程获取文件,无需用U盘进行导入导入导出了,后面我出一个关于应用的文档。

参考文档

http://www.lab-z.com/stu132rd/
http://www.lab-z.com/utrad/
https://github.com/rcpao-enmotus/RamDiskPkg

uefi 之 ramdisk相关推荐

  1. 美团外卖:日订单量超1600万的自动化业务运维之路

    背景 美团外卖业务在互联网行业是非常独特的,不仅流程复杂--从用户下单.商家接单到配送员接单.交付,而且压力和流量在午.晚高峰时段非常集中.同时,外卖业务的增长非常迅猛,自2013年11月上线到最近峰 ...

  2. UEFI 基础教程 (一) - 基于QEMU搭建UEFI开发环境(win/linux)

    一.EDKII windows 环境搭建 1. 下载UEFI开源代码 cmd进入C盘根目录,git clone https://github.com/tianocore/edk2.git edkii ...

  3. UEFI 之 UFS Recovery模式下载

    一.概述 UFS Recovey 模式是一种特殊下载模式,就是在UFS为空片(做过全盘erase操作或者说UFS没有数据)的情况下,将系统镜像下载到UFS Devices. 二 . 开发环境 平台 H ...

  4. Arch linux uefi 启动盘,用UEFI安装ArchLinux 20140105

    为了在E431上用UEFI安装Arch一个晚上重装了5,6次系统,整整做了一个通宵,还好是周六.今天刚好有时间正好 来总结一下.因为要用UEFI来安装,所以安装了两次之后发现UEFI环境变量不可用(用 ...

  5. IBM X3850 X5 7143QEB 安装Proxmox 5 初始化ramdisk失败,服务器卡死问题处理方法

    服务器:IBM X3850 X5 7143QEB 预安装系统:Proxmox VE 5.2 问题描述: 在安装PVE时,到Loading initial ramdisk...界面时不能正常进行到下一个 ...

  6. Is there a way to enable UEFI support in KVM

    文章目录 install ovmf use kvm with Virtual Machine Manager virt-install install ovmf lwk@qwfys:~$ apt in ...

  7. 统信UOS从虚拟机(BIOS引导)迁移到本机物理机加UEFI改造

    统信UOS从虚拟机(BIOS引导)迁移到本机物理机加UEFI改造 1.工具和资料 参考资料:https://wiki.archlinux.org/index.php/GRUB_(%E7%AE%80%E ...

  8. easyuefi只能在基于uefi启动的_systemd时代的开机启动流程(UEFI+systemd)

    本文内容预告: 开机启动流程图预览 按下电源和固件阶段 内核启动阶段 内核启动后,用户登录前 计算机启动流程可以分为几个大阶段: 内核加载前 本阶段和操作系统无关,Linux或Windows或其它系统 ...

  9. 【Jetson Xavier NX】Jetson Xavier NX的UEFI 的配置详解

    环境 硬件:Jetson Xavier NX 套件 系统:Ubuntu 20.04 Bootloader:Jetson UEFI firmware (Version 1.0-d7fb19b bulit ...

最新文章

  1. 入职五年回顾(八) 2013年3月
  2. Spark任务提交源码
  3. java基础(六) switch语句的深入解析
  4. linux常用命令:wget 命令
  5. 关闭或开启memory_target
  6. 计算机数据库基础知识笔记,计算机基础及技巧(我的电脑笔记,适合新手!包含使用电脑最基本的知识及DOS、网络及数据库等。)...
  7. pymysql安装_第八章 nova组件安装2
  8. Java常用设计模式————桥接模式
  9. 下列不是unix linux,下列软件中,不是操作系统的是______。A) LinuxB) UNIXC) MS-DOSD) MS-OfficeA.B.C.D._考题宝...
  10. OSChina 周六乱弹 ——用大脑直接写代码
  11. oracle中如何测试,Oracle数据库中如何正确的查看sql
  12. JAVA之JAR文件
  13. 产品和程序员的互殴大战
  14. medusa详细使用教程
  15. AD20的一些基本操作
  16. 小型水库雨水情测报设施建设-水库大坝水文监测
  17. 我家的三个犹太小富豪(转)
  18. 【云栖大会】一场7年后的狂欢,云栖大会除了“飞天”还有什么
  19. a and b a or b
  20. SourceTree安装使用

热门文章

  1. fread函数读二进制文件
  2. MX570怎么样 mx570显卡什么级别
  3. js的tofixed
  4. 【Mybatis】spring boot与vue的结合实现增删查改
  5. xp系统smb服务器,winxp系统访问nAs/samba服务器失败的操作办法
  6. iOS 页面悬浮按钮 可拖动、自动吸附屏幕边缘 (OC)
  7. 暑期实习第一面--阿里巴巴--算法工程师
  8. 【牛客网】Shopee的零食柜(代码)
  9. python-opencv边缘检测与人脸检测应用
  10. layui分页获取数据,回显checkbox