在Linux世界中,我了解到用户空间程序要与任何硬件设备进行通信,都有相应的文件,例如,下面是设备的文件,
硬盘:
/dev/sd*
CD 和 DVD 驱动器:
/dev/sr*
PATA 硬盘:
/dev/hd*
端子:
/dev/tt*
、/dev/pts/*
和/dev/tty
串口:
/dev/ttyS*
并行端口:
/dev/lp0
和/dev/lp1
音频设备 :
/dev/snd/*
、/dev/dsp/
等dev/audio
我的理解是,
在Linux世界中(与Windows不同),除了文件存储之外,文件系统还用于IO通信。
所以,设备驱动对于任何相应的硬件设备,实际上会填充此类文件中的数据(例如/dev/sd*
),这实际上是从设备发送/接收的数据。这使得用户空间程序能够使用这些文件从设备读取/写入。例如,下面是使用C的用户空间程序,
int fd;
struct termios *oldser,*newser,*oldter,*newter;
oldser=(struct termios *)malloc(sizeof(struct termios));
newser=(struct termios *)malloc(sizeof(struct termios));
oldter=(struct termios *)malloc(sizeof(struct termios));
newter=(struct termios *)malloc(sizeof(struct termios));
fd=openSerial("/dev/ttyS1");
setSerial(fd,oldser,newser);
/* next stop echo and buffering for stdin */
tcgetattr(0,oldter);
tcgetattr(0,newter); /* get working stdtio */
问题:
当你说,一切都是文件或进程,
这是否意味着我对在 Linux 内核(或 UNIX)中使用文件执行 IO 的上述理解?请纠正我。
答案1
在Linux世界中,我了解到用户空间程序要与相应的文件进行通信,才能真正与任何硬件设备进行通信
这是 Unix 范例,但在 Linux 中并不总是如此(虽然我对原始 Unix 不太熟悉,但我怀疑即使在 Linux 中也是如此)。
在Linux世界中(与Windows不同),除了文件存储之外,文件系统还用于IO通信。
并不真地。例如,匿名管道不存在文件系统,即使使用命名管道,数据本身也不会通过文件系统。
因此,任何相应硬件设备的设备驱动程序实际上都会填充此类文件中的数据(例如 /dev/sd*)
事实并非如此填充文件,它只处理特殊文件的读/写/ioctl。文件系统永远看不到这些操作。
当你说一切都是文件或进程时,这是Linux内核(或UNIX)中使用文件执行IO的方法吗?
有点。该范例是,它不应该具有从磁盘读取和写入的单独函数,而是应该实现文件接口,以便您可以将磁盘传递给可以处理文件的程序。因此,例如,您可以访问hexdump
磁盘的内容,即使hexdump
可能没有特定于处理磁盘的代码。