要使用символьный драйвер- 我们需要创建файл устройста,它是специальный файлor узел дерева файловой системы。对于需要什么,我有两种意见,请告诉我哪一种是正确的(如果有的话)。
1) 这是一个用作一种接口的文件。例如,当我们编写这样的命令echo "hello" > /dev/my_driver时,该行"hello"不是写入文件本身/dev/my_driver,而是写入内核提供给我们的缓冲区。函数等也一样open,read它们并不打开文件本身,而只是简单地发出信号,表明有必要创建和打开某个文件或读取数据。
2)这是一个常规文件,我们将数据写入其中并从那里读取。使用相同的命令echo "hello" > /dev/my_driver,字符串"hello"将直接写入文件/dev/my_driver。
tl;博士
相反,正确的选项是(1);读/写由设备驱动程序直接处理,可能没有中间缓冲区(尽管通常它在内核空间中)。
open()call /read()itd通常会发生什么?在系统调用中,新条目 () 被放置在与当前运行进程 () 的结构相关联的
open()文件描述符 () 数组中,其中包含以打开文件 ( ) 标识的结构。同时,在这个结构的字段中记录了可以用这个文件()执行的一组操作。结果,该调用仅返回上述数组中新选定条目的编号。current->files->fdt->fdcurrentstruct fdstruct filef_opstruct file_operationsopen()该调用
read()本质上只是从数组中获取文件描述符fdgetpos(),检查读/写权限,并调用与文件关联的已定义读操作。所有其他调用的工作方式类似 -
write/mmap/ioctl等等。那么从普通文件和设备文件读取有什么区别呢?
其实什么都没有:唯一的区别是
struct files_struct打开时的一组操作( )不是取自文件系统驱动程序,而是取自设备驱动程序。伪文件系统中的文件/proc和/sys.如果我们谈论设备文件(还有其他伪文件),那么它们与普通(“常规”)文件的区别在于:
来自 /proc、/sys 等目录的伪文件的情况完全相同。写入这些文件(如果您具有访问权限)会导致操作系统行为发生变化,而根本不会导致(假定)写入的字节存储在某处。
磁盘驱动器设备伪文件有一种特殊情况。虽然可以在 /dev/sda1 上执行读/写操作,但只有结果会出乎意料,因为 I/O 操作不会在文件(位于磁盘内部)上执行,而是在形成 FS 的块上执行这个磁盘的。
一首很特别的歌——网卡、共享内存等的伪文件。它们专门用于控制这些设备,而 I/O 操作由构成套接字系统的特殊 IOCTL 命令执行。
总之,这是一个复杂而庞大的话题。