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

正文內(nèi)容

第6章第硬件和設(shè)備驅(qū)動(dòng)程序(參考版)

2025-01-22 16:22本頁面
  

【正文】 ? 12. 塊設(shè)備的塊長(zhǎng)是如何確定的?它與塊緩沖區(qū)長(zhǎng)度有什么關(guān)系? ? 13. 在 Unix系統(tǒng)中,為什么要?jiǎng)?chuàng)建塊設(shè)備文件和字符設(shè)備文件? ? 14. 塊設(shè)備開關(guān)表 (bdevsw)在 Unix系統(tǒng)的塊設(shè)備管理中有什么作用? ? 15. 為什么設(shè)備輸入輸出都離不開緩沖區(qū)? ? 16. 在 Unix系統(tǒng)中,“預(yù)先讀”,“異步寫”,“延遲寫”有什么好處? ? 17. 設(shè)備塊緩沖隊(duì)列 (設(shè)備 b鏈 )為什么采用散列技術(shù)? ? 18. 塊設(shè)備 I/O請(qǐng)求隊(duì)列中如何考慮減少磁頭 (硬盤 )移動(dòng)距離? ? 19. 有哪些過程要調(diào)用塊設(shè)備驅(qū)動(dòng)程序 gdstrategy?gdstrategy本身完成哪些工作? ? 20. 硬盤中斷處理程序是如何協(xié)同驅(qū)動(dòng)程序工作的? ? 21. 試說明從塊設(shè)備讀入一物理塊到主存用戶區(qū)的全過程。注意,對(duì)緩沖區(qū)的操作應(yīng)互斥進(jìn)行。 練習(xí)與思考 ? 1. 為什么要進(jìn)行設(shè)備管理?有哪些主要的管理工作? ? 2. 用于設(shè)備分配的數(shù)據(jù)結(jié)構(gòu)有哪些?它們之間的關(guān)系如何? ? 3. 什么叫“與設(shè)備無關(guān)性”?如何做到“與設(shè)備無關(guān)性”? ? 4. 為什么要為設(shè)備劃分狀態(tài)?狀態(tài)是如何變換的? ? 5. 舉例說明在中斷控制下使用外設(shè)的全過程。 ? 在設(shè)備驅(qū)動(dòng)程序里,可以調(diào)用 printk來打印一些調(diào)試信息,用法與 printf類似。 memcpy_fromfs由用戶程序地址空間往核心地址空間復(fù)制, memcpy_tofs則反之。 ? 在用戶程序調(diào)用 read 、 write時(shí),因?yàn)檫M(jìn)程的運(yùn)行狀態(tài)由用戶態(tài)變?yōu)楹诵膽B(tài),地址空間也變?yōu)楹诵牡刂房臻g。 include asm/ void memcpy_fromfs(void * to,const void * from,unsigned long n)。 function的參數(shù) d即為 timer里面的 data項(xiàng)。系統(tǒng)最小時(shí)間間隔與所用的硬件平臺(tái)有關(guān),在核心里定義了常數(shù) HZ表示一秒內(nèi)最小時(shí)間間隔的數(shù)目,則 num*HZ表示 num秒。 ? 其中 expires是要執(zhí)行 function的時(shí)間。 void (*function)(unsigned long d)。 unsigned long expires。 struct timer_list的定義為: struct timer_list { struct timer_list *next。與時(shí)鐘有關(guān)的系統(tǒng)調(diào)用有: include asm/ include linux/ void add_timer(struct timer_list * timer)。 ? 在設(shè)備驅(qū)動(dòng)程序里,一般都需要用到計(jì)時(shí)機(jī)制。 inline void outb_p(char value, unsigned short port)。 inline unsigned int inb_p(unsigned short port)。 check_region返回 0表示 I/O端口空閑,否則為正在被使用。 void release_region(unsigned int from, unsigned int extent)。 ? 這樣需要用到如下幾個(gè)函數(shù): int check_region(unsigned int from, unsigned int extent)。此時(shí)系統(tǒng)無法保證對(duì) I/O端口的操作不會(huì)發(fā)生沖突,甚至?xí)虼硕瓜到y(tǒng)崩潰。 ? 與中斷和內(nèi)存不同,使用一個(gè)沒有申請(qǐng)的 I/O端口不會(huì)使CPU產(chǎn)生異常,也就不會(huì)導(dǎo)致諸如“ segmentation fault一類的錯(cuò)誤發(fā)生。 ? 參數(shù) len為希望申請(qǐng)的字節(jié)數(shù), obj為要釋放的內(nèi)存指針。 ? 作為系統(tǒng)核心的一部分,設(shè)備驅(qū)動(dòng)程序在申請(qǐng)和釋放內(nèi)存時(shí)不是調(diào)用 malloc和 free,而代之以調(diào)用 kmalloc和kfree,它們被定義為: include linux/ void * kmalloc(unsigned int len, int priority)。如果中斷由某個(gè)處理程序獨(dú)占,則 dev_id可以為 NULL。 flag是申請(qǐng)時(shí)的選項(xiàng),它決定中斷處理程序的一些特性,其中最重要的是中斷處理程序是快速處理程序( flag里設(shè)置了SA_INTERRUPT)還是慢速處理程序(不設(shè)置SA_INTERRUPT),快速處理程序運(yùn)行時(shí),所有中斷都被屏蔽,而慢速處理程序運(yùn)行時(shí),除了正在處理的中斷外,其它中斷都沒有被屏蔽。 handler為向系統(tǒng)登記的中斷處理子程序,中斷產(chǎn)生時(shí)由系統(tǒng)來調(diào)用,調(diào)用時(shí)所帶參數(shù) irq為中斷號(hào), dev_id為申請(qǐng)時(shí)告訴系統(tǒng)的設(shè)備標(biāo)識(shí), regs為中斷發(fā)生時(shí)寄存器內(nèi)容。 void free_irq(unsigned int irq, void *dev_id)。設(shè)備驅(qū)動(dòng)程序通過調(diào)用 request_irq函數(shù)來申請(qǐng)中斷,通過 free_irq來釋放中斷。在這些資源不用的時(shí)候,應(yīng)該釋放它們,以利于資源的共享。如果register_chrdev操作成功,設(shè)備名就會(huì)出現(xiàn)在 /proc/devices文件里。返回 EBUSY表示所申請(qǐng)的主設(shè)備號(hào)正在被其它設(shè)備驅(qū)動(dòng)程序使用。 ? 此函數(shù)返回 0表示成功。name是設(shè)備名。 register_chrdev定義為: include linux/ include linux/ int register_chrdev(unsigned int major, const char *name, struct file_operations *fops)。 ? 設(shè)備驅(qū)動(dòng)程序所提供的入口點(diǎn),在設(shè)備驅(qū)動(dòng)程序初始化的時(shí)候向系統(tǒng)進(jìn)行登記,以便系統(tǒng)在適當(dāng)?shù)臅r(shí)候調(diào)用。如果驅(qū)動(dòng)程序沒有提供 open入口,則只要/dev/driver文件存在就認(rèn)為打開成功。 (8) open,打開設(shè)備準(zhǔn)備進(jìn)行 I/O操作。 (6) ioctl,進(jìn)行讀、寫以外的其它操作,參數(shù) cmd為自定義的的命令。 (4) readdir,取得下一個(gè)目錄入口點(diǎn),只有與文件系統(tǒng)相關(guān)的設(shè)備驅(qū)動(dòng)程序才使用。對(duì)于字符型,要求讀取的字節(jié)數(shù)和返回的實(shí)際讀取字節(jié)數(shù)都必須是 inodei_blksize的的倍數(shù)。 (2) read,進(jìn)行讀操作,參數(shù) buf為存放讀取結(jié)果的緩沖區(qū), count為所要讀取的數(shù)據(jù)長(zhǎng)度。// pointer to the fop s struct }。 struct inode *f_inode。 // The flags arg passed to open unsigned short f_count。 // needed for /dev/tty off_t f_pos。它提供關(guān)于被打開的文件的信息,定義為: include linux/ struct file { mode_t f_mode。 ? struct file主要用于與文件系統(tǒng)對(duì)應(yīng)的設(shè)備驅(qū)動(dòng)程序使用。 } u。 struct iso_inode_info isofs_i。 struct ext_inode_info ext_i。 union { struct pipe_inode_info pipe_i。 unsigned char i_seek。 unsigned char i_pipe。 // Mount flags (see ) unsigned char i_lock。 unsigned short i_count。 struct inode * i_hash_next, * i_hash_prev。 struct vm_area_struct * i_mmap。 struct wait_queue * i_wait。 struct inode_operations * i_op。 unsigned long i_blksize。 time_t i_mtime。 // Device major and minor numbers off_t i_size。 gid_t i_gid。 // Mode of the file nlink_t i_nlink。 unsigned long i_ino。 }。 void (*release) (struct inode *inode, struct file *filp)。 int (*mmap) (void)。 int (*select)(struct inode *inode,struct file *filp, int sel_type,select_table *wait)。 int (*write)(struct inode *inode,struct file *filp, char *buf,int count)。 ? Linux系統(tǒng)下的設(shè)備驅(qū)動(dòng)程序 ? Linux系統(tǒng)里,設(shè)備驅(qū)動(dòng)程序所提供的這組入口點(diǎn)由一個(gè)結(jié)構(gòu)來向系統(tǒng)進(jìn)行說明,此結(jié)構(gòu)定義為: include linux/ struct file_operations { int (*lseek)(struct inode *inode,struct file *filp, off_t off,int pos)。如果設(shè)備驅(qū)動(dòng)程序沒有提供上述入口點(diǎn)中的某一個(gè),系統(tǒng)會(huì)用默認(rèn)的子程序來代替。檢查設(shè)備,看數(shù)據(jù)是否可讀或設(shè)備是否可用于寫數(shù)據(jù)。執(zhí)行讀、寫之外的操作。對(duì)字符特別設(shè)備文件進(jìn)行寫操作將調(diào)用 write子程序。往設(shè)備上寫數(shù)據(jù)。對(duì)字符特別設(shè)備文件進(jìn)行讀操作將調(diào)用 read子程序。從設(shè)備上讀數(shù)據(jù)。獨(dú)占設(shè)備必須標(biāo)記設(shè)備可再次使用。關(guān)閉一個(gè)設(shè)備。檢查設(shè)備,看數(shù)據(jù)是否可讀或設(shè)備是否可用于寫數(shù)據(jù)。執(zhí)行讀、寫之外的操作。對(duì)字符特別設(shè)備文件進(jìn)行寫操作將調(diào)用 write子程序。往設(shè)備上寫數(shù)據(jù)。對(duì)字符特別設(shè)備文件進(jìn)行讀操作將調(diào)用 read子程序。從設(shè)備上讀數(shù)據(jù)。獨(dú)占設(shè)備必須標(biāo)記設(shè)備可再次使用。關(guān)閉一個(gè)設(shè)備。如果設(shè)備是獨(dú)占的,即同一 時(shí)刻只能有一個(gè)程序訪問此設(shè)備,則 open子程序必須設(shè)置一些標(biāo)志以表示設(shè)備處于忙狀態(tài)。對(duì)字符特別設(shè)備文件進(jìn)行打開操作,都會(huì)調(diào)用設(shè)備的 open入口點(diǎn)。一般來說,字符型設(shè)備驅(qū)動(dòng)程序能夠提供如下幾個(gè)入口點(diǎn): (1) open入口點(diǎn)。因?yàn)樵O(shè)備驅(qū)動(dòng)程序一般支持同一類型的若干設(shè)備,所以一般在系統(tǒng)調(diào)用中斷服務(wù)子程序的時(shí)候,都帶有一個(gè)或多個(gè)參數(shù),以唯一標(biāo)識(shí)請(qǐng)求服務(wù)的設(shè)備。在Unix系統(tǒng)中,并不是直接從中斷向量表中調(diào)用設(shè)備驅(qū)動(dòng)程序的中斷服務(wù)子程序,而是由 Unix系統(tǒng)來接收硬件中斷,再由系統(tǒng)調(diào)用中斷服務(wù)子程序。這部分程序在執(zhí)行的時(shí)候,系統(tǒng)仍認(rèn)為是和進(jìn)行調(diào)用的進(jìn)程屬于同一個(gè)進(jìn)程,只是由用戶態(tài)變成了核心態(tài),具有進(jìn)行此系統(tǒng)調(diào)用的用戶程序的運(yùn)行環(huán)境,因此可以在其中調(diào)用 sleep()等與進(jìn)程運(yùn)行環(huán)境有關(guān)的函數(shù)。 ? (2) 服務(wù)于 I/O請(qǐng)求的子程序,又稱為驅(qū)動(dòng)程序的上半部分。如果該設(shè)備正常,則對(duì)這個(gè)設(shè)備及其相關(guān)的、設(shè)備驅(qū)動(dòng)程序需要的軟件狀態(tài)進(jìn)行初始化。次設(shè)備號(hào)僅由設(shè)備驅(qū)動(dòng)程序解釋,一般用于識(shí)別在若干可能的硬件設(shè)備中, I/O請(qǐng)求所涉及到的那個(gè)設(shè)備。 ? 設(shè)備由一個(gè)主設(shè)備號(hào)和一個(gè)次設(shè)備號(hào)標(biāo)識(shí)。字符設(shè)備接口只支持順序存取的功能,一般不能進(jìn)行任意長(zhǎng)度的I/O請(qǐng)求,而是限制 I/O請(qǐng)求的長(zhǎng)度必須是設(shè)備要求的基本塊長(zhǎng)的倍數(shù)。 ? 塊設(shè)備接口僅支持面向塊的 I/O操作,所有 I/O操作都通過在內(nèi)核地址空間中的 I/O緩沖區(qū)進(jìn)行,它可以支持幾乎任意長(zhǎng)度和任意位置上的 I/O請(qǐng)求,即提供隨機(jī)存取的功能。 ? Unix下設(shè)備驅(qū)動(dòng)程序的基本結(jié)構(gòu) ? 對(duì)用戶程序來說, Unix系統(tǒng)的設(shè)備驅(qū)動(dòng)程序隱藏了設(shè)備的具體細(xì)節(jié),對(duì)各種不同設(shè)備提供了一致的接口,一般來說是把設(shè)備映射為一個(gè)特殊的設(shè)備文件,用戶程序可以像對(duì)其它文件一樣對(duì)此設(shè)備文件進(jìn)行操作。 Linux維護(hù)著已
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1