




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1設(shè)備管理與模塊機(jī)制設(shè)備管理與模塊機(jī)制n基本概念n傳統(tǒng)方式的設(shè)備注冊(cè)與管理ndevfs注冊(cè)與管理n塊設(shè)備的請(qǐng)求隊(duì)列n網(wǎng)絡(luò)設(shè)備n模塊機(jī)制2基本概念基本概念n字符設(shè)備、塊設(shè)備、網(wǎng)絡(luò)設(shè)備 字符設(shè)備以字節(jié)為單位進(jìn)行數(shù)據(jù)處理,通常只允許按順序訪問 塊設(shè)備將數(shù)據(jù)按可尋址的塊為單位進(jìn)行處理,可以隨機(jī)訪問,利用緩沖技術(shù)網(wǎng)絡(luò)設(shè)備是一類特殊的設(shè)備,每塊網(wǎng)卡有名字但沒有設(shè)備文件與之對(duì)應(yīng) 查看系統(tǒng)中的設(shè)備:/proc/devicesn主設(shè)備號(hào)和次設(shè)備號(hào) major number:相同的設(shè)備使用相同的驅(qū)動(dòng)程序 minor number:用來區(qū)分具體設(shè)備的實(shí)例 查看設(shè)備及其類型“l(fā)s -l /dev”n設(shè)備文件系統(tǒng)dev
2、fs /dev目錄過于龐大,很多設(shè)備文件沒有對(duì)應(yīng)系統(tǒng)中的設(shè)備 devfs根據(jù)系統(tǒng)中的實(shí)際設(shè)備構(gòu)建設(shè)備文件,并按目錄存放,如/dev/disk,/dev/pts3基本概念基本概念用戶空間內(nèi)核空間I/O請(qǐng)求設(shè)備驅(qū)動(dòng)程序設(shè) 備ISR系統(tǒng)調(diào)用ret_from_sys_call返回,進(jìn)程繼續(xù)4基本概念基本概念用 戶 程 序 調(diào) 用Fd=fopen(“/dev/hda”,O_RDWR,0);read(buff,fd,size)write(fd,buff,size)close(fd)Virtual file systemGeneric_file_read()Generic_file_write()塊 設(shè) 備
3、 文 件建立設(shè)備:#mknod /dev/dev_name type major_number minor_number 5VFSVFS中的文件中的文件ninclude/linux/fs.hstruct file struct *f_op;struct loff_t (*llseek)(struct file *,loff_t,int); ssize_t (*read)(struct file *,char *,size_t,loff_t *); ssize_t (*write)(struct file *,const char *,size_t,loff_t *); int(*ioctl)
4、(struct inode *,struct file *,unsigned int,unsigned long); int(*mmap) (struct file *,struct vm_area_struct *); int(*open) (struct inode *,struct file *); int(*release) (struct inode *,struct file *); int(*fsync) (struct file *,struct dentry *,int datasync); int(*fasync) (int,struct file *,int); ;6(1
5、) llseek(file, offset, whence):修改文件的讀寫指針。(2) read(file, buf, count, offset):從設(shè)備文件的offset 處開始讀出count個(gè)字節(jié),然后增加*offset的值。(3) write(file, buf, count, offset):從設(shè)備文件的offset處寫入count個(gè)字節(jié),然后增加*offset的值。(4) ioctl(inode, file, cmd, arg):向一個(gè)硬件設(shè)備發(fā)命令,對(duì)設(shè)備進(jìn)行控制。(5) mmap(file, vma):將設(shè)備空間映射到進(jìn)程地址空間。(6) open(inode, file):
6、打開并初始化設(shè)備。(7) release(inode, file):關(guān)閉設(shè)備并釋放資源。(8) fsync(file, dentry):實(shí)現(xiàn)內(nèi)存與設(shè)備之間的同步通信。(9) fasync(file, on):實(shí)現(xiàn)內(nèi)存與設(shè)備之間的異步通信。7nfs/devices.cstruct device_struct const char * name; struct * fops;static struct device_struct chrdevsMAX_CHRDEV; 注冊(cè)與注銷函數(shù):int register_chrdev(unsigned int major, const char * name,
7、 struct *fops)int unregister_chrdev(unsigned int major, const char * name);注:major即設(shè)備的主設(shè)備號(hào),注冊(cè)后就是訪問數(shù)組chrdevs的索引(下標(biāo))。字符設(shè)備的注冊(cè)與管理字符設(shè)備的注冊(cè)與管理8PCIPCI設(shè)備(驅(qū)動(dòng)實(shí)現(xiàn)見設(shè)備(驅(qū)動(dòng)實(shí)現(xiàn)見wordword文檔)文檔)Linux內(nèi)核啟動(dòng)時(shí)會(huì)對(duì)所有內(nèi)核啟動(dòng)時(shí)會(huì)對(duì)所有PCI設(shè)備進(jìn)行掃描、登錄和分配資源等初始化設(shè)備進(jìn)行掃描、登錄和分配資源等初始化操作,建立起系統(tǒng)中所有操作,建立起系統(tǒng)中所有PCI設(shè)備的拓?fù)浣Y(jié)構(gòu)設(shè)備的拓?fù)浣Y(jié)構(gòu)此后當(dāng)內(nèi)核欲初始化某設(shè)備時(shí),調(diào)用此后當(dāng)內(nèi)核欲初始化某設(shè)
8、備時(shí),調(diào)用module_initmodule_init加載該設(shè)備的驅(qū)動(dòng)程加載該設(shè)備的驅(qū)動(dòng)程序序9塊設(shè)備塊設(shè)備nfs/block_dev.cstatic struct const char *name; struct block_device_operations *bdops; blkdevsMAX_BLKDEV; 10塊設(shè)備注冊(cè)塊設(shè)備注冊(cè)nfs/block_register_blkdev(unsigned int major,const char *name, struct block_device_operations *bdops)nint unregister_blkdev(unsig
9、ned int major, const char * name)11塊設(shè)備的操作塊設(shè)備的操作block_device_operationsstruct block_device_operations int (*open) (struct inode *, struct file *);int (*release) (struct inode *, struct file *);int (*ioctl) (struct inode *, struct file *, unsigned, unsigned long);int (*check_media_change) (kdev_t);int
10、 (*revalidate) (kdev_t);struct module *owner;12nblock_device_operations并不能完全提供結(jié)構(gòu)中的所必需的主要函數(shù)(例如read、write),所以內(nèi)核實(shí)際上是采用def_blk_fops變量對(duì)相關(guān)的變量進(jìn)行了賦值: struct def_blk_fops ; n除了open、release等函數(shù)利用了設(shè)備注冊(cè)時(shí)提供的block_device_operations結(jié)構(gòu)中的成員變量之外,其他函數(shù)都是采用所有塊設(shè)備通用的操作函數(shù)(def_blk_fops)塊設(shè)備的缺省操作塊設(shè)備的缺省操作def_blk_fops13nfs/block
11、_dev.cstruct def_blk_fops = open:blkdev_open,release:blkdev_close,llseek:block_llseek,read:generic_,write:generic_,mmap:generic_,fsync:block_fsync,ioctl:blkdev_ioctl,;塊設(shè)備的缺省操作塊設(shè)備的缺省操作def_blk_fops14nblock_read與block_write等函數(shù)是設(shè)備相關(guān)的n塊設(shè)備注冊(cè)時(shí)一個(gè)重要的任務(wù)就是提供這個(gè)設(shè)備相關(guān)的操作函數(shù)給內(nèi)核15devfs注冊(cè)與管理注冊(cè)與管理nfs/devfs/base.c nregi
12、ster_chrdev()停止使用,改為devfs_register_chrdev()nregister_blkdev()停止使用,改為devfs_register_blkdev()nint devfs_register_chrdev (unsigned int major, const char *name, struct *fops)nint devfs_register_blkdev (unsigned int major, const char *name, struct block_device_operations *bdops)nint devfs_unregister_chrd
13、ev (unsigned int major, const char *name)nint devfs_unregister_blkdev (unsigned int major, const char *name)16塊設(shè)備的請(qǐng)求隊(duì)列塊設(shè)備的請(qǐng)求隊(duì)列n當(dāng)系統(tǒng)對(duì)塊設(shè)備進(jìn)行讀操作時(shí),僅僅是通過塊設(shè)備通用的讀操作函數(shù)block_read( ),將這一個(gè)請(qǐng)求發(fā)送給對(duì)應(yīng)的設(shè)備,并保存在該設(shè)備的操作請(qǐng)求隊(duì)列(request queue)中。然后調(diào)用這個(gè)塊設(shè)備的底層處理函數(shù),對(duì)請(qǐng)求隊(duì)列中的操作請(qǐng)求進(jìn)行逐一的執(zhí)行struct blk_dev_struct /*include/linux/blkdev.h*/
14、 request_queue_t request_queue; queue_proc *queue; void *data;struct blk_dev_struct blk_devMAX_BLKDEV; 17block_read()流程流程block_read( )ll_rw_block( )submit_bh ( )generic_make_request ( )_make_request ( )add_request ( ),給請(qǐng)求隊(duì)列添加新的請(qǐng)求18Linux網(wǎng)絡(luò)協(xié)議棧網(wǎng)絡(luò)協(xié)議棧應(yīng)用系統(tǒng)內(nèi)核硬件設(shè)備應(yīng)用層BSD Socket層INET Socket層IP層硬件層TCPUDP網(wǎng)絡(luò)設(shè)備接口
15、19重要的數(shù)據(jù)結(jié)構(gòu)重要的數(shù)據(jù)結(jié)構(gòu)n以socket文件描述符作為參數(shù),系統(tǒng)調(diào)用從用戶空間切換到內(nèi)核空間,從而進(jìn)入到BSD Socket層的操作。操作的對(duì)象是socket結(jié)構(gòu),每一個(gè)這樣的結(jié)構(gòu)對(duì)應(yīng)的是一個(gè)網(wǎng)絡(luò)連接 n通過網(wǎng)絡(luò)地址族的不同來判斷是否應(yīng)該進(jìn)入到INET Socket層;這一層的數(shù)據(jù)存放在msghdr結(jié)構(gòu)的變量中n在INET Socket層中,分成面向連接和面向無連接兩種類型,區(qū)分TCP和UDP協(xié)議。在這一層中的操作對(duì)象是sock類型的數(shù)據(jù),而數(shù)據(jù)存放在sk_buff結(jié)構(gòu)中20模塊機(jī)制(模塊機(jī)制(Module)nLinux的單塊結(jié)構(gòu)(monolithic)使得其可擴(kuò)展性較差n模塊機(jī)制(L
16、inux Kernel Module,LKM)提高了linux內(nèi)核的可擴(kuò)展性n利用linux源碼編譯生成內(nèi)核時(shí),如某功能允許“m”選項(xiàng)(其他為“y”, “ n”),說明可以以模塊形式存在n多數(shù)設(shè)備驅(qū)動(dòng)程序以模塊的方式掛接到內(nèi)核n系統(tǒng)啟動(dòng)時(shí)已將若干模塊掛入了內(nèi)核n用戶只要有權(quán)限,就可以編寫模塊掛入內(nèi)核n模塊的缺點(diǎn):增加了內(nèi)核管理代價(jià) 21模塊的設(shè)計(jì)模塊的設(shè)計(jì)nEvery LKM consists of two basic functions (minimum) :int init_module(void) /*used for all initialization stuff*/ . void
17、cleanup_module(void) /*used for a clean shutdown*/ . n安裝模塊命令 # insmod module.o #modprobe module.on卸載模塊命令 # rmmod module.on查詢系統(tǒng)中已裝入的模塊 #lsmod22模塊的設(shè)計(jì)模塊的設(shè)計(jì)n例子 hello.c#define MODULE#include int init_module(void) printk(Hello, worldn); return 0; void cleanup_module(void) printk(Goodbye cruel worldn); n編譯
18、模塊 # gcc c hello.c DMODULE D_KERNEL_ -DLINUX -Wall O2 -I/usr/src/linux-2.4/include n安裝、卸載模塊 # insmod hello.o Hello world # rmmod hello Goodbye cruel world23模塊設(shè)計(jì)注意事項(xiàng)模塊設(shè)計(jì)注意事項(xiàng)n模塊設(shè)計(jì)與應(yīng)用程序設(shè)計(jì)模塊是裝入內(nèi)核的,運(yùn)行時(shí)CPU處于核心態(tài) 應(yīng)用程序運(yùn)行時(shí)CPU處于用戶態(tài)n編譯模塊 設(shè)計(jì)應(yīng)用程序使用的include文件:/usr/include 設(shè)計(jì)內(nèi)核模塊使用的include文件:/usr/src/linux-2.4/include 兩者如果不一致,在編譯內(nèi)核模塊時(shí)要用-I指明include路徑n 設(shè)計(jì)的模塊可以調(diào)用Linux內(nèi)核及其他模塊已經(jīng)輸出(exported)的函數(shù),不能利用標(biāo)準(zhǔn)C提供的庫(kù)函數(shù)如printfn#more /proc/ksyms或 24模塊調(diào)試模塊調(diào)試printk利用/proc文件系統(tǒng)或ioctl;ksyms使用調(diào)試器gdbkdebug遠(yuǎn)程調(diào)試25/proc/下文件、目錄的意義
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 技術(shù)廚師面試題及答案
- 貴陽幼師面試題及答案
- 工會(huì)食堂費(fèi)用管理制度
- 華為編程考試題及答案
- 耳部整形的臨床護(hù)理
- 光伏電站維修合同范本
- T/CADBM 49-2021企業(yè)建筑門窗生產(chǎn)安裝能力評(píng)價(jià)標(biāo)準(zhǔn)
- 氣動(dòng)輔件購(gòu)買合同范本
- 教師簽訂廉潔從教協(xié)議書
- T/CADBM 41-2021建筑遮陽產(chǎn)品用電機(jī)
- 2024年法律職業(yè)資格考試(試卷一)客觀題試卷與參考答案
- 戶外空調(diào)外機(jī)清洗的安全協(xié)議書
- 企業(yè)員工崗前安全培訓(xùn)試題含答案【達(dá)標(biāo)題】
- DB42∕T 2234-2024 裝配型附著式升降腳手架安全技術(shù)規(guī)程
- GB/T 16649.2-2024識(shí)別卡集成電路卡第2部分:帶觸點(diǎn)的卡觸點(diǎn)的尺寸和位置
- 2024年生態(tài)環(huán)境執(zhí)法大練兵比武競(jìng)賽理論考試題庫(kù)-下(多選、判斷題)
- 廣告物料、標(biāo)識(shí)牌、宣傳品投標(biāo)方案
- SAP-TM運(yùn)輸管理模塊操作手冊(cè)(S4系統(tǒng))
- 輸變電工程施工質(zhì)量驗(yàn)收統(tǒng)一表式附件1:線路工程填寫示例
- 淺談古詩(shī)詞教學(xué)與語文核心素養(yǎng)的融合
- 斷親協(xié)議書模板
評(píng)論
0/150
提交評(píng)論