跳轉到內容

人機介面

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 原始碼
華夏公益教科書