代码改变世界

linux系统调用与文件系统

2012-08-27 14:42  至上  阅读(841)  评论(0编辑  收藏  举报

写这篇博客呢,分析下字符设备与块设备open read的相同点和不同点。

     大家都知道在linux系统中设备都是按照文件来管理的,用户需要操作也是使用操作文件的思想。这里的文件是普通文件,就是存储在块设备中的普通文件(.c .txt),所以他们的第一个不同点就是,对于块设备没有read或者write的操作,原因是你需要操作的知识块设备中的一个文件,比如说sd卡中存放了n多的文件,你一次只会操作一个文件,所以你应该读你想要的文件而不是整个块设备,所以在块设备驱动中没有read函数实现,你需要使用的read函数都在块设备文件系统中实现了,比如ext2,fat32等。虽然最终向块设备发送命令是由驱动完成的。而字符设备就好比是一个单独的文件,字符驱动中的读写函数就对应了这么一个唯一的文件。

    当你使用fd=open(“/dev/sd2”...)fd=open(“file”...)这样的操作时,对于字符设备你知道最终会调用你写的那些读写函数,那么为什么呢?

    先认识一点,你的这些操作都是在一个应用程序中,在运行时就是一个用户进程。这个关系到open返回是一个整数,而不是file文件结构体。因为在task_struct(对于进程的描述)结构体中有一个file结构体数组,你打开的文件file描述都放在里面,而整数fd只是说明是数组中的第几个,因为一个进程可以打开32个文件或许更多。

    好吧这是结果,过程是这样的:当执行open函数时,进行系统调用,就是触发一个软件中断,这个软件中的是固定的,x86里面是0x80中断,然后把open及其参数放在一些固定的寄存器中,open本身对应一个系统调用号,read wtite都有自己的系统调用号,准备好之后就进入软件中断处理子程序,好吧现在进入内核了,跟用户已经没有关系了,这个中断子程序接管执行后,先判断系统调用号,比如判断结果是open,然后跳转到open系统执行函数sys_open()。主要做了两件事,第一创建file结构体,(每打开一个文件都要有这样一个结构体用于描述该文件),第二执行驱动中定义的open函数,(对于字符设备是这样的),对于块设备就要进入对应的文件系统了。

好图分享: