问题标签 [block-device]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux-kernel - Linux 块驱动程序合并 bio 的
我有一个正在工作的块设备驱动程序,经过一段时间。它适用于 PCIe 设备,我直接使用 make_request_fn 处理 bios,而不是使用请求队列,因为该设备没有寻道时间。但是,它仍然有事务开销。
当我从设备连续读取时,我得到包含许多段的 bios(通常我最多 32 个),每个段由 2 个硬件扇区(所以 2 * 2k)组成,然后将其作为设备的一个分散-收集事务处理,节省大量的信令开销。然而,在写入时,每个 bios 都只有一个 2 个扇区的段,因此操作总共需要更长的时间。我希望以某种方式使传入的 bios 由许多段组成,或者我自己将 bios 明智地合并在一起。这里的正确方法是什么?
的当前内容make_request_fn
大致如下:
- 确定生物的读/写
- 对于 bio 中的每个部分,在
scatterlist*
with中添加一个条目sg_set_page
- 将此散点列表映射到 PCI
pci_map_sg
- 对于 scatterlist 中的每个段,添加到定义多段 DMA scatter-gather 操作的设备特定结构
- 将该结构映射到 DMA
- 进行交易
- 取消映射结构和 SG DMA
- 如果失败和
bio_endio
成功则调用。-EIO
0
请求队列设置如下:
c - 对使用 O_DIRECT 打开的文件进行“写入”后的用户缓冲区
我正在使用该O_DIRECT
标志直接从用户缓冲区写入磁盘。但据我了解,Linux 不保证在这个调用之后,数据被写入。它只是使用 DMA 或其他任何东西直接从用户缓冲区写入物理设备......因此,我不明白在调用“写入”函数后是否可以写入用户缓冲区。
我确信示例代码将有助于理解我的问题:
最后一行(memset)合法吗?写入用户缓冲区是否有效,DMA 可能使用该缓冲区将数据传输到设备?
linux-kernel - del_gendisk 在 IO 期间移除媒体后清理块设备期间发生故障
我有一个热插拔 PCI 存储设备的块驱动程序。如果在 IO 期间删除了设备,我似乎从来没有接到过释放(即mydev_blk_release(struct gendisk *gd, fmode_t mode)
)的调用,我认为这会阻止del_gendisk()
完成,从而挂起驱动程序的清理。一旦发生弹出,我将结束队列中的所有请求,但它似乎仍然不会导致释放。在媒体消失的情况下,终止请求和删除 gendisk 的正确方法是什么?
linux-kernel - blk_queue_segment_boundary()的用法是什么
这本书 ldd 对函数 blk_queue_segment_boundary() 说如下:
有些设备无法处理跨越特定大小内存边界的请求;如果您的设备是其中之一,请使用此函数告诉内核该边界。例如,如果您的设备在处理跨越 4 MB 边界的请求时遇到问题,请传入掩码 0x3fffff。默认掩码为 0xffffffff。
我不太明白这里的边界是什么意思,比如我有一个虚拟块设备,它确实是由4MB的文件组成的,所以我想要一个不超过4MB边界的请求,
我想要的是 (file_offset + nbytes) 不大于 4M,但确实有时超过 4M,那么,对 blk_queue_segment_boundary() 有什么误解吗?
linux-kernel - Linux内核中的bio结构
我正在阅读 Robert Love 的 Linux Kernel Development。我不明白这一段关于bio
结构的内容:
内核中块 I/O 的基本容器是 bio 结构,它定义在
<linux/bio.h>
. 此结构将正在运行(活动)的块 I/O 操作表示为段列表。段是在内存中连续的一块缓冲区。因此,各个缓冲区在内存中不需要是连续的。通过允许以块的形式描述缓冲区,bio 结构为内核提供了执行块 I/O 操作的能力,甚至可以从内存中的多个位置执行单个缓冲区的块 I/O 操作。像这样的向量 I/O 称为分散-聚集 I/O。
- 究竟是什么
flight(active)
意思? - “作为细分列表”——我们是在谈论这种细分吗?
- “通过允许缓冲区......在内存中”是什么意思?
module - 从内核 (3.7) 模块读取 block_device:submit_bio 中的段错误,缺少 bd_disk
你好堆栈溢出。
想知道我在尝试直接从内核模块访问块设备时出了什么问题。(amd64 上的内核 3.7)
我使用 get_gendisk() 获得了设备的 (struct gendisk*)。接下来,使用 bio_map_kern() 创建一个 bio,使用 bdget_disk() 添加 block_device,然后使用 submit_bio() 发送它。(见下面的代码)
在“sdb”上执行此操作时,它工作正常。在“loop0”或 ramdisk 设备上执行此操作时,它会因段错误而失败。故障归结为 generic_make_request_checks() 调用内联函数 bdev_get_queue(),它试图访问 block_device 结构中的“bd_disk”字段。
RIP:0010:[] [] generic_make_request_checks+0x3e/0x2b1
当从 'sdb' 获取 block_device 时,bd_disk 被链接回设备的 gendisk 结构(在它的任何分区上)。在“loop0”设备上尝试相同操作时,此指针为零。但是 loop0 已正确设置,因为我可以使用它进行 mkfs、mount 或 dd。
有关如何设置简单数据读取的任何提示?干净和正确的方法?将 gendisk 指针添加到 block_device 不是一个好的解决方案,因为我不“拥有”这些结构。
也许这种方法都是错误的,我错过了一些简单的 read() 函数...... :-)
调用堆栈(内核 3.7,amd64):
我尝试这个的测试代码:
macos - OSX 用户空间设备文件
有没有办法通过 OSX(10.8+)中的用户空间创建块设备,没有 3rd 方库(FUSE 等)?
我正在尝试创建一个用户空间工具。这个想法是用户向工具提供一个文件,并且该工具创建一个虚拟界面。每当写入接口时,该工具都会对数据应用操作,然后写入原始文件。每当读取接口时,该工具都会从原始文件中读取并应用逆操作。
我不一定需要块设备。该工具需要创建某种可以被视为文件的虚拟界面,即它可以被另一个应用程序打开和保存。
我查看了 I/O Kit 的用户空间例程,但似乎没有什么适用的,因为创建虚拟 USB/FireWire/MMC/SCSI 设备似乎太过分了。
device - Getting live info from /dev/input
I am unsure if this is the correct place for this question. I am attempting to obtain the axis position values from a joystick /dev/input/js0
on my system. If I run jstest /dev/input/js0
it will give me live feedback on all buttons and axis positions.
I am trying to feed this information into my C program to control servos. Is there a function for doing this? I have not worked much with input devices in programming so this is all new to me.
cocoa - 从 NSURL 获取块设备
这个问题说明了一切。如何从代表例如可移动媒体的 NSURL 获取块设备?我想从中得到/Volumes/MyDevice
类似的东西/dev/disk2
。我想知道如果不使用 IOKit 框架是否可以做到这一点!任何帮助表示赞赏。
kernel - What kernel module function gets called, when I say "cat myfile > /dev/sda"
I've skimmed through the Linux Kernel Module Programming guide, but can't figure out:
When I say cat image.iso > /dev/sda
, will it cause the write
function of file_operations structure to be executed by the sda
device driver? Or is the file interface not applied to block device nodes?
Where do I find that function's implementation? (the respective driver within the Linux code tree)?