如何一步一步執行驅動:
在進行驅動載入的過程中使用 insmod hello.ko時,會執行驅動的載入函式,module_init(hello_init)->hello_init
在驅動的載入函式中會進行裝置的註冊
1. mkdev (hello_major, hello_minor)去生成裝置號
2. 向核心去註冊裝置節點result = register_chrdev_region (dev, number_of_devices, "hello");
3. 建立乙個file_operations hello_fops 結構體,並且對這個結構體初始化,這個結構體是實現驅動本身的open read write close的功能
4. 使用cdev_init函式進行初始化 cdev_init(&my_cdev, &fops);讓my_dev和fops進行繫結, cdev->ops = fops;
cdev結構體定義如下:
struct cdev ;
5. 使用cdev_add()把這個my_cdev這個結構體加入到cdev鍊錶當中, 驅動載入完成
6. 驅動載入後會,會有對應的裝置節點,此時使用mknod命令來建立裝置號
mknod /dev/mychar c 500 0
7. 執行mknod命令後,時會在核心中建立乙個inode的結構體,這裡只寫inode重要的成員資訊
struct inode ;
首先會對i_rdev 這個成員賦值,會對成員賦值為相應的裝置號。i_rdev = (500,0);
其次會對i_cdev 賦值,通過裝置號在cdev鍊錶中查詢,可以找到我們通過cdev_add()新增的結構體,
故 i_cdev = &my_cdev
8. 應用程式呼叫 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 在驅動的載入函式中會進行裝置的註冊 mkdev hello major,hello minor 去生成裝置號 向核心去註冊裝置...
Sqlite3 領卓教育
1.安裝資料庫 sudo apt get install sqlite3 2.執行資料庫 sqlite3 3.退出資料庫 exit 4.開啟資料庫檔案 sqlite3 xx.db 若存在,則開啟。不存在,則建立再開啟 5.顯示當前開啟 的資料庫檔案 database 6.在資料庫中建立乙個表 cre...
領卓教育 隨機點名程式
簡單的隨機點名系統,利用c語言編寫 如下 include include char name int main printf n return 0 首先定義陣列,陣列內的成員是即將隨機的名字,本程式以作者班級同學為例 include 是linux下時間和日期的標頭檔案 gettimeofday是獲得...