ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Unix/Linux编程:设备文件、磁盘、磁盘分区

2021-05-25 15:01:05  阅读:177  来源: 互联网

标签:文件 驱动程序 Unix 内核 Linux 磁盘 磁盘分区 ID 设备


设备文件

设备文件(设备专用文件)与系统的某个设备相对应。

  • 在内核中,每种设备类型都有与之相对应的设备驱动程序, 用来处理设备的所有IO请求。
    -设备驱动程序属于内核代码单元,可以执行一系列操作,通常与相关硬件的输入/输出动作相对应
  • 由设备驱动程序提供的API是固定的,包含的操作对应于系统调用open()、close()、read()、write()、mmap()以及 ioctl()。
  • 每个设备驱动程序所提供的接口一致,这隐藏了每个设备在操作方面的差异,从而满足了IO操作的通用性

某些设备是实际存在的,比如磁盘、鼠标、磁带设备。而另一些设备则是虚拟的,也就是不存在相应硬件,但是内核会(通过设备驱动程序)提供一种抽象设备,其所携带的API与真实设备一般无异。

可以将设备划分为虾米两种空闲

  • 字符型设备基于每个字符来处理数据。终端和键盘都属于字符型设备
  • 块设备则每次处理一块数据。块的大小取决于设备类型,但通常为 512 字节的倍数。磁盘和磁带设备都属于块设备

与其他类型的文件一样,设备文件总会出现在文件系统中,通常位于/dev 目录下。

在 Linux 的早期版本中,/dev 包含了系统中所有可能设备的条目,即使某些设备实际并未与系统连接。这意味着/dev 会包含数以千计的未用设备项,从而导致了两个缺点:

  • 其一,对于需要扫描该目录内容的应用而言,降低了程序的执行速度;
  • 其二,根据该目录下的内容无法发现系统中实际存在哪些设备。

Linux2.6 运用 udev 程序解决了上述问题。该程序所依赖的 sysfs文件系统,是装载于/sys 下的伪文件系统,将设备和其他内核对象的相关信息导出至用户空间。

设备ID

  • 每个设备文件都有主、辅 ID 号各一。
    • 主 ID 号标识一般的设备等级,内核会使用主 ID 号查找与该类设备相应的驱动程序。
    • 辅 ID 号能够在一般等级中唯一标识特定设备。

命令 ls –l可显示出设备文件的主、辅 ID

设备文件的i节点中记录了设备文件的主、辅 ID 。每个设备驱动程序都会将自己与特定主设备号的关联关系向内核注册,借此建立设备专用文件和设备驱动程序之间的关系。内核是不会使用设备文件名来查找驱动程序的。

在 Linux 2.4 以及更早的版本中,系统的设备总数受限于这一事实:设备的主、辅 ID 只能用 8 位数来表示。加之主设备 ID 固定不变,且为统一分配(由 Linux 命名和编号机构分配),使得上述问题更为严重。Linux 2.6 采用了更多位数来存放主、辅ID(分别为 12 位和 20 位),从而缓解了这一问题

磁盘与分区

常规文件和目录通常放在硬盘设备里(其他设备也能存放文件和目录,比如CD-ROM、flash 内存卡以及虚拟磁盘等)。

磁盘驱动器

硬盘驱动器是一种机械装置,由一个或多个高速旋转(每分钟旋转数以千计)的盘片组成。通过在磁盘上快速移动的读/写磁头,便可获取/修改磁盘表面的磁性编码信息。磁盘表面信息物理上存储于称为磁道(track)的一组同心圆上。磁道自身又被划分为若干扇区,每个扇区则包含一系列物理块。物理块的容量一般为 512 字节(或 512 的倍数),代表了驱动器可读/写的最小信息单元。

尽管现代磁盘速度很快,但读写磁盘信息耗时依然不菲。首先,磁头要移动到相应磁道(寻道时间);然后,在相应扇区旋转到磁头下之前,驱动器必须一直等待(旋转延迟);最后,还要从所请求的块上传输数据(传输时间)。执行上述操作所耗费的时间总量通常以毫秒为单位。相形之下,同样的时间可供现代 CPU 执行数百万条指令

磁盘分区

可以将每块磁盘划分为一个或者多个(不重叠的)分区。内核将每个分区视为位于/dev路径下的单独设备

系统管理员可使用 fdisk 命令来决定磁盘分区的编号、大小和类型。命令 fdisk –l 会列出磁盘上的所有分区。Linux 专有文件/proc/partitions 记录了系统中每个磁盘分区的主辅设备编号、大小和名称

磁盘分区可以容纳任何类型的信息,但是通常只会包含下面之一:

  • 文件系统:用来存放常规文件
  • 数据区域:可以作为裸设备对其进行访问
  • 交换区域:供内核的内存管理只用。

可通过 mkswap(8)命令来创建交换区域。特权级进程(CAP_SYS_ADMIN)可利用 swapon()系统调用向内核报告将磁盘分区用作交换区域。swapoff()系统调用则会执行反向功能—告之内核,停止将磁盘分区用作交换区域。尽管 SUSv3 并未对上述系统调用进行规范,但它们却获得了许多 UNIX 实现的支持。其他信息请参考 swapon(2)、swapon(8)手册页。

可使用 Linux 专有文件/proc/swaps 来查看系统中当前已激活交换区域的信息。其中包括每个交换区域的大小,以及在用交换区域的个数

标签:文件,驱动程序,Unix,内核,Linux,磁盘,磁盘分区,ID,设备
来源: https://blog.csdn.net/zhizhengguan/article/details/117255674

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有