# 2025q1 Homework 3 (kxo)
contributed by <`Dennis40816`>
## 閱讀紀錄
- [x] [N04: kxo](https://hackmd.io/@sysprog/linux2025-kxo)
- [ ] [LKMPG WriteUp]()
## 初探 kxo
> [!Note]
> 模組應該和核心同版本,使用以下路徑中的編譯器:
> ```bash
> /lib/modules/$(shell uname -r)/build
> ```
> 作者的版本為: ~~`6.8.0-56-generic`~~ ``6.8.0-57-generic``
### 設定金鑰與編譯模組
為++避免破壞安全啟動++,執行以下命令進行金鑰簽章:
1. 輸入以下命令以確認模組簽章設定:
```bash
cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG
```
應可查看到類似輸出:
```bash
CONFIG_MODULE_SIG_FORMAT=y
CONFIG_MODULE_SIG=y
# CONFIG_MODULE_SIG_FORCE is not set
CONFIG_MODULE_SIG_ALL=y
# CONFIG_MODULE_SIG_SHA1 is not set
...
```
預設 `CONFIG_MODULE_SIG_ALL` 會設定為啟動,因此要求簽署模組。
1. 產生私鑰與公鑰
```bash
openssl req -new -x509 -newkey rsa:2048 \
-keyout mod-key.priv \
-outform DER \
-out mod-key.der \
-nodes \
-days 36500 \
-subj "/CN=My Kernel Module Signing Key/"
```
1. 參考 [kxo](https://github.com/sysprog21/kxo) 使用 `make` 進行編譯,以產生 `kxo.ko`
1. 在 `kxo` 目錄中,簽署模組:
```bash
/lib/modules/$(uname -r)/build/scripts/sign-file\
sha256\
<private_key_file>\
<certificate_file>\
kxo.ko
```
例如:
```bash
/lib/modules/$(uname -r)/build/scripts/sign-file\
sha256\
~/key/mod-key.priv\
~/key/mod-key.der\
kxo.ko
```
1. 註冊你的公鑰到 Machine Owner Key(MOK) 中:
```
sudo mokutil --import <your-mod-key>.der
```
例如:
```
sudo mokutil --import ~/key/mod-key.der
```
完成後重新啟動。
執行本步驟如果遇到 `Failed to enroll new keys`,請確保你的 root 已經設定密碼,若以下命令的結果是 `root L ...` 表示++還沒++設定密碼:
```bash
sudo passwd -S root
```
可以透過以下命令設定密碼,設定時務必小心謹慎:
```bash
sudo passwd root
```
如果不行,請確認 BIOS 中的 UEFI boot 已經開啟。
如果依舊不行,~~為什麼不找找自己問題~~,請確認是否使用 ==ASUS 主機板==。如果是請參考 [两天血泪史:华硕主板上的Ubuntu驱动签名终极解决方案](https://blog.csdn.net/bfonline/article/details/146406862) 將公鑰存入 USB 後進 BIOS 匯入金鑰。
存入路徑是 **BIOS ➞ 進階設定 ➞ 安全性 ➞ 安全啟動 ➞ 金鑰管理(安全啟動控制要打開) ➞ 授權簽名 (db) ➞ 附加 ➞ ==否==**。接著選擇你的 `.der`檔案,完成後螢幕會出現一行符號,螢幕會略白,這時按下 ESC 會出現是否附加,選擇附加後,儲存並重啟。
如果你此時再次匯入公鑰,你會看到一行美妙的文字:
```
SKIP: <your-der-file> is already in db.
```
1. 導入模組:
```bash
sudo insmod kxo.ko
```
出現以下錯誤:
```bash
[ 469.404598] kxo: loading out-of-tree module taints kernel.
[ 469.404622] kxo: disagrees about version of symbol device_create_file
[ 469.404622] kxo: Unknown symbol device_create_file (err -22)
[ 469.404626] kxo: disagrees about version of symbol device_create
[ 469.404627] kxo: Unknown symbol device_create (err -22)
[ 469.404638] kxo: disagrees about version of symbol device_destroy
[ 469.404638] kxo: Unknown symbol device_destroy (err -22)
```
該錯誤通常源自與當前核心版本不同,但剛剛才檢查 `kxo.ko` 是 6.8.0-56 阿? 但再次使用 `uname -r` 居然變成 6.8.0-57 了! 於是只好重新編譯並重新簽署,後問題排除。可以透過以下檢查:
```bash
lsmod | grep kxo
```
1. 執行
```bash
stty start '^-' stop '^-'
sudo ./xo-user
```
如果需要干涉遊戲:
```bash
# Pause / Resume
Ctrl + P
# Quit
Ctrl + Q
```
1. 卸載模組:
```bash
sudo rmmod kxo
```
至此我們對 kxo 的基本操作有了基礎認識。
### VSCode 設定
對於 x86 架構,在 `.vscode/c_cpp_properties.json` 加入:
```json
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}",
"${env:KERNEL_BUILD_PATH}",
"${env:KERNEL_BUILD_PATH}/include",
"${env:KERNEL_BUILD_PATH}/arch/x86/include",
"${env:LINUX_HEADERS_PATH}/include",
"${env:LINUX_HEADERS_PATH}/arch/x86/include/generated"
],
"defines": [
"KBUILD_MODNAME=\"kxo\"",
"__GNUC__",
"__KERNEL__",
"MODULE"
],
"compilerPath": "/usr/bin/gcc",
"cStandard": "gnu99",
"intelliSenseMode": "linux-gcc-x64"
}
],
"version": 4
}
```
其中 `KERNEL_BUILD_PATH` 和 `LINUX_HEADERS_PATH` 定義在 `~/.bashrc` 中。
```bash
export KERNEL_BUILD_PATH="/lib/modules/$(uname -r)/build"
export LINUX_HEADERS_PATH="/usr/src/linux-headers-$(uname -r)"
```
## kxo 專案架構
為正確理解 kxo,首先閱讀其程式,並繪製其流程圖,以利後續修改。詳細參考 [kxo Code Write-Up](https://hackmd.io/@dennis40816/kxo-code-writeup)。
## 演算法
### MCTS
## 改進
:::danger
說好的進度呢?
:::