Chinaunix首页 | 论坛 | 博客
  • 博客访问: 138693
  • 博文数量: 20
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 247
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-12 22:24
个人简介

学霸

文章分类

全部博文(20)

文章存档

2016年(1)

2015年(11)

2014年(8)

我的朋友

分类: LINUX

2015-09-14 11:02:58

设备驱动:Linux通过叫做设备驱动的模块化组件与硬件设备交互。
     设备驱动从硬件设备操作系统层面隐去了通信协议特性,并允许系统通过标准化接口与设备交互。

设备文件:Linux 提供了一种进程与设备驱动通信并进一步操作硬件设备的机制——通过设备文件对象交互。
     这些对象出现在文件系统中,程序可以把它们当成普通文件来操作,通过这些类文件对象与硬件设备进行交互。

注意
1.设备文件仅仅是一个用于与驱动程序沟通的入口。建立设备文件并不代表对应的设备或硬件驱动已经安装加载成功。
2.设备文件并不对应于基于磁盘的文件系统中的一块数据。实际上,对设备文件进行读写会直接导致与设备驱动的沟通,从而操作底层对应的硬件。

相关系统调用
mknod(root only) path type major_num minor_num
path:设备文件的路径
type:b 代表块设备
     c 代表字符设备
major_num:主设备号
minor_num:从设备号

设备文件通常分为两种类型(设备类型
1.字符设备 character device
  以串的形式读写数据字节流的硬件设备。
  串行端口,并行端口,磁带驱动器,终端设备和声卡是一些常见的字符设备。 
2.块设备 block device
  以固定大小数据块为单位进行读写的硬件设备。和字符设备不同,块设备提供了随机访问存储在设备上数据的能力。
  磁盘驱动器就是块设备的例子。

注意
普通应用程序通常不会直接使用块设备。当一个磁盘设备显示为块设备的时候,每个分区通常都会包含一个文件系统,
而这个文件系统应该被加载到 GNU/Linux 系统的文件目录树中。
只有内核中实现文件系统的代码需要直接访问块设备,普通应用程序通过设备文件和目录访问磁盘的内容。


设备号
Linux 使用两个号码标识每个设备 主设备号(major device number)和从设备号(minor device number)

主设备号:标识了设备对应的驱动。从主设备号到设备驱动的对应关系在内核代码中确定且已经成为 Linux 内核的一部分。
从设备号:用于标识对应于同一个驱动的单独设备或组件。

注意:同一个设备号可能对应于两个不同的驱动一个块设备驱动和一个字符设备驱动。


/dev/null
有两个用途? 
1.Linux 会丢弃所有写入到 /dev/null 的数据。
  一个常用的技巧是将 /dev/null 作为重定向的目标文件,以丢弃在某些情况下不需要的输出信息。
2.从 /dev/null 中读取会始终得到文件结束标记EOF。
  例如如果打开一个 /dev/null 的文件描述符并尝试调用 read 读取内容?read 将无法读取任何信息并直接返回 0。
      如果你从 /dev/null 复制到任何文件?目标文件将为 0 字节长度。

/dev/zero
/dev/zero 设备表现为一个具有无限长度 0 字节的文件。Linux 会为读取进程生成足够的“0”字节返回。

/dev/full
用途:用于测试磁盘是否有剩余空间。
     当无空间可用时,向 /dev/full 写入文件将会失败并得到 errno 错误号为 ENOSPC,代表着写入的设备已满。 

随机数设备 
/dev/random 和 /dev/urandom 提供了对 Linux 内核内置的随机数生成器的访问。 

这两个设备的区别将在 Linux 用尽已存储的随机数序列时体现出来。
/dev/random:读取一个很长序列的随机数而不产生任何输入事件,Linux 将会阻塞读取操作。
               如果 Linux 耗尽存储的随机性信息时,输出最终会暂停。这个时候尝试触碰键盘、移动鼠标或做任何类似的事情,系统才会生成更多随机数并返回给程序。
/dev/urandom:读操作将不会被阻塞。
               如果 Linux 耗尽了随机性数据,它会通过某种加密算法从之前的随机字节序列中生成更多的伪随机数。
 
eg:od 以十六进制格式输出文件内容
od -t x1 /dev/random


回环设备(/dev/loop):是一种伪设备,它为我们提供了一种创建一个存在于其他文件中的虚拟文件系统的机制。通过映射操作系统上的普通的文件而形成---虚拟块设备

虚拟块设备
1.如果文件中包含一个完整的文件系统,那么这个文件就能如同磁盘设备一般被挂载。
2.使得用户对该虚拟磁盘设备的所有读写操作都将被重定向到读写普通文件而非操作实际磁盘或分区的轨道和扇区。
3.这种设备使得文件可以如同块设备一样被访问。
4.这种设备文件经常被用于光盘或是磁盘镜像(IOS、IMG)。通过循环挂载来挂载包含文件系统的文件,便使处在这个文件系统中的文件得以被访问。这些文件将出现在挂载点目录。

实现步骤(只有root用户可以操作):

//创建一个用于承载虚拟文件系统的空文件---disk-image。这个文件的大小将成为挂载后文件系统的大小
//以块为单位(512)从/dev/zero文件向disk-image文件复制数据
dd if=/dev/zero of=disk-image count=20480

//创建挂载目录
mkdir /tmp/virtual-fs

//使用一个循环设备连接文件
losetup /dev/loop0 disk-image

//在这个磁盘映像之上可以构建任何类型的文件系统,在此创建一个ex3文件系统
mkfs -t ext3 /dev/loop0

//在目录上挂载该循环设备
mount /dev/loop0 /tmp/virtual-fs


# 卸载
umount /tmp/virtual-fs
rmdir /tmp/virtual-fs
losetup -d /dev/loop0
rm disk-image
# 查看所有与文件相关联的 loop 设备
# losetup -a 


终端
  终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。在Linux系统的设备特殊文件目录/dev/下。

终端特殊设备文件一般有以下几种:

1.串行端口终端(/dev/ttyS*)

  串行端口终端(Serial Port Terminal)是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。
  这些串行端口所对应的设备名称是/dev/tts/Num 或 /dev/ttySNum,在DOS系统下为COM1、COM2等。

2.控制终端(当前终端,/dev/tty)

  如果当前进程有控制终端(Controlling Terminal)的话,那么/dev/tty就是当前进程的控制终端的设备特殊文件。可以使用命令”ps -ax”来查看进程与哪个控制终端相连。
  对于你登录的shell,/dev/tty就是你使用的终端,设备号是(5,0)。使用命令”tty”可以查看它具体对应哪个实际终端设备。/dev/tty有些类似于到实际所使用终端设备的一个联接。

3.控制台终端(/dev/tty*,/dev/console)

  /dev/console即控制台,是与操作系统交互的设备,系统将一些信息直接输出到控制台上。目前只有在单用户模式下,才允许用户登录控制台。

  在Linux系统中,计算机显示器通常被称为控制台终端(Console)。
  /dev/tty0代表当前虚拟控制台,是当前所使用虚拟终端的一个别名,而/dev/tty1等代表第一个虚拟控制台,使用Alt+F2切换,系统的虚拟控制台变为/dev/tty2 ,当前的控制台则指向/dev/tty2。

  系统所产生的信息会发送到该终端上。因此不管当前正在使用哪个虚拟终端,系统信息都会发送到控制台终端上。
  你可以登录到不同的虚拟终端上去,因而可以让系统同时有几个不同的会话期存在。只有系统或超级用户root可以向/dev /tty0进行写操作。

4.伪终端(dev/pty*)
  伪终端(Pseudo Terminal)是成对的逻辑终端设备(即master和slave设备, 对master的操作会反映到slave上)。
  所谓伪终端是逻辑上的终端设备,多用于模拟终端程式。

5.虚拟终端(pty,/dev/pts/n)
  使用pty的实现的终端称为虚拟终端。
  pts(pseudo-terminal slave)是pty的实现方法,与ptmx(pseudo-terminal master)配合使用实现pty。
  在Xwindows模式下打开的终端、使用telnet 或ssh等方式登录到主机的终端均在使用pty设备(准确的说在使用pty从设备)。

  经过本人的查阅分析伪终端与虚拟终端不必太过区分。

6.其它类型

  Linux系统中还针对很多不同的字符设备存在有很多其它种类的终端设备特殊文件。例如针对ISDN设备的/dev/ttyIn终端设备等。
阅读(1792) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~