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

正文內(nèi)容

第6章第硬件和設(shè)備驅(qū)動(dòng)程序-閱讀頁

2025-01-30 16:22本頁面
  

【正文】 則不再檢測其它的以太網(wǎng)設(shè)備。每一類設(shè)備驅(qū)動(dòng):字符設(shè)備、塊設(shè)備 及網(wǎng)絡(luò)設(shè)備都提供了通用接口,以便在需要時(shí)為核心提供服務(wù)。如 SCSI和 IDE硬盤的區(qū)別很大,但 Linux對它們使用相同的接口。每次 Linux核心啟動(dòng)時(shí)如遇到不同的物理設(shè)備將需要不同的物理設(shè)備驅(qū)動(dòng)。設(shè)備驅(qū)動(dòng)在啟動(dòng)初始化時(shí)可能會(huì)發(fā)現(xiàn)系統(tǒng)中根本沒有任何硬件需要控制。為了處理設(shè)備驅(qū)動(dòng)的動(dòng)態(tài)屬性,設(shè)備驅(qū)動(dòng)在初始化時(shí)將其注冊到核心中去。這些表中包含支持此類設(shè)備例程的指針和相關(guān)信息。 Unix對硬件設(shè)備支持兩個(gè)標(biāo)準(zhǔn)接口:塊特別設(shè)備文件和字符特別設(shè)備文件,通過塊(字符)特別設(shè)備文件存取的設(shè)備稱為塊(字符)設(shè)備或具有塊(字符)設(shè)備接口。 ? 字符設(shè)備接口支持面向字符的 I/O操作,它不經(jīng)過系統(tǒng)的快速緩存,所以它們負(fù)責(zé)管理自己的緩沖區(qū)結(jié)構(gòu)。顯然,本程序所驅(qū)動(dòng)的串行卡只能提供順序存取的功能,屬于是字符設(shè)備,因此后面的討論在兩種設(shè)備有所區(qū)別時(shí)都只涉及字符型設(shè)備接口。主設(shè)備號唯一標(biāo)識了設(shè)備類型,即設(shè)備驅(qū)動(dòng)程序類型,它是塊設(shè)備表或字符設(shè)備表中設(shè)備表項(xiàng)的索引。 ? 設(shè)備驅(qū)動(dòng)程序可以分為三個(gè)主要組成部分: ? (1) 自動(dòng)配置和初始化子程序,負(fù)責(zé)檢測所要驅(qū)動(dòng)的硬件設(shè)備是否存在和是否能正常工作。這部分驅(qū)動(dòng)程序僅在初始化的時(shí)候被調(diào)用一次。調(diào)用這部分是由于系統(tǒng)調(diào)用的結(jié)果。 ? (3) 中斷服務(wù)子程序,又稱為驅(qū)動(dòng)程序的下半部分。中斷可以產(chǎn)生在任何一個(gè)進(jìn)程運(yùn)行的時(shí)候,因此在中斷服務(wù)程序被調(diào)用的時(shí)候,不能依賴于任何進(jìn)程的狀態(tài),也就不能調(diào)用任何與進(jìn)程運(yùn)行環(huán)境有關(guān)的函數(shù)。 ? 在系統(tǒng)內(nèi)部, I/O設(shè)備的存取通過一組固定的入口點(diǎn)來進(jìn)行,這組入口點(diǎn)是由每個(gè)設(shè)備的設(shè)備驅(qū)動(dòng)程序提供的。打開設(shè)備準(zhǔn)備 I/O操作。open子程序必須對將要進(jìn)行的 I/O操作做好必要的準(zhǔn)備工作,如清除緩沖區(qū)等。 (2) close入口點(diǎn)。當(dāng)最后一次使用設(shè)備終結(jié)后,調(diào)用 close子程序。 (3) read入口點(diǎn)。對于有緩沖區(qū)的 I/O操作,一般是從緩沖區(qū)里讀數(shù)據(jù)。 (4) write入口點(diǎn)。對于有緩沖區(qū)的 I/O操作,一般是把數(shù)據(jù)寫入緩沖區(qū)里。 (5) ioctl入口點(diǎn)。 (6) select入口點(diǎn)。 (2) close入口點(diǎn)。當(dāng)最后一次使用設(shè)備終結(jié)后,調(diào)用 close子程序。 (3) read入口點(diǎn)。對于有緩沖區(qū)的 I/O操作,一般是從緩沖區(qū)里讀數(shù)據(jù)。 (4) write入口點(diǎn)。對于有緩沖區(qū)的 I/O操作,一般是把數(shù)據(jù)寫入緩沖區(qū)里。 (5) ioctl入口點(diǎn)。 (6) select入口點(diǎn)。 ? select系統(tǒng)調(diào)用在檢查與設(shè)備特別文件相關(guān)的文件描述符時(shí)使用 select入口點(diǎn)。對于不同的系統(tǒng),也還有一些其它的入口點(diǎn)。 int (*read)(struct inode *inode,struct file *filp, char *buf, int count)。 int (*readdir)(struct inode *inode,struct file *filp, struct dirent *dirent,int count)。 int (*ioctl) (struct inode *inode,struct file *filp, unsigned int cmd,unsigned int arg)。 int (*open) (struct inode *inode, struct file *filp)。 int (*fsync) (struct inode *inode, struct file *filp)。 ? 其中, struct inode提供了關(guān)于特別設(shè)備文件/dev/driver(假設(shè)此設(shè)備名為 driver)的信息,它的定義為: include linux/ struct inode { dev_t i_dev。 // Inode number umode_t i_mode。 uid_t i_uid。 dev_t i_rdev。 time_t i_atime。 time_t i_ctime。 unsigned long i_blocks。 struct super_block * i_sb。 struct file_lock * i_flock。 struct inode * i_next, * i_prev。 struct inode * i_bound_to, * i_bound_by。 unsigned short i_flags。 unsigned char i_dirt。 unsigned char i_mount。 unsigned char i_update。 struct minix_inode_info minix_i。 struct msdos_inode_info msdos_i。 struct nfs_inode_info nfs_i。 }。當(dāng)然,其它設(shè)備驅(qū)動(dòng)程序也可以使用它。 dev_t f_rdev。 // Curr. posn in file unsigned short f_flags。 // Number of opens on this file unsigned short f_reada。 // pointer to the inode s truct struct file_operations *f_op。 ? 在結(jié)構(gòu) file_operations里,指出了設(shè)備驅(qū)動(dòng)程序所提供的入口點(diǎn)位置,分別是: (1) lseek,移動(dòng)文件指針的位置,顯然只能用于可以隨機(jī)存取的設(shè)備。返回值為負(fù)表示讀取操作發(fā)生錯(cuò)誤,否則返回實(shí)際讀取的字節(jié)數(shù)。 (3) write,進(jìn)行寫操作,與 read類似。 (5) selec,進(jìn)行選擇操作,如果驅(qū)動(dòng)程序沒有提供 select入口,select操作將會(huì)認(rèn)為設(shè)備已經(jīng)準(zhǔn)備好進(jìn)行任何的 I/O操作。 (7) mmap,用于把設(shè)備的內(nèi)容映射到地址空間,一般只有塊設(shè)備驅(qū)動(dòng)程序使用。返回 0表示打開成功,返回負(fù)數(shù)表示失敗。 (9) release,即 close操作。Linux系統(tǒng)里,通過調(diào)用 register_chrdev向系統(tǒng)注冊字符型設(shè)備驅(qū)動(dòng)程序。 其中, major是為設(shè)備驅(qū)動(dòng)程序向系統(tǒng)申請的主設(shè)備號,如果為 0則系統(tǒng)為此驅(qū)動(dòng)程序動(dòng)態(tài)地分配一個(gè)主設(shè)備號。 fops就是前面所說的對各個(gè)調(diào)用的入口點(diǎn)的說明。返回 EINVAL表示申請的主設(shè)備號非法,一般來說是主設(shè)備號大于系統(tǒng)所允許的最大設(shè)備號。如果是動(dòng)態(tài)分配主設(shè)備號成功,此函數(shù)將返回所分配的主設(shè)備號。 ? 初始化部分一般還負(fù)責(zé)給設(shè)備驅(qū)動(dòng)程序申請系統(tǒng)資源,包括內(nèi)存、中斷、時(shí)鐘、 I/O端口等,這些資源也可以在 open子程序或別的地方申請。 ? 在 Unix系統(tǒng)里,對中斷的處理是屬于系統(tǒng)核心的部分,因此如果設(shè)備與系統(tǒng)之間以中斷方式進(jìn)行數(shù)據(jù)交換的話,就必須把該設(shè)備的驅(qū)動(dòng)程序作為系統(tǒng)核心的一部分。它們的定義為: include linux/ int request_irq(unsigned int irq, void (*handler)(int irq,void dev_id,struct pt_regs *regs), unsigned long flags, const char *device, void *dev_id)。 ? 參數(shù) irq表示所要申請的硬件中斷號。 device為設(shè)備名,將會(huì)出現(xiàn)在 /proc/interrupts文件里。在 Linux系統(tǒng)中,中斷可以被不同的中斷處理程序共享,這要求每一個(gè)共享此中斷的處理程序在申請中斷時(shí)在 flags里設(shè)置 SA_SHIRQ,這些處理程序之間以 dev_id來區(qū)分。 request_irq返回 0表示成功,返回 INVAL表示 irq15或 handler==NULL,返回EBUSY表示中斷已經(jīng)被占用且不能共享。 void kfree(void * obj)。priority為分配內(nèi)存操作的優(yōu)先級,即在沒有足夠空閑內(nèi)存時(shí)如何操作,一般用 GFP_KERNEL。任何進(jìn)程都可以訪問任何一個(gè) I/O端口。因此,在使用 I/O端口前,也應(yīng)該檢查此 I/O端口是否已有別的程序在使用,若沒有,再把此端口標(biāo)記為正在使用,在使用完以后釋放它。 void request_region(unsigned int from, unsigned int extent, const char *name)。 ? 調(diào)用這些函數(shù)時(shí)的參數(shù)為: from表示所申請的 I/O端口的起始地址; ? extent為所要申請的從 from開始的端口數(shù); name為設(shè)備名,將會(huì)出現(xiàn)在 /proc/ioports文件里。 ? 在申請了 I/O端口之后,就可以如下幾個(gè)函數(shù)來訪問 I/O端口: include asm/ inline unsigned int inb(unsigned short port)。 inline void outb(char value, unsigned short port)。 其中 inb_p和 outb_p插入了一定的延時(shí)以適應(yīng)某些慢的 I/O端口。在 Linux系統(tǒng)中,時(shí)鐘是由系統(tǒng)接管,設(shè)備驅(qū)動(dòng)程序可以向系統(tǒng)申請時(shí)鐘。 int del_timer(struct timer_list * timer) inline void init_timer(struct timer_list * timer)。 struct timer_list *prev。 unsigned long data。 }。系統(tǒng)核心有一個(gè)全局變量JIFFIES表示當(dāng)前時(shí)間,一般在調(diào)用 add_timer時(shí)jiffies=JIFFIES+num,表示在 num個(gè)系統(tǒng)最小時(shí)間間隔后執(zhí)行unction。系統(tǒng)計(jì)時(shí)到預(yù)定時(shí)間就調(diào)用 function,并把此子程序從定時(shí)隊(duì)列里刪除,因此如果想要每隔一定時(shí)間間隔執(zhí)行一次的話,就必須在function里再一次調(diào)用 add_timer。 ? 在設(shè)備驅(qū)動(dòng)程序里,還可能會(huì)用到如下的一些系統(tǒng)函數(shù): include asm/ define cli() __asm__ __volatile__ (cli::) define sti() __asm__ __volatile__ (sti::) ? 這兩個(gè)函數(shù)負(fù)責(zé)打開和關(guān)閉中斷允許。 void memcpy_tofs(void * to,const void * from,unsigned long n)。而 read、 write中參數(shù) buf是指向用戶程序的私有地址空間的,所以不能直接訪問,必須通過上述兩個(gè)系統(tǒng)函數(shù)來訪問用戶程序的私有地址空間。參數(shù) to為復(fù)制的目的指針, from為源指針,n為要復(fù)制的字節(jié)數(shù)。 printk打印的信息不僅出現(xiàn)在屏幕上,同時(shí)還記錄在文件 syslog里。 ? 6. 什么叫字符型設(shè)備?什么叫塊設(shè)備?為什么在 Unix系統(tǒng)中這兩種設(shè)備都以特別文件的形式出現(xiàn)? ? 7. 在 Unix系統(tǒng)中,用什么命令可以發(fā)現(xiàn)特別文件或普通文件?特別文件和普通文件在文件屬性 i節(jié)點(diǎn)中有什么標(biāo)記?這種標(biāo)記在文件讀 /寫時(shí)有何重要作用? ? 8. 特別文件和普通文件在創(chuàng)建方法上不同,這是為什么? ? 9. 在 Unix系統(tǒng)中,字符設(shè)備開關(guān)表 (cdevsw)有什么作用? ? 10. 在字符設(shè)備緩沖鏈 clist上有多種操作,試寫出實(shí)現(xiàn) getcb, putcbp, putcb, getcbp的 C語言程序。 ? 11. 試舉例說明字符設(shè)備驅(qū)動(dòng)程序的工作過程。 ? 22. 設(shè)備組與設(shè)備預(yù)訂技術(shù)有什么優(yōu)點(diǎn)?
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1