人机界面
人机界面 |
---|
文本界面 |
安全性 |
调试 |
多媒体子系统 |
人机界面设备, 输入设备 |
HI 驱动 |
欢迎阅读本书的第一篇文章。这篇文章以 USB 类 和 Linux 机制 人机界面设备 (HID) 命名。Linux 中的 HID 机制支持键盘、鼠标和其他 输入设备。控制台、多媒体 (或只是媒体)、声音 (音频)、视频、图形也是本文的重点。此外,本章还涵盖了安全性主题和调试主题,因为它们与用户和人机交互密切相关。
在 Linux 世界中,文本 终端模拟器 和 控制台 是操作系统中必不可少的组成部分,允许用户通过内核与应用程序进行交互。文本终端是一种提供文本界面以与内核通信的设备,而控制台是容纳终端并显示内核输出的物理设备。
Linux 内核包含一个内置的控制台驱动程序,该驱动程序提供了一个基本界面,用于与控制台通信和控制终端。控制台驱动程序还支持各种输入和输出设备,例如键盘和显示器,以使用户能够通过终端与系统进行交互。
在 Linux 中使用文本 终端 和 系统控制台 可以追溯到早期的计算时代,当时 图形用户界面 还没有得到广泛应用。尽管图形用户界面得到了广泛的采用,但 基于文本的界面 和控制台仍然受到 Linux 用户和开发人员的欢迎,因为它们简单、高效且灵活。总的来说,文本终端和控制台在 Linux 内核中发挥着至关重要的作用,为用户提供了一个强大的界面来管理和与操作系统进行交互。
cdev id – “字符设备” 是一种设备驱动程序类型,它为 /dev 目录中的字符 设备文件 提供实现。这里的“设备”指的是抽象接口, 代理 到通常是外围的物理设备。字符设备是一种可以作为字节流访问的设备类型,而不是像块设备那样作为数据块访问。Cdev 驱动程序通常用于为提供 流 数据的设备(例如键盘、鼠标、终端、串行端口和打印机)提供驱动。它们也用于为提供对内存映射 I/O 区域的访问的设备(例如帧缓冲区和网络设备)提供驱动。Cdev 驱动程序通常包含一组函数,这些函数实现了设备的低级 I/O 操作(例如 open、read 和 write)。当用户空间程序访问字符设备文件时,内核会调用这些函数。要创建 cdev 驱动程序,内核开发人员必须首先使用 cdev_init id 或 cdev_alloc id 初始化 cdev 结构。cdev 结构包含有关设备的信息,例如其主次号和驱动程序实现的 I/O 函数集。初始化 cdev 结构后,可以使用 cdev_add id 函数将其注册到内核中。此函数将在 /dev 目录中创建字符设备文件,并将其与 cdev 驱动程序关联。
您可以在 /proc/devices 的开头找到注册的字符设备列表。/proc/devices. 输入设备 键盘和鼠标是字符设备的示例。
提示:浏览交叉引用网站以探索附近的 API 和用例
💾 历史:它是从 UNIX 派生出的最简单、最基本和最古老的概念之一。
⚲ API
- linux/cdev.hinc
- dev_t id - 设备 ID 由 MAJOR id 和 MINOR id 编号组成
- cdev id - 核心字符设备结构
- cdev_init id 或 cdev_alloc id
- cdev_device_add id - 辅助函数,使用
- cdev_add id - 将字符设备添加到系统的通用关键函数。
- register_chrdev id - 显然注册字符设备 由主编号、名称和文件操作进行注册
- unregister_chrdevid
- alloc_chrdev_region id / register_chrdev_region id,
- unregister_chrdev_regionid
- uapi/linux/major.h inc - 许多主编号的静态定义,包括过时的编号。
⚙️ 内部
📖 参考资料
💾 历史
🗝️ 首字母缩略词
⚲ API
- 要找出当前终端
- linux/tty.hinc
- register_console id 显然注册了 console id
- 👁 示例 virtio_console id
- linux/console.hinc
- man 2 ioctl_console
⚙️ 内部
📖 参考资料
- man 4 tty – 控制终端
- man 4 ptmx 和 pts – 伪终端主设备和从设备
- man 7 pty – 伪终端接口
- console doc
💾 历史
安全性的目标是限制对接口的访问。从访问控制和身份验证机制到安全启动和内存保护,Linux 内核采用各种技术来保护系统及其用户。基本的 Linux 安全性非常简单。它由树所有权类别和树访问模式组成。最常执行的功能之一是 may_open id。它拒绝未经授权的用户打开文件。
有关新功能,请参阅文章 安全性。
授权 是指定对系统资源的访问权限/访问 权限/特权 的功能。授权的主要目标是防止在任何情况下发生 权限提升。
🔧 待办。关键字:权限、功能、所有权、缓解。
⚲ API
基本的经典 UNIX 授权基于所有权和树访问模式:读、写和执行。
所有权由拥有用户 ID uid_t id 和拥有组 ID gid_t id 编码。
umode_t id - 用于编码访问模式的 typedef。 S_IRUSR id - 最小的“用户/所有者只读”访问模式。 S_IALLUGO id - 全访问模式。有关其他模式的详细信息,请阅读源代码。
访问模式的二进制 访问控制矩阵
模式 | 位 | 读取 | 写入 | 执行 |
---|---|---|---|---|
位偏移量 | 2 | 1 | 0 | |
其他 | 0-2 | 或 | ow | ox |
组 | 3-5 | gr | gw | gx |
用户 | 6-8 | ur | uw | ux |
- man 2 chown ↪ do_fchownat id 更改文件或目录的所有权
- man 2 chmod ↪ do_fchmodat id 更改文件或目录的访问模式
- man 2 access,man 2 faccessat ↪ do_faccessat id 检查访问权限
常见的授权错误
🚀 高级功能
- man 5 acl posix_acl id
- uapi/linux/capability.hinc
- man 2 capset 和 capget – 设置/获取线程的权限
- man 3 libcap
- man 1 setpriv – 使用不同的权限设置运行程序
⚙️ 内部
- may_open id 拒绝未经授权的文件打开
- inode_permission id 检查对给定 inode 的访问权限
- kernel/capability.csrc
📖 参考资料
🔧 待办。关键字:身份验证、用户 ID、组 ID、进程组 ID、会话 ID。
⚲ API
- uapi/asm-generic/stat.hinc
- arch/x86/include/uapi/asm/stat.hsrc
- linux/cred.hinc
- 结构体 cred id - 任务的安全上下文
- man 1 id,man 1 test - shell 工具
- man 2 getuid ↪ current_uid id
- man 2 getgid
- man 2 geteuid 由工具 man 1 whoami 使用
- 真实、有效和保存的用户/组 ID
- man 2 getresuid,getresgid
- man 2 setreuid,setregid
- man 2 setfsuid - 设置用于文件系统检查的用户标识
- man 2 umask - 设置文件模式创建掩码
- man 1 stat,man 2 stat ↪ vfs_fstat id,vfs_fstatat id
- man 2 statx ↪ do_statx id
⚙️ 内部
📖 参考资料
🔧 待办
🗝️ 首字母缩略词
- AES - 高级加密标准
⚲ API
- AF_ALG id - 用户空间接口 doc
- linux/crypto.h inc - 散列表加密 API。
- cryptoinc
⚙️ 内部
- cryptosrc
- drivers/cryptosrc
- lib/cryptosrc
- arch/x86/cryptosrc
- fs/crypto src - 每个文件加密
- fs/ecryptfs src eCrypt FS - 在 VFS 层上运行的加密文件系统。
- dm-crypt, drivers/md/dm-crypt.c src
📖 参考资料
审计
[edit | edit source]- kernel/audit.hsrc
- kernel/audit.csrc
- kernel/auditsc.csrc
- kernel/audit_tree.csrc
- kernel/audit_watch.csrc
- kernel/audit_fsnotify.csrc
- kernel/auditfilter.csrc
📖 参考资料
- https://capsule8.com/blog/auditd-what-is-the-linux-auditing-system/
- https://wiki.archlinux.org/title/Audit_framework
- man 8 auditctl
另见 eBPF 和 BPF
安全附件
🔧 待办
- man 2 fcntl ↪ do_fcntl id
- man 2 seccomp ↪ do_seccomp id
- man 2 add_key ↪ security/keys/keyctl.c src
- chroot, man 2 chroot
- 地址空间布局随机化
📖 参考资料
- 安全 doc
- 硬件漏洞 doc
- Linux 安全模块
- linux/security.h inc ⇾ security src
- keysinc
- linux/verification.hinc
- certssrc
- security ltp
- cve ltp
- http://kernsec.org/wiki/index.php/Main_Page
- SELinux http://selinuxproject.org/
调试
[edit | edit source]多媒体子系统
[edit | edit source]⚙️ 内部
图形
[edit | edit source]旧图形(不要与 v4l 混淆)
⚲ API
⚙️ 内部
直接渲染管理器 (DRM)
[edit | edit source]DRM 负责与现代显卡的 GPU 交互。DRM 公开了一个 API,用户空间程序可以使用它来向 GPU 发送命令和数据,并执行诸如配置显示模式设置等操作。用户空间程序可以使用 DRM API 来命令 GPU 执行硬件加速的 3D 渲染和视频解码,以及 GPGPU 计算。
⚲ API
- /sys/class/drm/
- uapi/drminc
⚙️ 内部
- drminc
- drm_gem.h inc – 图形执行管理器驱动程序接口
- drm_dev_register id 注册 drm_device id
高级 Linux 音频架构 (ALSA)
[edit | edit source]ALSA 是一个软件框架,也是 Linux 内核的一部分,它为声卡设备驱动程序提供 API。ALSA 项目最初的目标之一是自动配置声卡硬件以及在系统中优雅地处理多个声卡设备。
声音服务器 PulseAudio、JACK(低延迟专业级音频编辑和混音)和 PipeWire,更高层的抽象 API OpenAL、SDL 音频等在 ALSA 之上运行,并实现了声卡设备驱动程序。在 Linux 系统上,ALSA 取代了旧的 开放声音系统 (OSS)。
⚲ API
- /proc/asound/cards, /sys/class/sound/
- snd_card id - 中央结构
- snd_card_newid
- snd_card_registerid
- snd_device_opsid
- snd_device_new id 创建 ALSA 设备组件
- uapi/sound/asound.hinc
- sound/core.hinc
⚙️ 内部
📖 参考资料
视频 4 Linux (V4L2)
[edit | edit source]V4L 是一个设备驱动程序集合和 API,用于支持 Linux 系统上的实时视频捕获。它支持许多 USB 网络摄像头、电视调谐器和相关设备,标准化它们的输出,以便程序员可以轻松地向他们的应用程序添加视频支持。MythTV、tvtime 和 Tvheadend 是使用 V4L 框架的典型应用程序。
⚲ API
- v4l2_device_register id 注册 v4l2_device id
- video_register_device id 注册 video_device id
- 👁 例子 drivers/media/test-drivers src
📖 参考资料
HID
[edit | edit source]通用人机界面设备。不要与 hiddev 混淆。
输入设备
[edit | edit source]输入设备文件是一种 字符设备,其 ID 为 INPUT_MAJOR id。经典的输入设备是键盘和鼠标。
⚲ API
- 在 shell 中:cat /proc/bus/input/devices
- linux/input.hinc
- devm_input_allocate_device id, input_register_device id, input_register_handler id, input_dev id
- input_report_key id input_sync id
👁 示例
⌨️动手实践
sudo hexdump /dev/input/mice # 从内核转储鼠标移动事件
⚙️ 内部
📖 参考资料
HID 设备
[edit | edit source]🔧 待办
⚲ API
- hid_device id - 设备报告描述符。 操作:hid_allocate_device id, hid_add_device id。 👁 示例 usbhid_probe id
- uapi/linux/hid.hinc
- linux/hid.hinc
相机
[edit | edit source]🔧 待办
⚲ API
📖 参考资料
HI 设备驱动程序
[edit | edit source]本节介绍人机交互外设设备的底层驱动程序。
⚲ HID API
⚙️ 内部
- hid_bus_typeid
- drivers/hidsrc
- drivers/hid/hid-core.csrc
- drivers/accessibilitysrc
- drivers/ledssrc
- samples/uhid/uhid-example.c src - 👁 用户模式 HID 驱动的示例
- drivers/input src : 键盘和鼠标,杂项,serio,平板电脑,触摸屏,游戏端口,操纵杆
- ⌨️动手实践
- echo "module atkbd +pfl" | sudo tee /sys/kernel/debug/dynamic_debug/control
USB HID
⚲ HID API
⚙️ 内部
📖 参考资料
图形
[edit | edit source]🔧 待办
🗝️ 首字母缩略词
- FB - 帧缓冲区
- GPU - 图形处理单元
- TFT (LCD) - 薄膜晶体管液晶显示器 用于 🤖 嵌入式设备
- MIPI - 📱 移动产业处理器接口
- DBI - 显示总线接口
- DSI - 显示串行接口
- DCS - 显示命令集
⚲ API
- cat /proc/fb
- ls -l /sys/class/graphics
- video/mipi_display.hinc
- linux/fb.hinc
- register_framebufferid
- FBTFT_REGISTER_DRIVERid
- fbtft_displayid
⚙️ 内部
👁 示例
📖 参考资料
音频 SoC - ASoC
[edit | edit source]用于 🤖 嵌入式系统的 ALSA 系统芯片 (ASoC) 层。 ASoC 旨在处理低功耗和资源受限系统上的复杂音频处理和路由,使其成为嵌入式设备(如智能手机、平板电脑和其他物联网设备)的理想解决方案。
ASoC 为音频驱动程序提供了全面的框架,从而能够创建模块化的音频驱动程序,这些驱动程序可以轻松地与内核的其余部分集成。 它还支持各种音频接口,包括 I2S、PCM、AC97 和 SPDIF,使其高度通用,能够处理各种音频格式。
ASoC 的主要功能之一是能够使用数字信号处理 (DSP) 技术来处理音频路由和处理。
这使 ASoC 能够支持高级音频功能,例如降噪、回声消除和动态范围压缩等。
总的来说,ASoC 是一个功能强大且灵活的子系统,使 Linux 能够支持嵌入式设备中的各种音频硬件。 它已成为许多嵌入式 Linux 发行版的重要组成部分,并广泛用于现代音频设备的开发。
⚲ API
👁 示例
- sound/soc/generic/simple-card.csrc
- sound/soc/generic/audio-graph-card.c src 使用 sound/graph_card.h inc
⚙️ 内部
📖 参考资料
🗝️ SAI 的缩写可能为
- STM *串行* 音频接口: sound/soc/stm/stm32_sai.h 源代码
- Freescale (FSL) *同步* 音频接口: sound/soc/fsl/fsl_sai.h 源代码