freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

linux字符設(shè)備驅(qū)動程序培訓(xùn)教材(編輯修改稿)

2025-03-31 16:57 本頁面
 

【文章內(nèi)容簡介】 從一個 inode中獲得主設(shè)備號和次設(shè)備號: unsigned int iminor(struct inode *inode); unsigned int imajor(struct inode *inode); 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu) 注冊設(shè)備 ,在模塊或驅(qū)動初始化時調(diào)用 及之前 int register_chrdev(unsigned int major, const char *name, struct file_operations *fops) 如何操作字符設(shè)備的接口 void cdev_init( struct cdev *, struc t file_operations *)。 int cdev_add(st ruct cdev *, dev_t, unsigned) 。 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu) 注銷設(shè)備 :在模塊卸載時調(diào)用 int unregister_chrdev(unsigned int major, const char *name)。 void cdev_del (struct cdev *)。 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu) / /設(shè)備驅(qū)動模塊加載函數(shù) static int __init xxx_init(void) { ... cdev_init(, xxx_fops)。 / /初始化 cdev = THIS_MODULE。 / /獲取字符設(shè)備號 if (xxx_major) { register_chrdev_region(xxx_dev_no, 1, DEV_NAME)。 } else { alloc_chrdev_region(xxx_dev_no, 0, 1, DEV_NAME)。 } ret = cdev_add(, xxx_dev_no, 1 ) 。 / /注冊設(shè)備 ... } 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu) /*設(shè)備驅(qū)動模塊卸載函數(shù) */ static void __exit xxx_exit(void) { unregister_chrdev_region(xxx_dev_no, 1)。 / /釋放占用的設(shè)備號 cdev_del()。 / /注銷設(shè)備 ... } 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu) 打開 模塊使用計數(shù)加 1 識別次設(shè)備號 硬件操作: 檢查設(shè)備相關(guān)錯誤(諸如設(shè)備未就緒或類似的硬件問題); 如果設(shè)備是首次打開,則對其初始化; 如果有中斷操作,申請中斷處理程序; int open(struct inode *inode, struct file *filp) 。 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu) 關(guān)閉 模塊使用計數(shù)減 1 釋放由 open分配的,保存在 filpprivate_data里的所有內(nèi)容。 硬件操作 : 如果申請了中斷,則釋放中斷處理程序。 在最后一次關(guān)閉操作時關(guān)閉設(shè)備。 int release(struct inode *inode, struct file *filp) 。 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu) read/write ssize_t read(struct file *filp, char __user *buff, size_t count, loff_t *offp)。 ssize_t write(struct file *filp, const char __user *buff, size_t count, loff_t *offp)。 指向用戶空間的緩沖區(qū),這個緩沖區(qū)或者保存將寫入的數(shù)據(jù),或者是一個存放新讀入數(shù)據(jù)的空緩沖區(qū)。 用戶在文件中存取操作的位置 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu) 用戶空間和內(nèi)核空間之間的數(shù)據(jù)拷貝過程, 不能簡單的用指針操作或者 memcpy來進(jìn)行數(shù)據(jù)拷貝 用戶空間的數(shù)據(jù)是可以被換出的,會產(chǎn)生一個頁面失效異常。 用戶空間的地址無法在內(nèi)核空間中使用。 用戶空間和內(nèi)核空間之間進(jìn)行數(shù)據(jù)拷貝的函數(shù): 如果要復(fù)制的內(nèi)存是簡單類型,如 char、 int、 long 等, put_user()和 get_user() unsigned long copy_from_user(void *to, const void __user *from, unsigned long count) 。 unsigned long copy_to_user(void __user *to, const void *from, unsigned long count )。 字符設(shè)備驅(qū)動程序基本結(jié)構(gòu) ? 讀設(shè)備模板 ssize_t xxx_read(struct file *filp, char __user *buf, size_t count ,loff_t*f_pos) { ... copy_to_user(buf, ..., ... )。 ... } ? 寫設(shè)備模板 ssize_t x
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1