问题标签 [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.

0 投票
1 回答
82 浏览

io - 块跟踪点显示 dev 0,0。这不是无效的吗?

其他请求显示 dev 8,0,sda符合预期。dev 0,0是空设备的保留值。为什么跟踪点会在空设备上显示简历?这不是无效操作吗?

Linux内核版本和trace-cmd

0 投票
1 回答
1373 浏览

c - 内核块设备

我目前正在尝试实现一个(不是那个?)简单的内核块设备驱动程序。

我的灵感主要来自《Linux Device Drivers, 3rd Edition 》一书,该书已于 2005 年出版,不再完全是最新的。

无论如何,逻辑仍然存在,我从中学到了很多。然而,示例并不是真正有效,因为自 2005 年以来许多事情都发生了变化。

我找到了一个github 存储库,其中应更新示例以适用于最近的内核,但我认为仍有一些内容需要更新,因为我无法调整示例以使其适用于内核 4.9.0

这是我的模块的制作方法:

初始化时:

  • 将模块注册为块设备register_blkdev
  • 分配设备数据缓冲区
  • 初始化自旋锁
  • 初始化请求队列
  • 配置请求队列
  • 分配gendisk结构
  • 填充gendisk结构
  • 创建磁盘add_disk

然后我实现了一个函数来处理来自请求队列的请求事件并处理块设备上的读写事件。

这是函数:(它受到 LLD-3rd 的高度启发,并进行了一些修改以匹配当前的内核函数)

但是在编译时出现以下错误:

将文件检blkdev.h入内核 v4.9.0 标头后,该字段似乎buffer不再存在于struct request.
但是,我无法找到有关事物如何演变以及如何修改代码以使其工作的任何信息。

如果我理解得很好,该buffer字段应该是指向虚拟内核地址的指针。我想一旦这个缓冲区被填充/读取,内核就会处理与用户空间之间的数据传输。

我有点迷茫,因为如果请求不再提供内核虚拟地址,我找不到应该在哪里找到内核虚拟地址。

我怎么知道在哪里传输数据?

0 投票
3 回答
2894 浏览

amazon-web-services - 从实例元数据端点检索正确的 Amazon 附加 EBS 设备

编辑和 TL;DR:

解释:

我想提前知道特定 AWS 实例应该具有后附加的块设备。

不幸的是,2007 年引入的块设备的实例元数据端点似乎不再可靠地工作了?

t2.medium这是我在撰写本文时使用最新的 Ubuntu (17.10) AMI运行的示例实例(不是 Amazon Linux):

在此处输入图像描述

不仅 EBS 模块显示在控制台中,而且似乎已正确连接:

在此处输入图像描述

根据有关块设备映射的官方 AWS 文档

block-device-mapping/ebsN:与 Amazon EBS 卷关联的虚拟设备(如果存在)。Amazon EBS 卷仅在启动时或实例上次启动时存在时才可在元数据中使用。N 表示 Amazon EBS 卷的索引(例如 ebs1 或 ebs2)。2007-12-15

但不幸的是,在实例完全启动并运行并且附加了所有 EBS 卷之后,不存在这样的端点:

另一方面,操作系统(在 XEN 设备方案下)通过xvdXX设备公开卷:

因此,这给我留下了一个糟糕的解决方案,即仅假设哪个块设备将取决于我正在运行的实例,这可以预见会中断一次,例如,亚马逊引入了具有完全不同的底层块设备命名方案的新 Iron,例如/dev/nvme0n1p1

https://twitter.com/braincode/status/968005482102190080

以下是附加了 EBS 卷的新实例化 M5 实例上发生的情况:

  1. 为什么只ebs2列出而不列出ebs1
  2. sdf?

sd*m5 实例的操作系统上没有一个:

我究竟做错了什么?这是一个已知的错误?people/boto/cloudinit 模块如何处理呢?

0 投票
1 回答
218 浏览

c - 内核块设备 - 使用自旋锁陷入死锁

我刚刚实现了一个虚拟块设备,我想用它来探索 linux 内核如何处理块设备。

我的设备只是一个内存区域,分为两个 512 字节的扇区。

我正在使用全局结构来存储设备信息:

现在我想保护这个结构免受并发访问。为此,我正在使用该device_lock字段。
如果锁定,则结构正在更新,所以我应该等到完成。
如果不采取,我可以访问结构字段。

现在我只在以下三个函数中使用这个自旋锁

我正在使用以下功能处理请求

当我加载模块时,没有什么特别的事情发生。但是,如果我尝试从中读取,我将陷入僵局,因为我的系统不再响应并且我必须重新启动。

这是输出:

更新:添加初始化和退出函数

更新:添加宏和枚举定义

我不明白的是,block_mod_open在我尝试将自旋锁锁定到block_mod_transfer.

所以我不明白为什么当自旋锁似乎可以被采用时内核陷入死锁。

为什么我在这种情况下陷入僵局?我究竟做错了什么?

0 投票
1 回答
246 浏览

c - CHS 磁盘几何结构的可能来源

我正在尝试从块设备中确定“正确”的 CHS:

在 USB 记忆棒上使用它,我得到:

但是,fdisk --units=cylinders -l /dev/sdc给出:

可能它是从其他地方获取信息。那么它可能使用哪些其他来源?

有没有办法确定“正确”的?据我了解,CHS在现代完全是由硬件制造商任意设置的。

环境 :

  • linux 4.15.13
  • glibc 2.26-11
  • 磁盘;实用Linux 2.31.1

fdisk 库:

0 投票
1 回答
715 浏览

c - 块设备驱动程序 - 了解收到的 ioctl

我刚刚实现了一个虚拟块设备,当我在玩它时,我看到了与 ioctls 相关的奇怪行为。

我的设备只是一个内存区域,分为两个 512 字节的扇区。我目前可以使用系统调用在特定偏移量处读取/写入它。

该设备还可以防止并发写访问。它接受无限数量的读者,但一次只接受一个作家,并且只有在目前没有人阅读它的情况下。

Ioctls 尚未处理,但尽管如此,我仍在记录相关信息。

我正在玩,dd我发现了一个奇怪的行为,经过一番挖掘后我不明白。

似乎dd正在发出我的驱动程序无法(显然)处理的 ioctl 调用。我知道我不应该放弃skip=10,但seek=10因为我正在从设备上阅读,但这是出于测试目的。

我目前正在尝试了解为什么发布此 ioctl 以及出于什么目的

如果我很好地理解了我找到的文档,则 ioctl 类型'm'应该描述为以下文件之一(source):

我检查了这些文件,但找不到有用的信息来帮助我进一步了解该特定情况下发生的情况。

0 投票
0 回答
185 浏览

c - 块设备 - 在不使用探测功能的情况下获取结构设备

我目前正在学习 linux 设备驱动程序编程,我想使用块设备驱动程序控制硬件设备。

我的硬件设备使用三个引脚与环境通信

  • 时钟- 输出 --> 数据时钟
  • 数据- 双向 --> 向/从设备传输数据的线路
  • 电源- 输出 -> 设备的电源

该设备使用专有协议。它存储可以分成多个文件的数据。

我做了什么

我目前开发了一个字符设备,它可以导出到用户空间并实现了几个 ioctl。然后,我使用用户空间应用程序从设备读取/写入设备,该应用程序将设备的拆分内存抽象为单个内存区域。

实现了以下 ioctl:

  • 打开
  • POWER_OFF
  • 重置
  • SEND_COMMAND

这个实现是功能齐全的,我想通过将一对 {char_driver, userspace_app} 转换为可直接读取/写入的单个块设备驱动程序来进一步进行设备驱动程序编程。

我想做的事

对于 char 驱动程序,我用相关信息填充了一个设备树,以将其用作platform_device。从中加载有关 I/O 引脚的信息,我使用gpio调节器子系统来定义 I/O。

我想通过在插入时将相关引脚提供给驱动程序来以不同的方式实现块驱动程序。然后我也会将它用作platform_device,但我的主要目标是了解底层机制,因此我想尝试几种解决方案。

这是我所做的

有了这个实现,我可以分配 gpios,但是我在调​​节子系统上遇到了问题,因为我在插入它时有一个内核糟糕。

显然有些东西我不明白。struct device我认为问题出在我使用的已分配但从未初始化的事实,因此该devm_regulator_get函数无法在其中找到名为“power_regulator”的调节器。

所以我的问题是:

  • 我的假设对吗?
  • 是否可以在struct regulator未探测设备驱动程序时使用?
  • 如果是怎么办?
  • 如果没有,最好的选择是什么?
0 投票
1 回答
306 浏览

c - Block device - Initialize gendisk structure when not multiple of 512 bytes

I'm currently learning kernel driver programmation using Linux Device Drivers - 3rd.

To define a block device, I have to declare a gendisk structure and to initialize it with relevant informations.

In chapter 16 its written:

sector_t capacity;

The capacity of this drive, in 512-byte sectors. The sector_t type can be 64 bits wide. Drivers should not set this field directly; instead, pass the number of sectors to set_capacity.

Usualy I set the capacity using a call like:


Imagine that I have a device with a memory zone that is not a multiple of 512 bytes.

Let's take 2000 bytes so there is three 512 bytes zones plus a 464 bytes zone

  • What should I pass to set_capacity ?

Furthermore on some devices, memory is splitted into several areas. Imagine that I have a device containing multiple memory areas, each with different size and that I want to abstract this splitted memory into a single memory zone.

area1 => 32000 bytes
area2 => 512 bytes
area3 => 50 bytes
area4 => 45 bytes
area5 => 1024 bytes

In this case the hard sector size is not a constant within the device.

  • How should I fill the gendisk structure ?

UPDATE after @KamilCuk answer:

To continue with this example let's take the full device memory (33631 bytes) which is 65 sectors of 512 bytes + 1 sector of 351 bytes.

So the solutions are to present it either as:

  • 33270 bytes memory zone ==> 65 sectors

or

  • 33631 bytes memory zone ==> 66 sectors with 161 bytes discarded at the end of last sector

Are those the best solutions or there is another way to handle this specific case ?


  • Basically the question could be resumed to how to initialize a block device when it's not a multiple of KERNEL_SECTOR_SIZE?
0 投票
1 回答
217 浏览

filesystems - 非块文件系统

如果有一个基于非块的文件系统,我正在徘徊。

我知道的每个系统都存储或检索固定大小的块(块或集群)。

在外部存储(如硬盘、闪存等)的上下文中,是否有允许写入或读取单个字节的文件系统?

我用谷歌搜索,但我找不到任何结论性的东西。

谢谢。

0 投票
0 回答
79 浏览

linux - 块设备(emmc 分区)是否有文件结束标记?

我需要计算 emmc 分区的 sha1sum,显然这涉及读取分区的内容(如果它是相关的 - 分区是 ext4 格式的)。

我正在/dev/mmcblkp**像任何其他 fd 一样执行读取操作:

这个对吗?我可以期望 read 在 EOF 上返回 0 还是在块设备上没有 EOF 这样的东西?