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

正文內(nèi)容

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

2025-03-02 11:44本頁面
  

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