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

正文內(nèi)容

第七章linux設備驅(qū)動程序開發(fā)-資料下載頁

2025-03-02 11:44本頁面
  

【正文】 structlist_headlist。n dev_tdev。//設備號設備號n unsignedintcount。n }。58TM 58ARM及 Thumb指令集3. file數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)n 設備驅(qū)動程序中設備驅(qū)動程序中 ,另一個非常重要的數(shù)據(jù)結(jié)構(gòu)就是另一個非常重要的數(shù)據(jù)結(jié)構(gòu)就是 File結(jié)構(gòu)結(jié)構(gòu) ,它它不同于應用程序空間的不同于應用程序空間的 FILE指針指針 ,FILE指針定義在指針定義在 C庫中因庫中因而不會出現(xiàn)在內(nèi)核代碼中而不會出現(xiàn)在內(nèi)核代碼中 ,而而 sturctfile只出現(xiàn)在內(nèi)核代碼中只出現(xiàn)在內(nèi)核代碼中 ,從不出現(xiàn)在用戶程序中從不出現(xiàn)在用戶程序中n 內(nèi)核用內(nèi)核用 inode結(jié)構(gòu)表示具體的文件結(jié)構(gòu)表示具體的文件 ,而而 file結(jié)構(gòu)表示打開的文件結(jié)構(gòu)表示打開的文件描述符描述符n 對于對于 單個文件單個文件 ,可能會有可能會有 許多個許多個 表示打開的文件描述符表示打開的文件描述符 file結(jié)結(jié)構(gòu)構(gòu) ,但是它們都指向了單個的但是它們都指向了單個的 inode結(jié)構(gòu)結(jié)構(gòu) ,所以所以 file結(jié)構(gòu)和結(jié)構(gòu)和 inode結(jié)構(gòu)是不同的結(jié)構(gòu)是不同的 .59TM 59ARM及 Thumb指令集n 3.. file數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu) n structfile{n structlist_head f_list。//打開的文件形成一個列表打開的文件形成一個列表 n structdentry *f_dentry。//指向相關(guān)目錄項的指針指向相關(guān)目錄項的指針n structvfsmount*f_vfsmnt。//執(zhí)行執(zhí)行 VFS掛載點的指針掛載點的指針n structfile_operations *f_op。//執(zhí)行文件操作的指針執(zhí)行文件操作的指針n atomic_t f_count。//使用該結(jié)構(gòu)的進程數(shù)使用該結(jié)構(gòu)的進程數(shù)n unsignedint f_flags。//文件打開的標志,如讀寫等文件打開的標志,如讀寫等n mode_t f_mode。//文件打開的模式文件打開的模式3. file數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu) 60TM 60ARM及 Thumb指令集n loff_t f_pos。//文件的當前位置文件的當前位置n unsignedlongf_reada,f_ramax,f_raend,f_ralen,f_rawin。/*預讀標志、要預預讀標志、要預讀的最多頁面數(shù)、上次預讀后的文件指針、預讀的字節(jié)數(shù)以及預讀的頁面數(shù)讀的最多頁面數(shù)、上次預讀后的文件指針、預讀的字節(jié)數(shù)以及預讀的頁面數(shù) */n structfown_struct f_owner。//文件的所有者文件的所有者n unsignedint f_uid,f_gid。//用戶的用戶的 UID和和 GIDn int f_error。//網(wǎng)絡寫操作錯誤碼網(wǎng)絡寫操作錯誤碼n unsignedlong f_version。//版本號版本號n void *private_data。//tty驅(qū)動程序使用驅(qū)動程序使用n structkiobuf *f_iobuf。n long f_iobuf_lock。n }。61TM 61ARM及 Thumb指令集 p228n 設備驅(qū)動程序的開發(fā)流程設備驅(qū)動程序的開發(fā)流程 n (( 1)硬件接口設計或使用嵌入式處理器的生產(chǎn)商提供參考接口)硬件接口設計或使用嵌入式處理器的生產(chǎn)商提供參考接口電路。電路。n (( 2)) 設計所要實現(xiàn)的文件操作,定義設計所要實現(xiàn)的文件操作,定義 file_operations結(jié)構(gòu)。結(jié)構(gòu)。n (( 3)實現(xiàn)所需的文件操作調(diào)用,如)實現(xiàn)所需的文件操作調(diào)用,如 read、 write等。等。n (( 2)實現(xiàn)初始化模塊函數(shù))實現(xiàn)初始化模塊函數(shù) __init,其中定義設備號。其中定義設備號。n (( 3)實現(xiàn)初始化函數(shù))實現(xiàn)初始化函數(shù) ,其中實現(xiàn)驅(qū)動的注冊。其中實現(xiàn)驅(qū)動的注冊。n (( 6)實現(xiàn)中斷服務,并用)實現(xiàn)中斷服務,并用 request_irq向內(nèi)核注冊。向內(nèi)核注冊。n (( 7)實現(xiàn)卸載模塊函數(shù))實現(xiàn)卸載模塊函數(shù) __exit,完成驅(qū)動的注銷完成驅(qū)動的注銷 ,釋放設備號釋放設備號n (( 7)編譯該驅(qū)動程序到內(nèi)核中,或者用)編譯該驅(qū)動程序到內(nèi)核中,或者用 insmod命令加載模塊。命令加載模塊。n (( 8)測試該設備,編寫應用程序,對驅(qū)動程序進行測試。)測試該設備,編寫應用程序,對驅(qū)動程序進行測試。62TM 62ARM及 Thumb指令集定義定義 file_operations結(jié)構(gòu)結(jié)構(gòu) p228n 在在 simple設備驅(qū)動程序中它的設備驅(qū)動程序中它的 file_operations結(jié)構(gòu)是如下初結(jié)構(gòu)是如下初始化的始化的 :n structfile_operationssimple_fops={n .owner=THIS_MODULE,n .llseek=simple_llseek,n .read=simple_read,n .write=simple_write,n .ioctl=simple_ioctl,n .open=simple_open,n .release=simple_release,}。?對對 simple_fops變量變量進行初始化進行初始化?將對應操作的將對應操作的 函數(shù)名函數(shù)名作為作為 指針指針 傳遞給相應傳遞給相應的成員的成員63TM 63ARM及 Thumb指令集 p228n 設備驅(qū)動程序的開發(fā)流程設備驅(qū)動程序的開發(fā)流程 n (( 1)硬件接口設計或使用嵌入式處理器的生產(chǎn)商提供參考接口)硬件接口設計或使用嵌入式處理器的生產(chǎn)商提供參考接口電路。電路。n (( 2)設計所要實現(xiàn)的文件操作,定義)設計所要實現(xiàn)的文件操作,定義 file_operations結(jié)構(gòu)。結(jié)構(gòu)。n (( 3)) 實現(xiàn)所需的文件操作調(diào)用,如實現(xiàn)所需的文件操作調(diào)用,如 open、 read、 write等。等。n (( 2)實現(xiàn)初始化模塊函數(shù))實現(xiàn)初始化模塊函數(shù) __init,其中定義設備號。其中定義設備號。n (( 3)實現(xiàn)初始化函數(shù))實現(xiàn)初始化函數(shù) ,其中實現(xiàn)驅(qū)動的注冊。其中實現(xiàn)驅(qū)動的注冊。n (( 6)實現(xiàn)中斷服務,并用)實現(xiàn)中斷服務,并用 request_irq向內(nèi)核注冊。向內(nèi)核注冊。n (( 7)實現(xiàn)卸載模塊函數(shù))實現(xiàn)卸載模塊函數(shù) __exit,完成驅(qū)動的注銷完成驅(qū)動的注銷 ,釋放設備號釋放設備號n (( 7)編譯該驅(qū)動程序到內(nèi)核中,或者用)編譯該驅(qū)動程序到內(nèi)核中,或者用 insmod命令加載模塊。命令加載模塊。n (( 8)測試該設備,編寫應用程序,對驅(qū)動程序進行測試。)測試該設備,編寫應用程序,對驅(qū)動程序進行測試。64TM 64ARM及 Thumb指令集實現(xiàn)所需的文件操作調(diào)用實現(xiàn)所需的文件操作調(diào)用 p228n staticintdevice_open(structinode*inode,structfile*file){printk(“simpledeviceisopen\n”)。//打印一句話打印一句話try_module_get(THIS_MODULE)n …………n return0。}n 函數(shù):函數(shù): try_module_get()n 173。173。如果模塊已經(jīng)插入內(nèi)核,則遞增該模塊引用計數(shù),每次加如果模塊已經(jīng)插入內(nèi)核,則遞增該模塊引用計數(shù),每次加1;如果該模塊還沒有插入內(nèi)核,則返回;如果該模塊還沒有插入內(nèi)核,則返回 0表示出錯。表示出錯。65TM 65ARM及 Thumb指令集實現(xiàn)所需的文件操作調(diào)用實現(xiàn)所需的文件操作調(diào)用n staticintdevice_release(structinode*inode,structfile*file){printk(“Simpledevice_releasecall\n)。module_put(THIS_MODULE)。n …………n return0。}n 函數(shù):函數(shù): module_put()n 173。173。與與 try_module_get()相對應,相對應, 該模塊引用計數(shù)減該模塊引用計數(shù)減 1;如果該;如果該模塊還沒有插入內(nèi)核,則返回模塊還沒有插入內(nèi)核,則返回 0表示出錯表示出錯66TM 66ARM及 Thumb指令集n 設備驅(qū)動程序的開發(fā)流程設備驅(qū)動程序的開發(fā)流程 n (( 1)硬件接口設計或使用嵌入式處理器的生產(chǎn)商提供參考接口)硬件接口設計或使用嵌入式處理器的生產(chǎn)商提供參考接口電路。電路。n (( 2)設計所要實現(xiàn)的文件操作,定義)設計所要實現(xiàn)的文件操作,定義 file_operations結(jié)構(gòu)。結(jié)構(gòu)。n (( 3)實現(xiàn)所需的文件操作調(diào)用,如)實現(xiàn)所需的文件操作調(diào)用,如 read、 write等。等。n (( 2)) 實現(xiàn)初始化模塊函數(shù)實現(xiàn)初始化模塊函數(shù) __init,其中定義設備號。其中定義設備號。n (( 3)實現(xiàn)初始化函數(shù))實現(xiàn)初始化函數(shù) ,其中實現(xiàn)驅(qū)動的注冊。其中實現(xiàn)驅(qū)動的注冊。n (( 6)實現(xiàn)中斷服務,并用)實現(xiàn)中斷服務,并用 request_irq向內(nèi)核注冊。向內(nèi)核注冊。n (( 7)實現(xiàn)卸載模塊函數(shù))實現(xiàn)卸載模塊函數(shù) __exit,完成驅(qū)動的注銷完成驅(qū)動的注銷 ,釋放設備號釋放設備號n (( 7)編譯該驅(qū)動程序到內(nèi)核中,或者用)編譯該驅(qū)動程序到內(nèi)核中,或者用 insmod命令加載模塊。命令加載模塊。n (( 8)測試該設備,編寫應用程序,對驅(qū)動程序進行測試。)測試該設備,編寫應用程序,對驅(qū)動程序進行測試。67TM 67ARM及 Thumb指令集1)設備主設備號的添加和注銷 p225n 設備驅(qū)動在加載時首先需要調(diào)用入口函數(shù)設備驅(qū)動在加載時首先需要調(diào)用入口函數(shù) module_init(),該,該函數(shù)完成設備驅(qū)動的函數(shù)完成設備驅(qū)動的 初始化工作初始化工作 ,比如分配設備號,比如分配設備號 ,驅(qū)動程序驅(qū)動程序的注冊的注冊 ,寄存器置位、結(jié)構(gòu)體賦值等。寄存器置位、結(jié)構(gòu)體賦值等。68TM 68ARM及 Thumb指令集1)設備主設備號的添加和注銷 p226n 建立字符設備以前,建立字符設備以前, 必須分配設備號必須分配設備號 ??梢允褂???梢允褂胷egister_chrdev_region函數(shù)完成,該函數(shù)原型如下:函數(shù)完成,該函數(shù)原型如下:n intregister_chrdev_region(dev_tfirst,unsignedintcount,char*name)n First:是要分配的設備號范圍的起始值是要分配的設備號范圍的起始值n Count:是請求的連續(xù)設備號的數(shù)目是請求的連續(xù)設備號的數(shù)目n Name:是與該編號范圍關(guān)聯(lián)的設備名稱,也就是在是與該編號范圍關(guān)聯(lián)的設備名稱,也就是在/proc/devices和和 sysfh中出現(xiàn)的名稱。中出現(xiàn)的名稱。n 如何能夠確定起始范圍如何能夠確定起始范圍 ?69TM 69ARM及 Thumb指令集n 實際上,實際上, Linux提供了提供了 動態(tài)分配設備號的函數(shù)動態(tài)分配設備號的函數(shù) ,通過這個函,通過這個函數(shù),內(nèi)核可以為我們分配合適的設備號。函數(shù)原型如下:數(shù),內(nèi)核可以為我們分配合適的設備號。函數(shù)原型如下:n intalloc_chrdev_region(dev_t*dev,unsignedintfirsetminor,unsignedintcount,char*name)n 該函數(shù)的返回值為該函數(shù)的返回值為 0,表示不能獲得設備號表示不能獲得設備號n dev:用于輸出的參數(shù)用于輸出的參數(shù) ,保存已分配范圍的第一個編號。,保存已分配范圍的第一個編號。n Firstminor:是要使用的被請求的第一個是要使用的被請求的第一個 次設備號次設備號 ,通常設置,通常設置為為 0。n Count:是請求的連續(xù)設備號的數(shù)目是請求的連續(xù)設備號的數(shù)目n Name:是與該編號范圍關(guān)聯(lián)的設備名稱是與該編號范圍關(guān)聯(lián)的設備名稱70TM 70ARM及 Thumb指令集動態(tài)分配設備號動態(tài)分配設備號n 例如例如 :n defineCDRIVER_NAME“simple_chrev”n dev_tsimple_dev。n intresult,count=1,CDRIVER_MAJOR=0,CDRIVER_MINOR=0。n result=alloc_chrdev_region(simple_dev,CDRIVER_MINOR,count,CDRIVER_NAME)n CDRIVER_MAJOR=MAJOR(simple_dev)。n If(result0)n {n printk(KERN_ERR“cannotgetmajor% d\n,CDRIVER_MAJOR)。n }71TM 71ARM及 Thumb指令集n 將不需要的資源及時釋放是一個好的編程習慣。在不使用設將不需要的資源及時釋放是一個好的編程習慣。在不使用設備號時,也應該把它釋放,只需調(diào)用備號時,也應該把它釋放,只需調(diào)用unregister_chrdev_region函數(shù)即可。函數(shù)原型如下:函數(shù)即可。函數(shù)原型如下:n Voidunregister_chrdev_region(dev_tfirst,unsignedcount)n 例如例如 :n staticvoid__exitsimple_exit(void)n {n unregister_chrdev_region(simple_dev,count)n }72TM 72ARM及 Thumb指令集n 設備驅(qū)動程序的開發(fā)流程設備驅(qū)動程序的開發(fā)流程 n (( 1)硬件接口設計或使用嵌入式處理器的生產(chǎn)商提供參考接口)硬件接口設計或使用嵌入
點擊復制文檔內(nèi)容
教學課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1