重要的變數包含:
kxo 模組第一個被呼叫的函式,呼叫時機是在使用者使用 sudo insmod
時。流程圖如下:
參考以下連結:
呼叫 kfifo_alloc
配置 fifo
記憶體
-ENOMEM
,第一個離開點呼叫 alloc_chrdev_region
。我們不在意 major
number 所以交給內核處理,如果在意則要使用 register_chrdev_region
。
此處配置名為 kxo
的裝置數量為 NR_KMLDRV
(1)。
goto error_alloc
呼叫 cdev_init
初始化 kxo_cdev
結構體。
呼叫 cdev_add
嘗試添加 char device,以 dev_id
作為第一個設備號,連續增加 NR_KMLDRV
個同類型設備。
kobject_put
將 kxo_cdev.kobj
參考記數減去 1,再 goto error region呼叫 class_create
sys/class/<class-name>
下建立目錄IS_ERR
) : 先獲取錯誤碼後,goto error_cdev
呼叫 device_create
建立 kxo_dev
該函式負責註冊設備到 sysfs 中,並在 /dev 建立設備節點。
此處沒有檢查返回值,是將檢查步驟與以下合併。
呼叫 device_create_file
在對應 /sys/class/<class-name>
建立文件。
goto error_cdev
呼叫 vmalloc
,大小為一個頁表 (4K)。
在 Linux 核心中可以透過 kmalloc
或 vmalloc
配置記憶體。在老師的共筆中也有談到。
但建議是 128 KiB 以上才使用 kmalloc?
device_destroy
-> class_destroy
-> goto error_cdev
。呼叫 alloc_workqueue
建立 kxo_workqueue
workqueue 允許不同的 work_struct
實例並行,但對於同一個 work_struct
實例同時間僅會由最多一個 CPU 運行。
注意目前的 WQ_MAX_ACTIVE
(512) 是偏好值。
vfree
) -> device_destroy
-> class_destroy
-> goto error_cdev
初始化演算法 negamax
和 mcts
初始化棋盤 table
和相關變數
由於建立字符設備的步驟是層層推進的,這裡使用 goto
語法,只要將 error
的釋放處理和前面初始化的順序相反,便可以優雅達成釋放與 char device 相關資源也是程式的第二個離開點。
或許能將所有釋放資源部分移動到 goto?
這兩個函式是透過:
被註冊到:
後者也是包含在 DEVICE_ATTR_RW
中。RW 指的是擁有者的權限,該設備權限可被寫為 0644。