人機介面
| 人機介面 |
|---|
| 文字介面 |
| 安全性 |
| 除錯 |
| 多媒體子系統 |
| 人機介面裝置, 輸入裝置 |
| 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 原始碼