# 设备

# 计算机结构

  • 1945 年,冯·诺依曼(Von Neumann)在论文中提出了一种可以存储指令并执行的计算机结构,被称为冯·诺依曼结构,是目前最流行的计算机结构。
  • 冯诺依曼结构在逻辑上分为五个部分:
    • 运算器(Arithmetic Unit)
      • :负责执行指令、进行运算。
      • 核心部件是算术逻辑单元(Arithmetic Logic Unit ,ALU),能进行算术运算、逻辑运算、位运算等操作。
      • 运算结果会保存到存储器中,或者暂存在累加器中。
    • 控制器(Control Unit)
      • :负责从存储器读取指令,进行译码分析(即编码的逆过程),然后调用相关部件执行该指令。
      • 例如读取到一个跟运算相关的指令,就取出操作数,发送到运算器进行运算。
    • 存储器(Memory Unit)
      • :负责用于存储数据和指令。
      • 主要分为内部存储器、外部存储器两种,简称为内存、外存。
    • 输入设备
      • :负责接收用户或其它设备输入的信息,转换成计算机能识别的数据,然后保存到存储器中。
      • 例如鼠标、键盘。
    • 输出设备
      • :负责将计算机的数据转换成适当形式的信息,输出给用户或其它设备。
      • 例如显示屏、打印机。
      • 输入、输出设备统称为 IO 设备。

# /dev

Linux 中,所有硬件设备,都以逻辑文件的形式,映射到 /dev 目录下。例如:

  • /dev/hd[a-d] :IDE 接口的设备(主要是硬盘)。
    • IDE 接口是一种传统的并行接口,传输速度较慢,已被淘汰。
    • 例如 /dev/hda 表示硬盘 a 。编号 a 说明它是系统启动后识别到的第一个这种类型的设备。
  • /dev/sd[a-p] :SATA 接口的设备(主要是硬盘)、SCSI 接口的设备(主要是硬盘)、USB 接口的设备。
  • /dev/vd[a-] :虚拟磁盘。
  • /dev/fd[0-1] :软盘。
  • /dev/cdrom :光驱。
  • /dev/mouse :鼠标。
  • /dev/lp[0-15] :打印机。

# 块、字符设备

按读写单位的不同,将设备分类:

  • 块设备(block deivce)
    • :读写时以 block 为单位。例如磁盘。
    • 读写块设备时,默认会经过操作系统的 Cache 缓冲、缓存。
      • 如果不经过操作系统的 Cache ,则称为裸设备(raw device),IO 性能更高。
  • 字符设备(character device)
    • :读写时以 char 为单位。例如键盘、终端。

# 终端设备

  • Linux 中,与终端交互时,都是通过读写 /dev 目录下的串口设备文件。
    • 它们可能是真实存在的硬件设备,也可能是虚拟设备。

主要分类:

  • 控制台设备(console device)
    • :文件名为 /dev/console ,用于接收系统内核的一些输出信息,只有 root 用户能读写。
  • 虚拟控制台(virtual console)
    • :文件名的正则表达式为 /dev/tty\d*
    • /dev/tty 指向当前 shell 使用的终端,比如 /dev/tty1、/dev/pts/0 。
    • /dev/tty0 指向当前 shell 使用的虚拟控制台,只有 root 用户能读写。
  • 伪终端(pseudo terminals ,ptys)
    • :用于模拟终端操作的进程。比如在桌面上打开的终端、通过 SSH 登录的终端。
    • 文件名的正则表达式为 /dev/pts/\d+
    • 例:假设 SSH 登录时,执行 w 命令,查询到当前终端为 pts/0 。然后执行以下命令:
      [root@CentOS ~]# echo Hello > /dev/stdout   # 将输出重定向到 stdout ,这会输出到当前终端
      Hello
      [root@CentOS ~]# echo Hello > /dev/tty      # 将输出重定向到当前终端
      Hello
      [root@CentOS ~]# echo Hello > /dev/tty1
      [root@CentOS ~]# echo Hello > /dev/pts/0
      Hello
      [root@CentOS ~]# echo Hello > /dev/pts/6    # 该伪终端不存在,因此不允许重定向
      -bash: /dev/pts/6: Permission denied
      
    • 通过 SSH 登录时,用户输入的 stdin 数据会先被通过 sshd 服务传给远程主机上的 shell 进程,再写入 /dev/tty 文件,最后被系统内核读取、处理。
  • 串行端口终端(serial ports terminal)
    • :表示通过计算机串行端口连接的终端设备。
    • 文件名的正则表达式为 /dev/ttyS\d+
    • 例如,执行命令 echo "Hello World" > /dev/ttyS1 ,就是将数据发送到 S1 端口,相当于 DOS 系统的 COM1 。

# 相关命令

# lscpu

lscpu      # 显示 CPU 的信息

# lsmem

lsmem      # 显示内存的信息

# lsblk

lsblk       # 显示系统所有的块设备
       -p   # 显示每个设备的完整路径
       -f   # 显示每个块设备的文件系统、UUID(通用唯一识别码)
  • 例:
    [root@CentOS ~]# lsblk -p
    NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    /dev/sr0     11:0    1  3.5M  0 rom
    /dev/vda    253:0    0   50G  0 disk
    └─/dev/vda1 253:1    0   50G  0 part /
    
    • /dev/sr0 是 rom ,/dev/vda 是磁盘设备,/dev/vda1 是一个磁盘分区,挂载在/。
    • MAJ:MIN :主设备号和次设备号。
    • RM :是否为可卸载设备。
    • RO :是否为只读设备。
    • TYPE :分为磁盘(disk)、分区(partition)、只读存储器(rom)三种。
    • MOUTPOINT :挂载点。

# lshw

lshw            # 显示所有硬件设备的详细信息
    -short      # 只显示简洁的设备列表
    -class cpu  # 只显示 cpu 类的信息(同理可显示其它类设备)
    -json       # 显示成 json 格式
  • 安装:yum install lshw
  • 需要用 root 权限执行。