Try   HackMD

2024q1 Homework6 (integration)

conftributed by < jason50123 >

linux kernel module

閱讀相關教材

從老師所給的教材Introduction to Linux kernel driver programming

截圖 2024-04-24 晚上7.49.20
可以發現 driver 是在 framework 以及 bus infrastructure 兩者中間的介面

且在此教材中有提到()[] device driver 有各自的 major/minor numbermajor number 主要是拿來讓 在 device access 時, kernel 可以拿來識別並用對應的 device driver 管理,而相同的 device driver 可以管理相似的 device,所以這邊就會用 minor number 來對相同 major number 的 device 做出區別。

而且教材中的程式碼中可以發現,要建立一個 device driver 主要會需要有三個部分要先完成: register_chardev, class_create, device_create

    majorNumber = register_chrdev(0, DEVICE_NAME, &fops);

    ebbcharClass = class_create(THIS_MODULE, CLASS_NAME);

    ebbcharDevice = device_create(ebbcharClass, NULL, MKDEV(majorNumber, 0), NULL, DEVICE_NAME);

為了省去查詢可用的 major number ,他藉由這個 register_chrdev api 可以動態的去找尋 free major number 並分配給這個 char device 做使用。

但後面 class_create 不知道用途是什麼,目前只大概知道說是每個 device driver 都需要一個 class ,但不確定這樣做的原因。

練習製作一個 kernel module

閱讀老師所指定之教材 The Linux Kernel Module Programming Guide
並跟隨其中的範例練習並實作

obj-m += hello-1.o 
 
PWD := $(CURDIR) 

要記得在 makefile 中加入 PWD := $(CURDIR) 來避免在 sudo make 的環境下可能會造成編譯的錯誤

character devicesblock devices 的區別: block device 對 request 有一個 buffer 去存,所以可以選擇一個最好的順序去執行這些 request,而且僅接受以 block 為單位的寫入以及讀取,而 character device 則沒有此限制。

在Linux v5.6 版本後當我們在註冊 proc handler 的時候,會用 proc_ops 來取代 file_operations

在 disk 中的檔案我們會稱其為 inode,而FILE 則是用來抽象的描述 open file,而真正的 file 則是以 filp 來表示。

這段描述目前不太能理解,需要再去查閱相關資料