gpt4 book ai didi

linux-kernel - 绕过 I/O 调度和 linux 内核页面缓冲

转载 作者:行者123 更新时间:2023-12-04 05:41:40 26 4
gpt4 key购买 nike

我想要实现的目标:

Developing an linux application in C language, that "exclusively" accesses a

PATA/SATA 硬盘驱动器(HDD)发送 ATA 命令(实际上只有那些
不要修改访问的 HDD 上的任何字节 - 例如。 READ_SECTOR、IDENTIFY_DEVICE、SET_FEATURES、
等等。)。

通过“独占”,我的意思是只要硬盘通电(自定义硬件 - 这是一个简单的开关,可确保在加载应用程序之前不通电并希望这样做),第一个并且只能访问该硬盘驱动器只能访问我的应用程序。除了我的应用程序之外的 IOW,甚至 linux 内核(包括 SCSI 子系统)或任何其他应用程序或进程或人类用户都无法访问该 HDD,除非我的应用程序指示/允许他们这样做。

我的申请还有另一个要求:
由于在我们的应用程序中对 HDD 的访问非常关键(在控制方面而不是在性能方面),因此不希望应用程序完成的事务中涉及任何 I/O 调度(此 HDD 上的性能是不是约束。)。也不希望从 HDD 读取的数据由内核缓冲区或页面缓冲区缓冲。应用程序将读取 512 字节或它的倍数的块大小。

现在我面临的问题是:

SCSI 子系统位于(并被写入以使用)I/O 调度程序和内核缓冲区或页面缓冲区缓存。

虽然 'sg-driver' 是由 SCSI 子系统提供的,可以直接发送命令(-Linux SCSI 子系统命令,而不是 ATA 或 SCSI 命令,然后由 libata 转换为实际的 ATA 命令。我在这里吗?) HDD,但这是一种 I/O 方法-您提供 i/p 并获得 o/p,即您无法控制数据传输协议(protocol)的过程(例如 PIO、DMA 和 ATA 状态以及错误寄存器等)和设备配置(通过设置功能 ATA 命令。)。

此外,错误报告机制必须健全且特定于 ATA 协议(protocol),而不仅仅是 Linux SCSI 子系统错误代码。我的应用程序需要访问 PATA/SATA HDD 上的 ATA 错误寄存器和 ATA 状态寄存器。

我的应用程序要求的是对 HDD 的独占控制 - 例如。必须满足上述要求,发出 READ_SECTOR ATA cmd,然后通过读取 i/o 端口或通过“libata”直接从 HDD 检索数据本身。

我不能做什么?

我不打算编写 PATA/SATA HBA 设备驱动程序或市场上所有可用的 HBA,因为它们已经包含在 libata 的内核中。

到目前为止我学到了什么?

为了完成所需的任务,我可能(或可能不?)需要编写一个直接与 VFS 层交互的块设备驱动程序(或者有什么方法甚至可以绕过 VFS,以便我的应用程序可以直接与这个块驱动程序通信) 不涉及/弄乱内核缓冲区或页面缓冲区和 I/O 调度程序。
该块驱动程序将直接与 libata(绕过 SCSI 子系统上层)通信,然后与 PATA/SATA HBA 驱动程序通信。

是否可以以独立于 CPU 架构的方式编写这样的驱动程序?

这是一种可行的方法吗?如果是,那么它会影响我的应用程序未访问的其他硬盘驱动器的 I/O 性能。通过这种方式。在这种情况下,我是否需要通过 VFS 编写系统调用(或在可能的情况下绕过它),以便我的应用程序与我的块驱动程序进行通信?
请赐教我关于这种方法。

或者我的块设备驱动程序是否可以直接与为 libata 编写的 PATA/SATA HBA 驱动程序通信,
但是这种方法是否会影响我的应用程序未访问的其他附加 HDD 的 I/O 性能。通过这种方式。另外我的应用程序如何与这个块设备驱动程序通信?

请赐教。

此外,我想知道我的应用程序的相同场景,但有一个区别 - 如果我有 SCSI 硬盘驱动器及其变体,而不是 PATA/SATA 驱动器会怎样 - 特别是 SAS、光纤 channel 和 USB。当然,这次我不会使用 libata 和 ATA 命令,而是使用 SCSI 协议(protocol)命令。

你想推荐一个 live cd 发行版作为我的应用程序主机,它包含 PATA/SATA HBA libata 驱动程序(-不适用于 IDE 子系统,因为我不会使用它,因为它现在已经贬值,因此可能不会更新适用于 HBA 驱动程序。)适用于大多数 HBA。

简而言之,Linux 应用程序访问 PATA/SATA 或 SCSI/SAS/Fibre Channel HDD 的最直接方式是什么。

我希望,我已经提供了有关我的问题的足够信息,但是如果您想获得更多信息或更多说明,请随时提问。

更新 1(27/6/2012) :
通过与克里斯的有用讨论(见下文)和我的研究,我得出了以下结论:
  • 一个现成的 USB-to-PATA/SATA 适配器不能解决我的目的,因为它不允许我的应用程序。或驱动程序动态更改数据传输模式(PIO 与 DMA),它不允许我的应用程序。或驱动程序读取 ATA 寄存器。
  • 定制的 USB-to-PATA/SATA 适配器可能会有所帮助,但这将需要一个需要实现 ATA 协议(protocol)的嵌入式处理器,或者一个实现整个 ATA 协议(protocol)的 FPGA 芯片。
    但是嵌入式处理器解决方案涉及 GPIO,不适合 SATA,因为它需要专门的收发器,而且 I/O 性能对于 PATA 和 SATA 来说都是一个问题——对我的应用来说太慢了。

  • 这样的适配器将与我的 linux-kernel 驱动程序(或通过 libusb)通信到我的应用程序。通过自定义协议(protocol)帮助我的应用程序进行黑白通信。和嵌入式处理器上的 ATA 协议(protocol)。
    在FPGA芯片解决方案的情况下,我需要在FPGA本身中实现这个协议(protocol)以及ATA协议(protocol)。

    但在这一点上,我实现 FPGA 解决方案和嵌入式处理器解决方案在劳动力、时间和金钱方面是不可行的。所以我被困在 纯软件解决方案 .

    最后,似乎我可能不得不复制和修改硬件接口(interface)层的所有内容以满足 Chris 所说的要求。

    所以, VFS 层和 HBA 驱动程序或 libata 层之间 ,我应该如何进行。哪些事情需要实现,哪些不需要?

    有人可以解决这个问题吗?任何想法?

    更新 2(2012 年 1 月 7 日) :
    我正在努力解决这个问题。有没有人在SO上,谁能启发我?

    最佳答案

    实际上,如果您想要这种级别的细节控制,您最终将不得不编写自己的低级驱动程序。

    您对避免 I/O 缓冲和调度的限制可能特别具有挑战性 - 您可能会避免 DMA,但出于性能原因,现代处理器的 I/O 与内部操作相当分离。也许如果您可以完全禁用所有中断,那么您至少可以在做事时加上时间戳。您可能希望驱动器使用它自己的接口(interface)适配器,当然不会与正在运行的文件系统共享。

    从用户空间做事可能需要通过内核中的代理来工作——不过你需要在内核端做你的时间关键的事情。

    如果满足您的需求,一个简单得多的解决方案是使用 USB 转 SATA 或 PATA 适配器。您可以使用 modprobe 的 quirks 模式告诉现有内核驱动程序忽略 VID/PID,然后从用户空间通过 libusb 与设备对话。但是,那里肯定会有延迟。

    为了获得最精细的控制,您可能需要将驱动器连接到没有 I/O 缓冲的嵌入式处理器,或者甚至是 FPGA。对于 PATA 的低数据速率,这并不是特别困难,SATA 可能需要专门的收发器,但可能并非不可能(或者您可以通过其中一个适配器工作)。您可能最终会通过 USB 甚至串行端口将此自定义外围设备连接到 PC,并使用它来发出任务并获取结果(如果您将其设置为 PC 可以下载设备的固件/比特流,那会很方便,因此你有灵活性)。

    关于linux-kernel - 绕过 I/O 调度和 linux 内核页面缓冲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11192202/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com