• linux系统调用与文件系统


    写这篇博客呢,分析下字符设备与块设备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函数,(对于字符设备是这样的),对于块设备就要进入对应的文件系统了。

    好图分享:

  • 相关阅读:
    2010上交:计算表达式
    添加子评论
    上传图片
    settings配置 文件操作
    django 操作前端数据
    静态文件配置
    render httprequest
    上传文件配置
    Django为什么要跳转到不同的页面来实现不同的功能
    定义日志器
  • 原文地址:https://www.cnblogs.com/autum/p/vfs.html
Copyright © 2020-2023  润新知