第五章 Linux文件系统与设备文件

文章介绍了Linux下的文件操作,包括创建、打开、读写、关闭等系统调用,以及文件系统的目录结构,如/bin、/sbin、/dev等。此外,还讨论了设备管理,如devfs和udev的工作机制,以及udev如何处理设备的动态添加和移除。
摘要由CSDN通过智能技术生成

5.1 Linux文件操作

  1. Linux的文件操作系统调用涉及创建、打开、读写、关闭。
    1. 创建:int creat(const char *filename, mode_t mode)
    2. 打开:
      1. int open(const char *pathname, int flags); 
      2. int open(const char *pathname, int flags, mode_t mode);
        1. fiags文件打开标志

        2. 文件访问权限

      3. 文件打开成功,open函数会返回一个文件描述符
      4. Linux用5个数字来表示文件的各种权限:第一位表示设置用户ID;第二位表示设置组ID;第三位表示用户自己的权限位;第四位表示组的权限;最后一位表示其他人的权限。
    3. 读写:
      1. 读:int read(int fd, const void *buf, size_t length); 
        返回值为实际读取字节数
      2. 写:int write(int fd, const void *buf, size_t length);
        返回值为实际写入字节数
    4. 定位:int lseek(int fd, offset_t offset, int whence);
    5. 关闭:int close(int fd);
  2. C库文件操作:fopen、fread、write、fclose等

5.2 Linux文件系统

  1. 文件系统结构目录
    1. /bin包含基本命令,如ls、cp、mkdir等,这个目录中的文件都是可执行的。
    2. /sbin包含系统命令,如modprobe、hwclock、ifconfig等,大多是涉及系统管理的命令,这个目录中的文件都是可执行的。
    3. /dev设备文件存储目录,应用程序通过对这些文件的读写和控制以访问实际的设备。
    4. /etc系统配置文件的所在地,一些服务器的配置文件也在这里,如用户账号及密码配置文件。busybox的启动脚本也存放在该目录。
    5. /lib系统库文件存放目录等
    6. /mnt这个目录一般是用于存放挂载储存设备的挂载目录
    7. /optopt是“可选”的意思,有些软件包会被安装在这里
    8. /proc操作系统运行时,进程及内核信息(比如CPU、硬盘分区、内存信息等)存放在这里。/proc目录为伪文件系统proc的挂载目录,proc并不是真正的文件系统,它存在于内存之中。
    9. /usr这个是系统存放程序的目录,比如用户命令、用户库等
    10. /tmp用户运行程序的时候,有时会产生临时文件,/tmp用来存放临时文件。
    11. /var表示的是变化的意思,这个目录的内容经常变动,如/var的/var/log目录被用来存放系统日志
    12. /sys  Linux设备驱动模型中的总线、驱动和设备都可以在sysfs文件系统中找到对应的节点。当内核检测到在系统中出现了新设备后,内核会在sysfs文件系统中为该新设备生成一项新的记录。
  2. Linux文件系统与设备驱动


    应用和VFS(虚拟文件系统)接口为系统调用,VFS与文件系统设备文件接口是file_operations结构体成员函数。
  3. 块设备的访问:
    1. 直接访问裸设备
    2. 通过文件系统
  4. file结构体:由内核打开文件时创建:f_mode、f_flags、private_data等为该结构体的成员变量
  5. inode结构体:包含文件访问权限、属主、组、大小、生成时间、访问时间、最后修改时间等
  6. 设备号类型dev_t,高12位为主设备号,低20位为次设备号
    1. 可以通过查看 /proc/devices文件获知已注册的设备
    2. 查看 /dev可以获知系统中包含的设备文件
    3. 同一类设备一般主设备号相同
    4. 序号一般从0开始
       

5.3 devfs(设备文件系统)

  1. Linux 2.4引入,使设备驱动程序能自主管理自己的设备文件
  2. devfs的优点:
    1. 程序在设备初始化时在 /dev目录下创建设备文件,卸载时删除
    2. 设备驱动程序可以指定设备名、所有者和权限位,用户空间程序仍可以修改所有者和权限位。
    3. 不再需要为设备驱动程序分配主设备号以及处理次设备号
       

5.4 udev用户空间设备管理

  1. udev在2.6内核版本代替了devfs,是一种工作在用户态的用户程序
  2. devfs工作在内核态,udev完全在用户态工作,利用设备加入或移除时内核所发送的热插拔事件来工作
  3. 采用devfs,当一个并不存在的/dev节点被打开的时候,devfs能自动加载对应的驱动,而udev则不这么做。这是因为udev的设计者认为Linux应该在设备被发现的时候加载驱动模块,而不是当它被访问的时候。
  4. sysfs是3.6版本引入的虚拟文件系统,可以产生一个包括所有系统硬件的层级视图,展示设备驱动模型中各组件的层次关系。
  5. 在include/linux/device.h中用 bus_type、device_driver、device 描述总线、驱动和设备。
  6. device_driver和device分别表示驱动和设备,二者必须依附于一种总线,都包含struct bus_type指针。
  7. 设备和驱动时分开注册的(有设备不一定有驱动,反之亦然),二者通过bus_type的match()函数进行匹配,匹配成功后,xxx_driver中的probe()函数就会被执行。
  8. 工作机制:
    1. 系统检测到新设备后,内核会通过netlink套接字发送uevent
    2. udev获取内核发送的信息,进行规则的匹配。
  9. 匹配关键字:ACTION(行为)、KERNEL(匹配内核设备名)、BUS(总线类型)、SUBSYSTEM(子系统)、ATTR(属性)
  10. 可以借助udev中的udevadm info工具查找规则文件能利用的内核信息和sysfs属性信息
  11. 如果/dev/下面的节点已经被创建,但是不知道它对应的/sys具体节点路径,可以采用“udevadm info-a-p$(udevadm info-q path-n/dev/<节点名>)”命令反向分析
  12. mdev是busybox中udev的轻量级版本,vold是安卓中的
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值