領卓教育 字元裝置的實現流程

2021-08-30 21:31:14 字數 1325 閱讀 8137

如何一步一步執行驅動:

在進行驅動載入的過程中使用 insmod hello.ko時,會執行驅動的載入函式,module_init(hello_init)->hello_init

在驅動的載入函式中會進行裝置的註冊

mkdev (hello_major, hello_minor)去生成裝置號

向核心去註冊裝置節點result = register_chrdev_region (dev, number_of_devices, 「hello」);

建立乙個file_operations hello_fops 結構體,並且對這個結構體初始化,這個結構體是實現驅動本身的open read write close的功能

使用cdev_init函式進行初始化 cdev_init(&my_cdev, &fops);讓my_dev和fops進行繫結, cdev->ops = fops;

cdev結構體定義如下:

struct cdev ;

使用cdev_add()把這個my_cdev這個結構體加入到cdev鍊錶當中, 驅動載入完成

驅動載入後會,會有對應的裝置節點,此時使用mknod命令來建立裝置號

mknod /dev/mychar c 500 0

執行mknod命令後,時會在核心中建立乙個inode的結構體,這裡只寫inode重要的成員資訊

struct inode ;

首先會對i_rdev 這個成員賦值,會對成員賦值為相應的裝置號。i_rdev = (500,0);

其次會對i_cdev 賦值,通過裝置號在cdev鍊錶中查詢,可以找到我們通過cdev_add()新增的結構體,

故 i_cdev = &my_cdev

應用程式呼叫 open("/dev/mychar")這個函式時,核心會呼叫sys_open, 核心會在呼叫open函式時建立struct file 結構體,

並且會對file結構體的成員f_op賦值為驅動中的file_operation結構體(通過裝置號可以找到可以找到inode結構體,

inode結構體中有i_cdev指標,指向系統的cdev的結構體,cdev的成員ops指向驅動的file_operation成員hello_ops)

應用程式呼叫open,驅動中也會呼叫file_operation的open函式,故系統正確的呼叫.

應用程式呼叫open後,對於驅動來說,filep->f_op = hello_ops,最終會呼叫驅動的open函式

應用程式呼叫close -> fops->release()

應用程式呼叫read -> fops->read()

應用程式呼叫write -> fops->write()

struct file ;

領卓教育 字元裝置實現流程

如何一步一步執行驅動 在進行驅動載入的過程中使用 insmod hello.ko時,會執行驅動的載入函式,module init hello init hello init 在驅動的載入函式中會進行裝置的註冊 1.mkdev hello major,hello minor 去生成裝置號 2.向核心去...

領卓教育 根據大神部落格總結fork輸出時的

今天看了dianacody大神的關於fork函式初級解析的一篇部落格 想小小總結一下其中的一些簡單易記的公式 以便後用 貼出大神部落格位址便於參考 首先宣告一下,因為平時基本不用電腦打字,所以語言和邏輯上若有紕漏還望見諒。一 fork fork fork fork 第n次fork printf a ...

實現 dev null的字元裝置驅動

dev null是個黑洞裝置,它丟棄一切寫入其中的資料,空裝置通常被用於丟棄不需要的輸出流。任何寫入該裝置資料都會被丟棄掉。從這個裡面讀取資料返回空 也有人認為是讀該空裝置,直接讀到檔案尾,那就是返回 1 將一些不用內容經常傳送給這個裝置,丟棄不需要的資料。實現如下 include include ...