- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在为 Linux 编写 block 设备驱动程序。支持不安全移除(如 USB 拔出)至关重要。换句话说,我希望能够在不造成内存泄漏/崩溃的情况下关闭 block 设备,即使应用程序持有打开的文件或在我的设备上执行 IO 或者如果它已安装文件系统。当然,不安全的删除可能会损坏存储在设备上的数据,但这是客户愿意接受的。
这是我完成的基本步骤:
然而,这是一个非常困难的机制,需要大量代码并且极易出现竞争条件。我仍然在为极端情况、IO 的 per_cpu 计数和偶尔的崩溃而苦苦挣扎
我的问题:内核中是否有一种机制已经做到了这一点?我搜索了 block 设备驱动程序、ram 磁盘和 USB 驱动程序的手册、文献和无数源代码示例,但找不到解决方案。我敢肯定,我不是第一个遇到这个问题的人。
已编辑:我从 Dave S 的下面的答案中了解到热插拔机制,但它对我没有帮助。我需要一个关于如何安全关闭驱动程序而不是如何通知内核驱动程序已关闭的解决方案。
一个问题的例子:blk_queue_make_request() 注册了一个函数,我的 block 设备通过该函数提供 IO。在该函数中,我增加了 per_cpu 计数器以了解每个 cpu 正在运行的 IO 数量。然而,存在调用函数的竞争条件但计数器尚未增加,所以我的设备认为有 0 个 IO,释放资源然后 IO 出现并使系统崩溃。据我所知,Hotplug 不会帮助我解决这个问题
最佳答案
大约十年前,我在一个软件驱动程序项目中使用热插拔来安全地添加/删除连接到嵌入式 Linux 驱动机顶盒的外部 USB 磁盘驱动器。
对于您的项目,您还需要编写热插拔。热插拔是内核用来在发生某些重要(通常与硬件相关)事件时通知用户模式软件的程序。例如,刚插入或拔出 USB 设备时。
从 Linux 2.6 内核开始,热插拔已与驱动模型核心集成,因此任何总线或类都可以在添加或删除设备时报告热插拔事件。
在内核树中,/usr/src/linux/Documentation/usb/hotplug.txt 包含有关支持热插拔的 USB 设备驱动程序 API 的基本信息。另请参阅此链接和 GOOGLE 以获取示例和文档。
http://linux-hotplug.sourceforge.net/
可以在此处找到另一个非常有用的文档,该文档讨论了 block 设备的热插拔:
https://www.kernel.org/doc/pending/hotplug.txt
本文档还提供了一个很好的示例来说明热插拔事件处理:
下表列出了您应该注意的主要变量:
每个热插拔事件至少应该提供以下变量:
ACTION
The current hotplug action: "add" to add the device, "remove" to remove it.
The 2.6.22 kernel can also generate "change", "online", "offline", and
"move" actions.
DEVPATH
Path under /sys at which this device's sysfs directory can be found.
SUBSYSTEM
If this is "block", it's a block device. Anything other subsystem is
either a char device or does not have an associated device node.
还为某些设备提供了以下变量:
MAJOR and MINOR
If these are present, a device node can be created in /dev for this device.
Some devices (such as network cards) don't generate a /dev node.
DRIVER
If present, a suggested driver (module) for handling this device. No
relation to whether or not a driver is currently handling the device.
INTERFACE and IFINDEX
When SUBSYSTEM=net, these variables indicate the name of the interface
and a unique integer for the interface. (Note that "INTERFACE=eth0" could
be paired with "IFINDEX=2" because eth0 isn't guaranteed to come before lo
and the count doesn't start at 0.)
FIRMWARE
The system is requesting firmware for the device.
关于c - 如何在 Linux 中不安全地删除 block 设备驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42480410/
iphone设备UDID、iphone设备ID和iphone设备Token之间有什么区别? 通常,当我们使用苹果推送通知服务时,会使用 iPhone 设备 token 。 但我的目标只是识别唯一的 i
我们使用 firebase 从服务器向 Android 和 IOS 设备发送通知,并且我们使用旧版 FCM 发送通知。但是当我们的应用程序在后台时,通知由系统本身处理,因此我们无法通过应用程序处理它。
在 Google 上搜索后,我发现人们说只能通过“MFi 程序”将 iOS 设备与非 iOS 设备连接起来。这是真的吗? 我的项目主要集中于直接通过蓝牙与Arduino设备发送和接收信息。 iOS和非
所以我有一个通用应用程序,我正在设置 UIScrollView 的内容大小。显然,iPhone 和 iPad 上的内容大小会有所不同。如何为 iPad 设置某种尺寸,为 iPhone 和 iPod t
问题:如何在 pod 中使用连接到主机的原始设备作为 block 设备。 我尝试使用类型为“BlockDevice”的“hostPath” volumes: - my-data: hostPath
Implemented GCKDeviceScannerListener Singleton Class on ViewController, however its delegate methods
我有一个 (PhoneGap) 应用程序,它将成功获得 Passbook 通行证,并且还将成功接收与 Passbook 分开的推送通知(当伪造设备 ID 时)。 我遇到的问题是发送给注册设备的设备 I
我正在尝试找到一种方法,通过我目前正在使用的 iOS 应用程序访问我的信标的电池电量。我正在使用 Kontakt 的 iBeacon 设备。我浏览了 Estimote iOS SDK,他们提供了一种实
我正在努力让 CUDA 应用程序也能监控 GPU 的核心温度。可通过 NVAPI 访问该信息。 问题是我想确保在运行代码时监控的是同一个 GPU。 但是,似乎有信息表明我从 NvAPI_EnumPhy
从沙箱模式到生产模式,设备 token 有何不同? 我认为我已将一些设备 token 锁定为生产模式,并且无法将它们从开发中插入。 关于如何检查有什么想法吗? 最佳答案 当您使用开发证书构建应用程序时
目录 /run/user/1000/gvfs 和 ~/.gvfs 分别是空的和不存在的。我的图形文件管理器 (Thunar) 能够检测和访问设备的内部和外部存储器。 命令 gvfs-mount -l
我有一个 Android 平板电脑,它有一个迷你 USB 端口和一个 USB 端口,我想编写一个与 USB key 通信的应用程序。我写了一个demo来找出U盘,但是没有任何反应。 令我不安的是,如果
我们将 PHP 版本从 5.4.25 更改为 5.4.45,并在服务器上安装了 MS SQL 驱动程序。在更改服务器之前,一切正常,但在更改服务器之后,我遇到了 Web 服务问题。我们的身份验证 So
我想知道是否有人使用此 API 在 Android 设备上同时从 2 个后置摄像头捕获图像或视频:https://source.android.com/docs/core/camera/concurr
我正在为客户构建一个物联网解决方案,网络管理员坚持要求设备仅通过访客网络进行连接,该网络有一个强制门户,其中的服务条款必须通过按下 UI 按钮来接受,然后才能获得外部互联网访问。到目前为止,我见过的大
我无法弄清楚这里的格式规则..在我的示例中,代码行太多,无法为每行添加 4 个空格,因此这里是我需要帮助的代码的链接 http://nitemsg.blogspot.com/2011/01/heres
如果我在我的设备上接受推送通知,并且不保存设备 token ,那么我如何在自定义 View 中查看设备 token 或恢复警报 View ? 我删除了应用程序并重新安装,但看不到设备 token 警报
我试图找出在尝试并行比较和复制设备 block 与 pthreads 时我做错了什么。看起来我正在脱离同步并且比较阶段无法正常工作。任何帮助将不胜感激 #ifndef __dbg_h__ #defin
我刚刚写完所有这些内容,但这个红色的小栏告诉我我不能发布图片或两个以上的链接。因此,如果您可以引用 this Imgur album , 那简直太好了。谢谢。 我在这里相对较新,甚至对 android
我需要启用 mysql 常规日志并将其通过 nsf 移动到我系统中的另一个驱动器/设备! 所以,我在 my.cnf 中启用了它: general_log = 1 general_log_fi
我是一名优秀的程序员,十分优秀!