EFI Driver Model(下)-SCSI 驱动设计

1、SCSI简介

  SCSI是Small Computer System Interface(小型计算机系统接口)的缩写,使用50针接口,外观和普通硬盘接口有些相似。SCSI硬盘和普通IDE硬盘相比有很多优点:接口速度快,并且由于主要用于服务器,因此硬盘本身的性能也比较高,硬盘转速快,缓存容量大,CPU占用率低,扩展性远优于IDE硬盘,并且支持热插拔。

2、SCSI驱动设计

  在EFI Driver Model中,UEFI驱动程序是重要的组成部分,它们与UEFI应用程序有所区别。对于UEFI驱动程序来说,EFI System Table、Memory、Handles、Images和Events等对象的管理至关重要。在初始化驱动程序时,有些驱动程序可能不会产生任何Handle,也不会向Handle Database增加任何Protocol,它们主要进行初始化操作,并在执行完毕后从系统内存中卸载。

  具体到SCSI驱动设计,它在Linux系统中通常被划分为三个层次:top level、middle level和lower level。Top level为具体的scsi设备驱动,例如常用的磁盘设备驱动。这些驱动与具体的scsi设备相关,因此通常由设备开发者提供。对于标准类设备,驱动可以通用。Middle level实际上是scsi总线层驱动,它负责按照scsi协议进行设备枚举、数据传输和出错处理。而在lower level层,驱动可能并不直接对硬件进行操作,例如可以做虚拟的scsi host。

  在SCSI驱动设计中,scsi_driver结构体和scsi磁盘驱动实例(如sd_template,定义在文件drivers/scsi/sd.c)是关键部分。PCI子系统和SCSI子系统的工作模式也是设计过程中需要考虑的重要因素。PCI子系统会注册PCI总线类型,扫描PCI总线以获取所有PCI设备。而SCSI子系统则注册SCSI总线类型,其较高层注册SCSI设备驱动,较低层(如SCSI HBA驱动)负责扫描SCSI总线以获取所有SCSI设备。

  总的来说,EFI Driver Model下的SCSI驱动设计是一个复杂而精细的过程,需要考虑到各种设备、总线和协议的特性,以确保驱动的稳定性和高效性。对于开发者来说,深入理解EFI Driver Model以及SCSI的工作原理是设计高质量驱动的基础。

驱动类别描述
SCSI host controllerConsumes PCI I/O Protocol on the SCSI host controller handle and produces the Ext SCSI Pass Thru Protocol,如果需要一个驱动程序与EFI 1.10规范兼容,则必须生成SCSI通过协议。
SCSI bus driverConsumes the Ext SCSI Pass Thru Protocol and produces a child handle for SCSI targets on the SCSI bus. Installs the Device Path Protocol and SCSI I/O Protocol onto each child handle.
SCSI 设备驱动使用SCSI I/O协议,并生成一个I/O抽象,它为启动符合EFI的操作系统所需的控制台设备和引导设备提供服务。

   EFI 1.10规范定义了SCSIPass Thru Protocol.用于SCSI host controller的UEFI驱动程序被需要符合EFI 1.10规范的平台上正常工作,生成SCSI通过协议,并为SCSI host controller管理的物理驱动器和逻辑驱动器生成BLOCK I/O协议。这意味着需要一个用于EFI 1.10平台中的SCSI主机控制器的UEFI Driver来执行上表中描述的SCSI驱动程序堆栈的所有功能。UEFI 2.0及以上规范要求平台固件为大容量存储设备提供SCSI总线驱动程序和SCSI设备驱动程序。

2.1 SCSI Host Controller Driver

  SCSI主机控制器驱动程序管理包含一个或多个SCSI通道的SCSI主机控制器,它为每个SCSI通道创建句柄,并安装扩展的SCSI Pass Thru Protocol和Device Path Protocol到每一个驱动产生的handle上。有关EFI_EXT_SCSI_PASS_THRU_PROTOCOL的详细信息,请参阅UEFI规范中的SCSI驱动程序模型和总线支持章节。

struct _EFI_EXT_SCSI_PASS_THRU_PROTOCOL {
  ///
  /// A pointer to the EFI_EXT_SCSI_PASS_THRU_MODE data for this SCSI channel.
  ///
  EFI_EXT_SCSI_PASS_THRU_MODE                *Mode;
  EFI_EXT_SCSI_PASS_THRU_PASSTHRU            PassThru;
  EFI_EXT_SCSI_PASS_THRU_GET_NEXT_TARGET_LUN GetNextTargetLun;
  EFI_EXT_SCSI_PASS_THRU_BUILD_DEVICE_PATH   BuildDevicePath;
  EFI_EXT_SCSI_PASS_THRU_GET_TARGET_LUN      GetTargetLun;
  EFI_EXT_SCSI_PASS_THRU_RESET_CHANNEL       ResetChannel;
  EFI_EXT_SCSI_PASS_THRU_RESET_TARGET_LUN    ResetTargetLun;
  EFI_EXT_SCSI_PASS_THRU_GET_NEXT_TARGET     GetNextTarget;
};

  一个SCSI主机控制器驱动程序遵循UEFI驱动程序模型。根据其管理的适配器,SCSI主机控制器驱动程序可以被归类为设备驱动程序或混合驱动程序。它为每个SCSI通道创建子句柄(如果有多个1),它还可以在自己的句柄上安装协议。通常,SCSI主机控制器驱动器是特定于芯片的,因为需要初始化和管理当前绑定的SCSI主机控制器。

  由于在一个平台中可能存在多个可能由一个SCSI主机控制器驱动程序管理的SCSI主机适配器,因此建议将SCSI主机控制器驱动程序设计为重新进入,并为每个SCSI主机控制器分配不同的私有上下文数据结构。

2.2 Single-Channel SCSI Adapters

如果SCSI适配器支持一个通道,则SCSI主机控制器驱动程序将执行以下操作:

  • 将扩展的SCSI Pass Thru Protocol安装到控制器句柄上的SCSI host controller的controller handle上。
  • 在模式结构中设置SCSI通道的逻辑属性。
  • 在模式结构中设置SCSI通道的物理属性

  下图显示了一个在单通道SCSI适配器上的实现示例。绿色的图层表示SCSI主机控制器驱动程序。
在这里插入图片描述
  因为只有一个SCSI通道,所以SCSI驱动程序可以简单地实现扩展SCSI通过协议的一个实例。平台固件提供了SCSI总线驱动程序和SCSI磁盘驱动程序,它们通过执行以下操作来完成驱动程序堆栈:

  • 扫描SCSI通道上的SCSI目标并创建子句柄。
  • 向每个子句柄安装设备路径协议
  • 向每个子句柄上安装SCSI I/O协议
  • 向每个子句柄安装I/O抽象,例如Block I/O协议

2.2 Multi-Channel SCSI Adapters

  如果SCSI适配器提供多个SCSI通道,则SCSI主机控制器驱动程序会更加复杂。下图显示了在双通道SCSI适配器上可能实现的SCSI驱动程序实现。
在这里插入图片描述
  在这种情况下,SCSI适配器通过执行以下操作产生两个物理SCSI通道:

  • 为每个物理SCSI通道创建一个子句柄。
  • 向每个子句柄安装设备路径协议。
  • 在每个子句柄上安装扩展的SCSI传递协议
  • 在每个子句柄上的模式结构中设置SCSI通道的逻辑属性。
  • 在每个子句柄上的模式结构中设置SCSI通道的物理属性。

  平台固件提供了SCSI总线驱动程序和SCSI磁盘驱动程序,通过执行以下操作,可以完成上述每个扩展SCSI通过协议上的两个驱动程序堆栈:

  • 扫描每个SCSI通道上的SCSI目标,并创建子句柄。
  • 向每个子句柄安装设备路径协议。
  • 向每个子句柄上安装SCSI I/O协议
  • 向每个子句柄安装I/O抽象,如Block I/O协议。

2.3 SCSI Adapters with RAID

  SCSI主机控制器驱动程序也可以支持具有RAID功能的SCSI适配器。下图显示了一个具有两个物理SCSI通道和一个逻辑通道的示例实现。这两个物理通道是在SCSI适配器上实现的,然后,RAID组件配置这两个通道,以生成一个逻辑SCSI通道。两个物理通道都安装了扩展SCSI通过通道,但除了用于诊断外,不使用这些通道。对于逻辑通道,SCSI主机控制器驱动程序根据RAID配置生成另一个扩展SCSI通过协议(关闭物理位)实例。发送到逻辑通道的扩展SCSI传递协议的请求由SCSI主机控制器驱动程序处理,并转换为物理SCSI通道上的请求,平台固件必须只枚举并从逻辑SCSI通道上存在的SCSI目标启动。
在这里插入图片描述
  在实现RAID时,SCSI适配器硬件可能无法将物理SCSI通道)暴露给上层软件。如果物理SCSI通道不能暴露于上层软件,则SCSI主机控制器驱动程序只需要为RAID生成单个逻辑通道。
  虽然基本理论与物理通道上的理论相同,但从制造和诊断的角度是不同的。如果物理SCSI通道暴露,任何SCSI命令,包括诊断命令,都可以发送到单个通道,这对生产线非常有帮助。此外,可以使用扩展SCSI传递协议支持的非阻塞模式同时将诊断命令发送到所有物理通道。诊断过程可能会从性能的增益中显著获益。总之,建议尽可能公开物理SCSI通道。
  当然,有许多可能的设计来实现SCSI RAID功能。关键是,SCSI主机控制器驱动程序可以为各种SCSI适配器类型设计和实现,并且这些SCSI主机控制器驱动程序可以生成包含可作为UEFI引导设备使用的SCSI目标的扩展SCSI通过协议。

3、源码分析

ScsiDiskDriverBindingSupported 用于检测该SCSI磁盘驱动程序是否支持特定的控制器设备

EFI_STATUS
EFIAPI
ScsiDiskDriverBindingSupported (
  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
  IN EFI_HANDLE                   Controller,
  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath   OPTIONAL
  );

ScsiDiskDriverBindingStart 这个函数是用来启动指定的驱动程序并将其绑定到指定的ControllerHandle上的。它是EFI_DRIVER_BINDING_PROTOCOL协议的一部分,是UEFI(统一可扩展固件接口)引导过程中重要的一环,用于初始化和启动设备驱动程序。

EFI_STATUS
EFIAPI
ScsiDiskDriverBindingStart (
  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
  IN EFI_HANDLE                   Controller,
  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath   OPTIONAL
  );

ScsiDiskDriverBindingStop 用于停止指定控制器上的驱动程序。这个函数属于EFI_DRIVER_BINDING_PROTOCOL协议,该协议定义了驱动程序如何绑定到控制器、启动和停止服务。

EFI_STATUS
EFIAPI
ScsiDiskDriverBindingStop (
  IN  EFI_DRIVER_BINDING_PROTOCOL  *This,
  IN  EFI_HANDLE                   Controller,
  IN  UINTN                        NumberOfChildren,
  IN  EFI_HANDLE                   *ChildHandleBuffer   OPTIONAL
  );

ScsiIo使用

 Status = gBS->OpenProtocol (
                  Controller,
                  &gEfiScsiIoProtocolGuid,
                  (VOID **)&ScsiIo,
                  This->DriverBindingHandle,
                  Controller,
                  EFI_OPEN_PROTOCOL_BY_DRIVER
                  );
  if (EFI_ERROR (Status)) {
    FreePool (ScsiDiskDevice);
    return Status;
  }

  ScsiDiskDevice->Signature                         = SCSI_DISK_DEV_SIGNATURE;
  ScsiDiskDevice->ScsiIo                            = ScsiIo;
  ScsiDiskDevice->BlkIo.Revision                    = EFI_BLOCK_IO_PROTOCOL_REVISION3;
  ScsiDiskDevice->BlkIo.Media                       = &ScsiDiskDevice->BlkIoMedia;
  ScsiDiskDevice->BlkIo.Media->IoAlign              = ScsiIo->IoAlign;
  ScsiDiskDevice->BlkIo.Reset                       = ScsiDiskReset;
  ScsiDiskDevice->BlkIo.ReadBlocks                  = ScsiDiskReadBlocks;
  ScsiDiskDevice->BlkIo.WriteBlocks                 = ScsiDiskWriteBlocks;
  ScsiDiskDevice->BlkIo.FlushBlocks                 = ScsiDiskFlushBlocks;
  ScsiDiskDevice->BlkIo2.Media                      = &ScsiDiskDevice->BlkIoMedia;
  ScsiDiskDevice->BlkIo2.Reset                      = ScsiDiskResetEx;
  ScsiDiskDevice->BlkIo2.ReadBlocksEx               = ScsiDiskReadBlocksEx;
  ScsiDiskDevice->BlkIo2.WriteBlocksEx              = ScsiDiskWriteBlocksEx;
  ScsiDiskDevice->BlkIo2.FlushBlocksEx              = ScsiDiskFlushBlocksEx;
  ScsiDiskDevice->StorageSecurity.ReceiveData       = ScsiDiskReceiveData;
  ScsiDiskDevice->StorageSecurity.SendData          = ScsiDiskSendData;
  ScsiDiskDevice->EraseBlock.Revision               = EFI_ERASE_BLOCK_PROTOCOL_REVISION;
  ScsiDiskDevice->EraseBlock.EraseLengthGranularity = 1;
  ScsiDiskDevice->EraseBlock.EraseBlocks            = ScsiDiskEraseBlocks;
  ScsiDiskDevice->UnmapInfo.MaxBlkDespCnt           = 1;
  ScsiDiskDevice->BlockLimitsVpdSupported           = FALSE;
  ScsiDiskDevice->Handle                            = Controller;
  Status = gBS->InstallMultipleProtocolInterfaces (
                      &Controller,
                      &gEfiBlockIoProtocolGuid,
                      &ScsiDiskDevice->BlkIo,
                      &gEfiBlockIo2ProtocolGuid,
                      &ScsiDiskDevice->BlkIo2,
                      &gEfiDiskInfoProtocolGuid,
                      &ScsiDiskDevice->DiskInfo,
                      NULL
                      );

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/492749.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

记一次Tomcat启动失败的经历

首先,下载tomcat10.1.20后,双击启动bin下的startup.bat闪退,查了资料,说是依赖JDK环境和JRE环境,当然,我Java是能正常用的,毕竟写了这么多东西它有没有我还不清楚吗 可问题就来了,既…

软件应用实例,租赁系统软件操作教程,脚手架租赁管理集装箱租赁管理系统教程

软件应用实例,租赁系统软件操作教程,脚手架租赁管理集装箱租赁管理系统教程 一、前言 以下软件操作教程以,佳易王租赁管理系统软件V17.0为例说明 件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、软件可以记录&#x…

GEE土地分类——分类后样本点值提取至点过程中,导出的csv数据表中不存在geometry的位置信息

值提取至点导出的csv数据表中不存在geometry的位置信息 错误提示: {"type":"MultiPoint","coordinates":[]} 问题分析 问题主要出现在在reduceregions中所使用的第二个参数中。在reduceregions中,第二个参数用于指定geometry信息,以便将r…

约克中央空调YES-will系列,舒适冷暖与高品质家居的优选

漫漫寒冬,室内一片寒意,开启空调多久才能享受到暖意?如果冬季气温较低,空调能否保持正常的制热运行? 炎炎夏季,即便在室内也同样是“暴汗”不断,身上黏糊糊,什么样的家用中央空调才能快速制冷,让全家人感受到舒适,同时又能避免传统空调直吹带来的一系列问题? 遇上梅雨季节…

【采购季】全网云服务器采购季活动大盘点 网站博客搭建、程序员职场毕业神器 低至50/年 阿里云 京东云 腾讯云

《最新对比表》已更新在文章头部—腾讯云文档,文章具有时效性,请以腾讯文档为准! 【腾讯文档实时更新】云服务器1分钟教会你如何选择教程 2024-开年采购活动 云服务器专区 京东云 阿里云 腾讯云 配置最新价格表 与 官方活动地址 ​ 当前活动…

双碳目标下基于全球模式比较计划CMIP6与区域气候-化学耦合模式WRF-Chem的未来大气污染变化模拟教程

原文链接:双碳目标下基于全球模式比较计划CMIP6与区域气候-化学耦合模式WRF-Chem的未来大气污染变化模拟教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247599209&idx7&sn2fb78bcb18e6ec709853a7595d8822d9&chksmfa82058ecdf58c9852bf4…

鸿蒙HarmonyOS应用开发之使用Node-API接口进行异步任务开发

场景介绍 napi_create_async_work是Node-API接口之一,用于创建一个异步工作对象。可以在需要执行耗时操作的场景中使用,以避免阻塞主线程,确保应用程序的性能和响应性能。例如以下场景: 文件操作:读取大型文件或执行复…

朋友圈运营攻略,还有多号群发朋友圈教程

为什么需要打造朋友圈? 私域朋友圈运营运营者和私域流量理论上其实就是“网友”的关系 要维持稳定的社交关系,做好私域流量运营,就必须持续地进行自身价值塑造!而朋友圈就是最好的“战场” 打造优质朋友圈的关键点: …

09 网络ARP请求,响应,ICMP协议

arp协议_arp请求_arp回应 ICMP包构造ping搜狐服务器参考 #include <stdio.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <linux/if_packet.h> #include <linux/if_ether.h> #include <string.h> #includ…

文案转化率低?快看看这两个坑你踩没踩

对于很多中小企业来说&#xff0c;无论是来拓市场还是获客&#xff0c;软文营销都会成为他们的主要营销方式&#xff0c;比较软文营销的成本较低&#xff0c;同时门槛也不高。但是也有品牌发现&#xff0c;自己和团队辛苦构思了几周写出的文案&#xff0c;但是效果不是很好。今…

五、Elasticsearch 集成

目录 5.1 Spring Data 框架集成5.1.1 Spring Data 框架介绍5.1.2 Spring Data Elasticsearch 介绍5.1.3 Spring Data Elasticsearch 版本对比5.1.4 集成步骤 5.1 Spring Data 框架集成 5.1.1 Spring Data 框架介绍 Spring Data 是一个用于简化数据库开发的开源框架。其主要目…

前端 CSS 经典:grid 栅格布局

前言&#xff1a;Grid 布局是将容器划分成"行"和"列"&#xff0c;产生单元格&#xff0c;然后将"项目"分配给划分好的单元格&#xff0c;因为有行和列&#xff0c;可以看作是二维布局。 一 术语 1. 容器 采用网格布局的区域&#xff0c;也就是…

【机器学习之旅】概念启程、步骤前行、分类掌握与实践落地

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

六、保持长期高效的七个法则(二)Rules for Staying Productive Long-Term(2)

Rule #5 - If your work changes, your system should too. 准则五&#xff1a;如果你的工作变了&#xff0c;你的系统也应该改变。 For some, work will be consistent enough to not need major changes.You simply stick to the same system and you’ll get the results y…

高精密基准源 国产替代 REF191 ADR4520 ADR420 ADR430 ADR440 REF5020 MAX6126

高精密基准源 国产替代 REF191 ADR4520 ADR420 ADR430 ADR440 REF5020 MAX6126 ADR03 REF03 REF192 AD580 AD780 ADR441 ADR4525 ADR431 ADR421 REF5025ADR423 ADR433 ADR443 ADR4530 REF193 AD780 ADR06 REF5030ADR434 ADR444 ADR4540 REF198 REF5040ADR425 ADR435 ADR445 AD…

成功推出全新生成式AI的四大原则

生成式AI有望从根本上打开一扇新世界机遇的大门&#xff0c;以满足各行各业的客户需求。从提供个性化回复的对话式聊天机器人&#xff0c;到各种应用的代码&#xff0c;再到营销传播的目标内容&#xff0c;生成式AI正在彻底改变企业的运作方式。为竞相提供卓越的客户体验&#…

分布式系统的发展史

目录 &#x1f433;今日良言&#xff1a;且视他人之疑目如盏盏鬼火&#xff0c;大胆地去走自己的夜路 &#x1f407;一、常见概念 &#x1f407;二、发展史 今日良言&#xff1a;且视他人之疑目如盏盏鬼火&#xff0c;大胆地去走自己的夜路 一、常见概念 在正式介绍分布式系…

16、OpenFeign和Sentinel集成实现fallback服务降级

注&#xff1a;本篇文章主要参考周阳老师讲解的cloud进行整理的&#xff01; 1、需求说明 cloudalibaba-consumer-nacos-order83 通过OpenFeign调用 cloudalibaba-provider-payment9001 1、 83 通过OpenFeign调用 9001微服务&#xff0c;正常访问OK 2、 83 通过OpenFeign调用 …

推特社交机器人分类

机器人有不同的种类。 cresci-17数据集中的三种不同的机器人类:传统垃圾机器人、社交垃圾机器人和假追随者。 传统的垃圾邮件机器人会生成大量推广产品的内容&#xff0c;并且可以通过频繁使用的形容词来检测; 社交垃圾邮件倾向于攻击或支持政治候选人&#xff0c;因此情绪是一…

centos配置natapp 自动配置

步骤 下载客户端 赋值权限 启动测试是否可用配置natapp.service 设置自动启动 natapp.service 配置的文件夹需要跟 natapp的路径一致 下载配置文件 centos 这里 我用的 natapp_autostart-master\natapp_autostart-master\systemd 文件夹下的 natapp.service 上传natapp到服…