设备文件系统/dev

设备文件系统/dev

(整理自维基百科)

-----------------------------------------------------------------------------

在类Unix操作系统中,设备文件系统允许软件通过标准输入输出系统调用与驱动程序交互,从而简化了许多任务。

设备文件系统包括设备文件、设备节点、设备特定文件,它们是驱动程序的接口,而在文件系统中,它们就像是普通文件。在微软的MS-DOS和Windows等操作系统中,也有专门的设备文件。

设备文件通常为周边设备提供简单的接口,如打印机。它也可访问这些设备的特定资源,如硬盘。它还可以访问没有连接到任何真实设备的系统资源,如数据接受器和随机数发生器。

MS-DOS的设备文件借鉴了Unix的特殊文件的概念。MS-DOS的早期版本并不支持文件目录层次,设备文件的文件名被设定为保留字以区分普通文件,新文件或新目录不能够使用这些设备文件的文件名。

在类Unix操作系统中包含两类设备节点,分别为字符文件与块文件。它们的区别是操作系统和硬件如何向它们读写数据。它们合称为设备特定文件,与之对应的是命名管道,它既不连接到任何设备,也不是一个文件。

-----------------------------------------------------------------------------

实现

本质上讲,设备节点对应于操作系统分配的资源。Unix通过存放于节点结构中的主数和次数来识别这些资源。在各种操作系统和系统平台上,这些数都是被唯一分配的。通常,主数用于指定驱动程序,而次数用于指定驱动程序控制的某一特定设备(驱动程序可能控制多个设备),在这种情况下,系统可能把次数作为参数传给驱动程序。

计算机就像对待普通文件那样,用标准系统调用访问设备节点。根据硬件的接口类型和操作系统处理输入输出的方式,设备文件可以分成两类。

-----------------------------------------------------------------------------

设备

--------------------------

字符设备是指每次与系统传输1个字符的设备。这些设备节点通常为传真、虚拟终端和串口调制解调器之类设备提供流通信服务,它通常不支持随机存取数据。

字符设备在实现时,大多不使用缓存器。系统直接从设备读取/写入每一个字符。

块设备

      块设备是指与系统间用块的方式移动数据的设备。这些设备节点通常代表可寻址设备,如硬盘、CD-ROM和内存区域。

块设备通常支持随机存取和寻址,并使用缓存器。操作系统为输入输出分配了缓存以存储一块数据。当程序向设备发送了读取或者写入数据的请求时,系统把数据中的每一个字符存储在适当的缓存中。当缓存被填满时,会采取适当的操作(把数据传走),而后系统清空缓存。

伪设备

      在类Unix操作系统中,设备节点并不一定要对应物理设备。没有这种对应关系的设备是伪设备。操作系统运用了它们提供的多种功能。部份经常使用到的伪设备包括:

/dev/null

接受和丢弃所有输入;即不产生任何输出。

/dev/full

永远在被填满状态的设备。

/dev/loop

Loop设备

/dev/zero

产生连续的NUL字符的串流(数值为0)。

/dev/random

产生一个虚假随机的任意长度字符串流。(Blocking)

/dev/urandom

产生一个虚假随机的任意长度字符串流。(Non-Blocking)

-----------------------------------------------------------------------------

创建节点

    节点是由mknod系统调用创建的。在命令行中,有同名的程序来创建节点。rename和unlink系统调用可以用于移动和删除节点,相应的命令是mv和rm。在使用cp命令时加上-R或-a参数,可以创建一个与原设备节点具有同样属性的节点。

-----------------------------------------------------------------------------

命名约定

在基于Linux的系统中,设备节点一般在/dev下,通常使用如下的前缀:

fb:frame缓冲

fd:软盘

hd:IDE硬盘

lp:打印机

par:并口

pt:伪终端

s:SCSI设备

scd:SCSI音频光驱

sd:SCSI硬盘

sg:SCSI通用设备

sr:SCSI数据光驱

st:SCSI磁带

tty:终端

ttyS:串口

大部分设备的前缀名后面跟随一个数字,它唯一指定某一设备。硬盘驱动器的前缀名后面跟随一个字母和一个数字,字母用于指明设备,而数字用于指明分区。因此,/dev/sda3指定了硬盘上的一个分区,/dev/pts/14指定了一个网络终端会话。

一些Linux发行版用SCSI层访问所有固定硬盘,因此虽然一块硬盘可能并不是SCSI硬盘,但仍可以通过sd设备访问它。

-----------------------------------------------------------------------------

关于/dev/zero

在类UNIX 操作系统中, /dev/zero 是一个特殊的文件,当你读它的时候,它会提供无限的空字符(NULL, ASCII NUL, 0x00)。其中的一个典型用法是用它提供的字符流来覆盖信息,另一个常见用法是产生一个特定大小的空白文件。BSD就是通过mmap把/dev/zero映射到虚地址空间实现共享内存的。可以使用mmap将/dev/zero映射到一个虚拟的内存空间,这个操作的效果等同于使用一段匿名的内存(没有和任何文件相关)。

下面的方法可以用于破坏分区数据:

# 请不要执行下列代码,除非你试图破坏分区上的全部数据!

dd if=/dev/zero of=/dev/<destination partition>

创建一个名为'foobar'大小为1 MiB的文件,以"0"填充:

dd if=/dev/zero of=foobar count=1024 bs=1024

与/dev/null类似,/dev/zero也可以作为一个数据源或数据池,所有写往/dev/zero将返回成功,没有其他影响,/dev/null也是一样,但是作为数据池更常用。所有对/dev/zero的读操作,将返回请求数目的"NUL"字节.

-----------------------------------------------------------------------------

关于/dev/full

类Unix系统中,/dev/full,或常满设备是一个特殊设备文件,总是在向其写入时返回设备无剩余空间(错误码为ENOSPC),读取时则与/dev/zero相似,返回无限的空字符(NULL, ASCII NUL, 0x00)。这个设备通常被用来测试程序在遇到磁盘无剩余空间错误时的行为。

$ echo "Hello world" > /dev/full

bash: echo: write error: No space left on device

-----------------------------------------------------------------------------

关于/dev/random

1994年,曹予德第一次在Linux的内核空间中实现了随机数发生器[1][2]。 该实现使用了SHA-1散列算法,而不是密码,以避免随机数产生器编码地的法律限制。该实现在设计时,假定任意给定的散列或密码最终都可能被发现是弱的,因此它可以耐受任意形式的这些弱点。

在这个实现中,发生器保存了来自熵池中噪声的数据位数的估计值,而随机数是从该熵池中创建的。在读取时,/dev/random设备只会返回熵池中噪声数据中的随机字节。/dev/random应当可以适用于要求非常高质量随机性的应用,例如产生公钥或一次性密码本。若熵池空了,对/dev/random的读操作将会被阻塞,直到收集到了足够的环境噪声为止[3]。

这样的设计使得/dev/random是真正的随机数发生器,提供了最大可能的随机数据熵,建议用于产生保护高价值或长保护周期的密钥。

/dev/random的一个副本是/dev/urandom ("unlocked",非阻塞的随机数发生器[4]),它会重用内部池中的数据以产生伪随机数据。这表示对/dev/urandom的读取操作不会产生阻塞,但其输出的熵可能小于/dev/random的。该设备文件是设计用于密码学安全的伪随机数发生器的,可以用于安全性较低的应用。

/dev/random也允许写入,该操作允许任意用户向池中加入随机数据。即使写入非随机数据亦是无害的,因为只有管理员可以调用ioctl以增加熵池大小。Linux内核中当前熵的值和大小可以通过访问/proc/sys/kernel/random/得到。

2006年3月,Gutterman,Pinkas和Reinman发表了对Linux随机数发生器的详细密码学分析[5],其中提出了该发生器的几个弱点。也许其中最严重的问题发生在嵌入式系统和Live CD系统,类似路由器和无盘工作站中的应用。在这些系统中,引导状态是可预测的,且环境熵的来源也较为受限。对于有NVRAM的系统,他们建议在关机时保存一部分随机数发生器的状态,使得在下次开机时可以恢复这些状态。对于路由器而言,网络数据是熵的主要来源,他们认为在重启前后保存和恢复数据可能要求潜在的攻击者要么qieting从路由器投入使用开始全部的网络信息,或直接获取路由器的内部状态。他们写道,这个问题对于无线路由器而言尤其关键,因为其网络信息可以远程获取到,并可能用于产生数据加密用密钥的随机发生器。

----------------------------------------------------------------------------

http://www.360doc.com/content/11/0210/11/2104556_91811710.shtml

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值