跳转到内容

人机界面

25% developed
来自维基教科书,开放世界中的开放书籍
人机界面
文本界面
安全性
调试
多媒体子系统
人机界面设备, 输入设备
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 idcdev_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 idMINOR id 编号组成
cdev id - 核心字符设备结构
cdev_init idcdev_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 - 许多主编号的静态定义,包括过时的编号。


⚙️ 内部

fs/char_dev.csrc
chrdevsid


📖 参考资料

字符设备 doc
字符设备驱动程序,linux-kernel-labs
字符设备文件,开源论坛


💾 历史

LDD3:字符驱动程序
LDD3:高级字符驱动程序操作
LDD1:#3
LDD1:#5

文本终端和控制台

[编辑 | 编辑源代码]

🗝️ 首字母缩略词

tty - 💾 历史上 TeleTYpewriter,只表示终端
pty - 伪终端
pts - 伪终端从机
ptmx - 伪终端主机


⚲ API

要找出当前终端
readlink /proc/self/fd/0
man 1 tty
man 1 who -m
linux/tty.hinc
register_console id 显然注册了 console id
👁 示例 virtio_console id
linux/console.hinc
man 2 ioctl_console


⚙️ 内部

drivers/ttysrc
fs/devptssrc
fs/proc/proc_tty.csrc
drivers/tty/vt/vt.csrc


📖 参考资料

man 4 tty – 控制终端
man 4 ptmx 和 pts – 伪终端主设备和从设备
man 7 pty – 伪终端接口
console doc


💾 历史

LDD3:TTY 驱动程序

安全性

[编辑 | 编辑源代码]

安全性的目标是限制对接口的访问。从访问控制和身份验证机制到安全启动和内存保护,Linux 内核采用各种技术来保护系统及其用户。基本的 Linux 安全性非常简单。它由树所有权类别和树访问模式组成。最常执行的功能之一是 may_open id。它拒绝未经授权的用户打开文件。


有关新功能,请参阅文章 安全性


授权 是指定对系统资源的访问权限/访问 权限/特权 的功能。授权的主要目标是防止在任何情况下发生 权限提升

🔧 待办。关键字:权限、功能、所有权、缓解


⚲ API

linux/stat.hinc
uapi/linux/stat.hinc


基本的经典 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 chowndo_fchownat id 更改文件或目录的所有权
man 2 chmoddo_fchmodat id 更改文件或目录的访问模式
man 2 accessman 2 faccessatdo_faccessat id 检查访问权限


常见的授权错误

EPERM id – “操作不被允许”
EACCES 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


📖 参考资料

文件系统权限
man 7 权限

🔧 待办。关键字:身份验证、用户 ID、组 ID、进程组 ID、会话 ID。


⚲ API

uapi/asm-generic/stat.hinc
arch/x86/include/uapi/asm/stat.hsrc
linux/cred.hinc
结构体 cred id - 任务的安全上下文
man 1 idman 1 test - shell 工具
man 2 getuidcurrent_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 statman 2 statvfs_fstat idvfs_fstatat id
man 2 statxdo_statx id


⚙️ 内部

kstatid
make_kuid id
from_kuid_munged id


📖 参考资料

Linux 中的凭据 doc
man 7 凭据
https://www.geeksforgeeks.org/real-effective-and-saved-userid-in-linux/

密码学

[编辑 | 编辑源代码]

🔧 待办


🗝️ 首字母缩略词

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


📖 参考资料

Linux 内核加密 API doc
加密 API (Linux)
devicetree/bindings/crypto
crypto ltp


审计

[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 fcntldo_fcntl id
man 2 seccompdo_seccomp id
man 2 add_keysecurity/keys/keyctl.c src
chroot, man 2 chroot
地址空间布局随机化
man 8 setarch / man 2 personality


📖 参考资料

安全 doc
LSM - Linux 安全模块 doc 性能事件和工具安全
硬件漏洞 doc
Linux 安全模块
linux/security.h incsecurity 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]

调试 Linux 内核

多媒体子系统

[edit | edit source]

⚙️ 内部

drivers/mediasrc

图形

[edit | edit source]

旧图形(不要与 v4l 混淆)

⚲ API

videoinc

⚙️ 内部

drivers/videosrc

DRM 负责与现代显卡的 GPU 交互。DRM 公开了一个 API,用户空间程序可以使用它来向 GPU 发送命令和数据,并执行诸如配置显示模式设置等操作。用户空间程序可以使用 DRM API 来命令 GPU 执行硬件加速的 3D 渲染和视频解码,以及 GPGPU 计算。


⚲ API

/sys/class/drm/
uapi/drminc
uapi/drm/drm.hinc
DRM_IOCTL_BASEid
drm_versionid

⚙️ 内部

drminc
drm_gem.h inc – 图形执行管理器驱动程序接口
drm_dev_register id 注册 drm_device id

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


⚙️ 内部

soundsrc
sound/core/device.csrc
ASoC


📖 参考资料

ALSA(声音) doc
编写 ALSA 驱动程序 doc
sound ltp

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


📖 参考资料

视频 4 Linux
media doc
V4L doc
媒体子系统内核内部 API


通用人机界面设备。不要与 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


👁 示例

drivers/input/mousedev.csrc
drivers/input/keyboard/atkbd.csrc
drivers/input/evbug.csrc


⌨️动手实践

sudo hexdump /dev/input/mice # 从内核转储鼠标移动事件


⚙️ 内部

drivers/input/input.csrc
input_eventid


📖 参考资料

输入 doc
input ltp

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

uapi/linux/uvcvideo.hinc

📖 参考资料

UVC doc
drivers/media/usb/uvcsrc

HI 设备驱动程序

[edit | edit source]

本节介绍人机交互外设设备的底层驱动程序。


HID API

linux/hidraw.hinc
module_hid_driver id 注册 hid_driver id
hid_hw_startid


⚙️ 内部

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

USB_INTERFACE_CLASS_HID id == USB_CLASS_HID id


⚙️ 内部

drivers/hid/usbhidsrc
drivers/hid/usbhid/usbkbd.c src: usb_kbd_driver id
drivers/hid/usbhid/usbmouse.c src: usb_mouse_driver id


📖 参考资料

USB HID 类 doc

图形

[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


⚙️ 内部

drivers/videosrc
drivers/gpusrc

👁 示例

vivid_fb_initid
fbtft_register_framebufferid


📖 参考资料

GPU 驱动程序开发人员指南 doc
帧缓冲区设备 doc
帧缓冲区库 doc
LWN: 图形

音频 SoC - ASoC

[edit | edit source]

用于 🤖 嵌入式系统的 ALSA 系统芯片 (ASoC) 层。 ASoC 旨在处理低功耗和资源受限系统上的复杂音频处理和路由,使其成为嵌入式设备(如智能手机、平板电脑和其他物联网设备)的理想解决方案。

ASoC 为音频驱动程序提供了全面的框架,从而能够创建模块化的音频驱动程序,这些驱动程序可以轻松地与内核的其余部分集成。 它还支持各种音频接口,包括 I2S、PCM、AC97 和 SPDIF,使其高度通用,能够处理各种音频格式。

ASoC 的主要功能之一是能够使用数字信号处理 (DSP) 技术来处理音频路由和处理。

这使 ASoC 能够支持高级音频功能,例如降噪、回声消除和动态范围压缩等。

总的来说,ASoC 是一个功能强大且灵活的子系统,使 Linux 能够支持嵌入式设备中的各种音频硬件。 它已成为许多嵌入式 Linux 发行版的重要组成部分,并广泛用于现代音频设备的开发。

⚲ API

sound/soc.hinc
snd_soc_cardid
devm_snd_soc_register_card idsnd_soc_register_card id 注册
sound/soc-component.hinc
snd_soc_componentid
snd_soc_component_driverid
snd_soc_cardid
snd_cardid
snd_soc_register_component id snd_soc_component_get_drvdata id snd_soc_component_read id snd_soc_component_update_bits id snd_soc_component_write id
sound/soc-dai.h inc - DAI - 数字音频接口 doc: AC97, I2S, PCM
snd_soc_dai id snd_soc_dai_driver id snd_soc_dai_get_drvdata id
sound/soc-dpcm.h inc - DPCM - 动态 PCM doc
sound/soc-dapm.h inc - DAPM - 动态音频电源管理 doc
snd_soc_dapm_route id, snd_soc_dapm_to_component id, snd_soc_dapm_widget id


👁 示例

sound/soc/generic/simple-card.csrc
sound/soc/generic/audio-graph-card.c src 使用 sound/graph_card.h inc


⚙️ 内部

sound/socsrc
snd_soc_cardid
snd_soc_dai_linkid


📖 参考资料

ASoC - ALSA SoC 层 doc
ASoC 核心 API 文档
https://www.alsa-project.org/wiki/ASoC
https://www.alsa-project.org/wiki/DAPM

🗝️ SAI 的缩写可能为

STM *串行* 音频接口: sound/soc/stm/stm32_sai.h 源代码
Freescale (FSL) *同步* 音频接口: sound/soc/fsl/fsl_sai.h 源代码
华夏公益教科书