我正在尝试实施"simple file-system"以获取我的个人经验 . 为此,我创建了一个块设备驱动程序,我将以块为单位执行读/写操作 . 现在我的问题是如何从用户应用程序对块设备执行 open, read, write and close 操作 .
我实际上正在寻找的是一个函数,我可以打开块设备 /dev/sbd 并返回 struct block_device
,如果成功的话 . 对于读/写功能,我可以发出阻止设备 struct request
的请求,参数为"buffer, sectore_number, numbe_of_sectors" .
直到现在我只有 block_read()
和 block_write()
功能 . 但似乎它们是BSD特定的 . 我正在使用Debain .
谁有想法呢?谢谢 .
1 回答
我一直在做类似的事情,编写一个适用于文件或设备的应用程序级文件系统 . 您正在编写的内容并不是设备驱动程序,因为内核直接处理/使用设备驱动程序 . 用户应用程序无法直接访问 . 无论如何,我想指向函数调用open(2),read(2),write(2),close(2)(所有这些函数的手册页第2节) . 您将需要unistd.h头文件来使用它们 . 在调用读写时,可以将读/写大小设置为块大小的倍数 . 但最终,你仍然在经历内核 .
编辑:经过进一步的检查和评论,设备驱动程序确实在内核中 . 通常,驱动程序和应用程序之间没有直接连接,因为内核中有几层代码来抽象设备,因此它看起来像应用程序的其他所有内容一样 .
有两种方法可以解决这个问题 . 一种是在系统调用树中 Build 一个或多个系统调用,以将设备驱动程序的读/写例程暴露给应用程序 . 我的另一个想法是使用ioctl(I / O控制)系统调用来执行此操作,但此调用旨在控制实际设备 . 例如,硬盘使用读写命令来传输数据,但是要与硬盘驱动器通信以获取有关它的信息,例如最后一个LBA是什么或获得它的身份,你可以使用IOCTL来做到这一点 .
希望这可以帮助 .