資源描述:
《Linux設(shè)備驅(qū)動(dòng)程序課件.ppt》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、內(nèi)容設(shè)備分類設(shè)備驅(qū)動(dòng)程序的框架字符型設(shè)備網(wǎng)絡(luò)設(shè)備文件系統(tǒng)UserSpaceFileSystemUSB設(shè)備FrameBuffer例子和使用Debug原理和Debug方法常用設(shè)備/fb/ram/loopback/zerohttp://www.docin.com/sundae_meng設(shè)備驅(qū)動(dòng)程序的任務(wù)設(shè)備初始化硬件操作和管理外部硬件和內(nèi)核空間的數(shù)據(jù)傳遞內(nèi)核空間和用戶空間的數(shù)據(jù)傳遞http://www.docin.com/sundae_meng設(shè)備驅(qū)動(dòng)程序的功能外部硬件設(shè)備驅(qū)動(dòng)程序用戶程序存儲(chǔ)緩沖用戶空間內(nèi)核空間http://www.docin.com/sundae_meng用戶態(tài)
2、程序vs內(nèi)核態(tài)程序用戶程序權(quán)限受限虛擬運(yùn)行環(huán)境邏輯地址關(guān)鍵資源訪問(wèn)受監(jiān)管函數(shù)調(diào)用由用戶控制內(nèi)核程序最高權(quán)限實(shí)際的運(yùn)行環(huán)境物理地址可訪問(wèn)所有資源函數(shù)由內(nèi)核直接調(diào)用可以運(yùn)行驅(qū)動(dòng)程序設(shè)備操作和管理能運(yùn)行在用戶態(tài)嗎?http://www.docin.com/sundae_meng地址映射與物理地址訪問(wèn)物理地址空間用戶進(jìn)程1用戶進(jìn)程2用戶進(jìn)程3虛擬地址映射用戶利用指針訪問(wèn)的是虛地址,不是物理地址,IO設(shè)備的物理地址可能是用戶進(jìn)程不可觸及的虛擬地址映射虛擬地址映射http://www.docin.com/sundae_meng直接訪問(wèn)內(nèi)核內(nèi)存(/dev/kmem)kmfd?=?open(
3、"/dev/kmem",?O_RDONLY?);?lseek(?kmfd,?offset,?SEEK_SET?);?read(?kmfd,?byteArray,?byteArrayLen?);?close(kmfd);直接訪問(wèn)內(nèi)核地址(內(nèi)核態(tài)的虛地址)一般內(nèi)核地址起始于0xC0000000http://www.docin.com/sundae_meng直接訪問(wèn)物理地址(/dev/mem)mem_fd?=?open("/dev/mem",?O_RDONLY?);?b=mmap(0,0x10000,PROT_READ
4、PROT_WRITE,MAP_SHARED,mem
5、_fd,0xA0000)…close(memfd);0xA00000xB0000Pointerbmmap將文件中的數(shù)據(jù)映射成數(shù)組這里是將物理內(nèi)存(由特殊文件/dev/mem訪問(wèn))映射成指針b指向的數(shù)組。注意,指針b的值不一定是0xA0000,它是和物理地址0xA0000對(duì)應(yīng)的用戶態(tài)的虛擬地址Linux中/dev/mem主要是用于設(shè)備內(nèi)存的訪問(wèn)(比如顯卡內(nèi)存),而不是普通存儲(chǔ)器http://www.docin.com/sundae_meng直接訪問(wèn)IO端口(/dev/port)port_fd?=?open("/dev/port",?O_RDWR);?lseek(port_fd
6、,?port_addr,?SEEK_SET);?read(port_fd,?…);write(port_fd,?…);close(port_fd);注意:不能用fopen/fread/fwrite/fclose因?yàn)樗鼈冇袛?shù)據(jù)緩沖,對(duì)讀寫(xiě)操作不是立即完成的http://www.docin.com/sundae_mengoutb()/outw()/inb()/inw()函數(shù)#include#include#include#defineBASEPORT0x378//printerintmain(){ioperm(BASE
7、PORT,3,1));//getaccesspermissionoutb(0,BASEPORT);usleep(100000);printf("status:%d",inb(BASEPORT+1));ioperm(BASEPORT,3,0));//giveupexit(0);}ioperm(from,num,turn_on)用ioperm申請(qǐng)的操作端口地址在0x000~0x3FF,利用iopl()可以申請(qǐng)所有的端口地址必須以root運(yùn)行用“gcc-02–oxxx.elfxxx.c”編譯outb(value,port);inb(port);//8-bitoutw(value
8、,port);inw(port);//16-bit訪問(wèn)時(shí)間大約1ushttp://www.docin.com/sundae_meng設(shè)備驅(qū)動(dòng)程序內(nèi)訪問(wèn)設(shè)備地址設(shè)備驅(qū)動(dòng)程序可以通過(guò)指針訪問(wèn)設(shè)備地址設(shè)備驅(qū)動(dòng)程序接觸到的還是虛擬地址,但對(duì)于外界設(shè)備有固定的設(shè)備地址映射(設(shè)備的地址在移植Linux時(shí)候確定)物理內(nèi)存地址空間設(shè)備驅(qū)動(dòng)程序虛擬地址映射設(shè)備地址空間設(shè)備地址映射設(shè)備驅(qū)動(dòng)程序虛擬地址映射設(shè)備地址映射http://www.docin.com/sundae_meng直接訪問(wèn)IO端口vs設(shè)備驅(qū)動(dòng)程序IO直接訪問(wèn)