uefi 之 ramdisk
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应用
应用就是将上面的界面设置用代码实现;
步骤如下:
- 查找 RamDiskProtocol 是否安装,因为我们的应用需要协议的支持;
- 读取 “”MemTest.Img”到内存中,这是一个fat服务器的二进制镜像,为了在uefi shell中显示
FSx
必须要用fat镜像; - 用 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相关推荐
- 美团外卖:日订单量超1600万的自动化业务运维之路
背景 美团外卖业务在互联网行业是非常独特的,不仅流程复杂--从用户下单.商家接单到配送员接单.交付,而且压力和流量在午.晚高峰时段非常集中.同时,外卖业务的增长非常迅猛,自2013年11月上线到最近峰 ...
- UEFI 基础教程 (一) - 基于QEMU搭建UEFI开发环境(win/linux)
一.EDKII windows 环境搭建 1. 下载UEFI开源代码 cmd进入C盘根目录,git clone https://github.com/tianocore/edk2.git edkii ...
- UEFI 之 UFS Recovery模式下载
一.概述 UFS Recovey 模式是一种特殊下载模式,就是在UFS为空片(做过全盘erase操作或者说UFS没有数据)的情况下,将系统镜像下载到UFS Devices. 二 . 开发环境 平台 H ...
- Arch linux uefi 启动盘,用UEFI安装ArchLinux 20140105
为了在E431上用UEFI安装Arch一个晚上重装了5,6次系统,整整做了一个通宵,还好是周六.今天刚好有时间正好 来总结一下.因为要用UEFI来安装,所以安装了两次之后发现UEFI环境变量不可用(用 ...
- IBM X3850 X5 7143QEB 安装Proxmox 5 初始化ramdisk失败,服务器卡死问题处理方法
服务器:IBM X3850 X5 7143QEB 预安装系统:Proxmox VE 5.2 问题描述: 在安装PVE时,到Loading initial ramdisk...界面时不能正常进行到下一个 ...
- 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 ...
- 统信UOS从虚拟机(BIOS引导)迁移到本机物理机加UEFI改造
统信UOS从虚拟机(BIOS引导)迁移到本机物理机加UEFI改造 1.工具和资料 参考资料:https://wiki.archlinux.org/index.php/GRUB_(%E7%AE%80%E ...
- easyuefi只能在基于uefi启动的_systemd时代的开机启动流程(UEFI+systemd)
本文内容预告: 开机启动流程图预览 按下电源和固件阶段 内核启动阶段 内核启动后,用户登录前 计算机启动流程可以分为几个大阶段: 内核加载前 本阶段和操作系统无关,Linux或Windows或其它系统 ...
- 【Jetson Xavier NX】Jetson Xavier NX的UEFI 的配置详解
环境 硬件:Jetson Xavier NX 套件 系统:Ubuntu 20.04 Bootloader:Jetson UEFI firmware (Version 1.0-d7fb19b bulit ...
最新文章
- 入职五年回顾(八) 2013年3月
- Spark任务提交源码
- java基础(六) switch语句的深入解析
- linux常用命令:wget 命令
- 关闭或开启memory_target
- 计算机数据库基础知识笔记,计算机基础及技巧(我的电脑笔记,适合新手!包含使用电脑最基本的知识及DOS、网络及数据库等。)...
- pymysql安装_第八章 nova组件安装2
- Java常用设计模式————桥接模式
- 下列不是unix linux,下列软件中,不是操作系统的是______。A) LinuxB) UNIXC) MS-DOSD) MS-OfficeA.B.C.D._考题宝...
- OSChina 周六乱弹 ——用大脑直接写代码
- oracle中如何测试,Oracle数据库中如何正确的查看sql
- JAVA之JAR文件
- 产品和程序员的互殴大战
- medusa详细使用教程
- AD20的一些基本操作
- 小型水库雨水情测报设施建设-水库大坝水文监测
- 我家的三个犹太小富豪(转)
- 【云栖大会】一场7年后的狂欢,云栖大会除了“飞天”还有什么
- a and b a or b
- SourceTree安装使用