Linux 文件夹与设备
Linux 文件夹与设备
Linux根目录下的文件与文件夹
/
├── bin -> usr/bin 包含必要的命令二进制文件(命令);引导、修复和恢复系统
├── boot 包含启动系统所需的文件,包括 Linux 内核和引导程序配置文件
├── dev 包含表示硬件组件和外围设备的设备文件
├── etc 系统范围的配置文件
├── home 普通用户的主目录
├── lib -> usr/lib 目录包含/bin和/sbin中程序所需的共享库
├── lib64 -> usr/lib 与/lib类似,但它包含64位库。
├── mnt 可移动存储设备的临时挂载点
├── opt 安装不属于默认操作系统发行版的可选软件包
├── pkglist.x86_64.txt
├── proc 虚拟文件系统,提供有关进程和系统状态的信息
├── root 这是 root 用户的主目录
├── run 系统守护程序和服务的运行时数据
├── sbin -> usr/bin 包含用于系统维护和恢复的必要系统二进制文件
├── srv 包含由系统提供的服务的数据
├── sys 虚拟文件系统,提供有关系统硬件设备及其驱动程序的信息
├── tmp 存储应用程序和脚本创建的临时文件,操作系统可能会定期清除
├── usr 用户相关的程序、库和文件
├── var 变量数据,如日志文件、缓存文件和汇编文件
└── version
Linux常见的设备
/dev
├── autofs 内核控制的自动挂载点
├── block 目录, 系统中所有块设备的符号链接
├── bsg 目录,包含了块层 SCSI 通用设备。
├── btrfs-control 字符设备,用于与 Btrfs 文件系统进行交互
├── bus 目录,包含了系统中所有总线设备的符号链接
├── char 目录,包含了系统中所有字符设备的符号链接
├── console 系统控制台设备
├── core -> /proc/kcore 符号链接,指向 /proc/kcore,它提供了对系统内存的访问
├── cpu_dma_latency 字符设备,用于设置 CPU DMA 延迟
├── cuse 这是 CUSE(Character Devices in Userspace)的控制设备
├── disk 目录,包含了系统中所有磁盘设备的符号链接
├── dri 目录,包含了直接渲染基础架构(DRI)设备
├── dxg 微软 Hyper-V 的 Direct3D GPU 设备
├── fd -> /proc/self/fd 符号链接,指向当前进程的文件描述符目录
├── full 字符设备,总是返回写入错误(ENOSPC)
├── fuse 这是 FUSE(Filesystem in Userspace)的控制设备
├── hugepages 目录,用于管理大页面(huge pages)
├── hvc0~7 这些都是虚拟控制台设备,用于与虚拟机进行交互
├── kmsg 内核日志缓冲区设备,用于读取内核日志消息
├── log -> /run/systemd/journal/dev-log 这是一个符号链接,指向 systemd 日志套接字。它用于将日志消息发送到 systemd-journald 服务。
├── loop0~7 这些都是循环设备(loop devices),用于将文件挂载为块设备
├── loop-control 循环设备控制器,用于管理循环设备
├── mapper 目录,包含了逻辑卷管理器(LVM)创建的逻辑卷设备
├── mem 物理内存访问设备。它允许直接访问物理内存地址空间
├── mqueue POSIX 消息队列文件系统的挂载点。它用于管理 POSIX 消息队列
├── net 目录,包含了网络相关的设备文件。例如,tun/tap 设备和 PPP 设备等。
├── null 空设备。对它的写入操作会被忽略;从它读取数据会立即返回 EOF(End of File)标记。
├── nvram 非易失性随机存储器(NVRAM)设备。它允许读写计算机上的 NVRAM 数据
├── ppp 点对点协议(PPP)网络接口设备。它用于建立 PPP 网络连接
├── ptmx 伪终端主设备。它用于创建伪终端从设备(pts)
├── ptp0
├── pts
├── ram0~N RAM 磁盘设备。它们用于在内存中创建虚拟磁盘,通常用于提高磁盘访问速度。可以像普通磁盘一样使用fdisk分区工具进行分区和格式化,RAM 磁盘中的数据是暂时性的。当系统关闭或重启时,RAM 磁盘中的所有数据都会丢失。因此,RAM 磁盘通常用于存储临时文件或缓存数据
├── random 随机数生成器设备,设备生成的随机数来自于系统的熵池(entropy pool)。当熵池中的熵不足时,读取 /dev/random 设备会被阻塞,直到收集到足够的熵。
├── urandom 随机数生成器设备,设备也使用系统的熵池来生成随机数,但它不会在熵不足时阻塞。相反,它会使用伪随机数生成器(PRNG)来生成额外的数据。
├── sd[a-z] sd[a-z] 是SCSI 磁盘设备。它们代表了系统上连接的 SCSI 磁盘,包括 SATA 和 USB 磁盘
├── sg0~N /dev/sg0 到 /dev/sgN 是通用SCSI设备。它们提供了对SCSI设备的原始访问,允许你直接发送SCSI命令。可以使用sg_*系列命令来与这些设备进行交互,例如,使用sg_inq /dev/sg0命令来查询第一个SCSI设备的信息,使用不当可能会导致数据丢失或设备损坏
├── shm 共享内存(shared memory)文件系统的挂载点,在C语言中, shm_open()函数来创建共享内存对象,mmap()函数将其映射到进程的地址空间,需要注意的是,共享内存对象是持久性的。即使所有使用它的进程都已退出,它仍然存在于系统中。需要使用 shm_unlink()函数来删除不再需要的共享内存对象
├── stderr -> /proc/self/fd/2 /dev/stdin,/dev/stdout 和/dev/stderr 是标准输入、标准输出和标准错误设备。它们分别代表了当前进程的标准输入、标准输出和标准错误流
├── stdin -> /proc/self/fd/0
├── stdout -> /proc/self/fd/1
├── tty0 - ttyN 虚拟控制台设备。它们代表了系统上的虚拟控制台,通常用于在本地计算机上与系统进行交互。可以使用Ctrl+Alt+F1 到 Ctrl+Alt+Fn进行切换
├── ttyS0 - ttySN 串行端口设备, 在一些工业控制和数据采集计算机上可能会有
├── vcs 1...N /dev/vcs 和 /dev/vcsa 是虚拟控制台存储(virtual console memory)设备。它们用于访问虚拟控制台的屏幕内容。
├── vcsa 1...N /dev/vcsN设备包含了第N个虚拟控制台的文本屏幕内容 /dev/vcsaN 设备包含了第N个虚拟控制台的文本屏幕内容和属性信息,
├── vcsu 1...N 与上面两个相似,都可以直接使用cat命令查看
├── vfio
├── vhost-net
├── virtio-ports
├── vport0p0
├── vport0p1
├── vsock 虚拟套接字(vsock)设备。它用于在虚拟机和宿主机之间建立套接字连接
└── zero 零设备。它是一个字符设备,用于生成连续的零字节流, 例如,可以使用 dd if=/dev/zero of=/path/to/file bs=1M count=100 命令来创建一个大小为 100MB 的全零文件。或者,您可以使用 cat /dev/zero > /dev/sda 命令来擦除磁盘上的所有数据
GPIO(General Purpose Input/Output)
在 ARM 架构的开发板上,GPIO(General Purpose Input/Output)通常可以通过 /sys/class/gpio 目录进行访问和控制。
/sys/class/gpio 目录提供了一组简单的接口,用于配置和控制 GPIO 引脚。可以使用这些接口来设置 GPIO 引脚的方向(输入或输出)、读取引脚状态或设置引脚电平等。
例如,可以使用以下命令来导出 GPIO 引脚 17 并将其配置为输出模式:
echo 17 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio17/direction
然后,可以使用以下命令来设置 GPIO 引脚 17 的电平:
echo 1 > /sys/class/gpio/gpio17/value # 设置为高电平
echo 0 > /sys/class/gpio/gpio17/value # 设置为低电平
不同的开发板可能会有不同的 GPIO 接口和命名方式。需要查阅开发板的文档来确定如何访问和控制 GPIO 引脚。
c语言控制GPIO
#include <stdio.h>
#include <stdlib.h>
int main() {
// 导出 GPIO 引脚 17
FILE *export_file = fopen("/sys/class/gpio/export", "w");
if (export_file == NULL) {
printf("Error: cannot open /sys/class/gpio/export\n");
exit(1);
}
fprintf(export_file, "17\n");
fclose(export_file);
// 将 GPIO 引脚 17 配置为输出模式
FILE *direction_file = fopen("/sys/class/gpio/gpio17/direction", "w");
if (direction_file == NULL) {
printf("Error: cannot open /sys/class/gpio/gpio17/direction\n");
exit(1);
}
fprintf(direction_file, "out\n");
fclose(direction_file);
// 设置 GPIO 引脚 17 的电平
FILE *value_file = fopen("/sys/class/gpio/gpio17/value", "w");
if (value_file == NULL) {
printf("Error: cannot open /sys/class/gpio/gpio17/value\n");
exit(1);
}
fprintf(value_file, "1\n"); // 设置为高电平
fclose(value_file);
return 0;
}
#配置(2)#设备(1)#嵌入式(1)#wsl(3)评论