# 2024q1 Homework6 (integration) conftributed by < `jason50123` > ## linux kernel module ### 閱讀相關教材 從老師所給的教材[Introduction to Linux kernel driver programming](https://events19.linuxfoundation.org/wp-content/uploads/2017/12/Introduction-to-Linux-Kernel-Driver-Programming-Michael-Opdenacker-Bootlin-.pdf) 可以發現 driver 是在 framework 以及 bus infrastructure 兩者中間的介面 且在此教材中有提到()[] device driver 有各自的 `major/minor number`, `major number` 主要是拿來讓 在 device access 時, kernel 可以拿來識別並用對應的 device driver 管理,而相同的 device driver 可以管理相似的 device,所以這邊就會用 `minor number` 來對相同 `major number` 的 device 做出區別。 而且[教材](https://derekmolloy.ie/writing-a-linux-kernel-module-part-2-a-character-device/)中的程式碼中可以發現,要建立一個 `device driver` 主要會需要有三個部分要先完成: `register_chardev`, `class_create`, `device_create` ```c 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](https://archive.kernel.org/oldlinux/htmldocs/kernel-api/API---register-chrdev.html) api 可以動態的去找尋 `free major number` 並分配給這個 `char device` 做使用。 但後面 `class_create` 不知道用途是什麼,目前只大概知道說是每個 `device driver` 都需要一個 class ,但不確定這樣做的原因。 ### 練習製作一個 kernel module 閱讀老師所指定之教材 [The Linux Kernel Module Programming Guide ](https://sysprog21.github.io/lkmpg/) 並跟隨其中的範例練習並實作 ```bash obj-m += hello-1.o PWD := $(CURDIR) ``` 要記得在 makefile 中加入 `PWD := $(CURDIR) ` 來避免在 sudo make 的環境下可能會造成編譯的錯誤 `character devices` 和 `block 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` 來表示。 :::warning 這段描述目前不太能理解,需要再去查閱相關資料 :::
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up