設(shè)備管理與模塊機(jī)制_第1頁(yè)
設(shè)備管理與模塊機(jī)制_第2頁(yè)
設(shè)備管理與模塊機(jī)制_第3頁(yè)
設(shè)備管理與模塊機(jī)制_第4頁(yè)
設(shè)備管理與模塊機(jī)制_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(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ī)制Linux Device & Module2基本概念基本概念n字符設(shè)備、塊設(shè)備、網(wǎng)絡(luò)設(shè)備 字符設(shè)備以字節(jié)為單位進(jìn)行數(shù)據(jù)處理,通常只允許按順序訪問(wèn) 塊設(shè)備將數(shù)據(jù)按可尋址的塊為單位進(jìn)行處理,可以隨機(jī)訪問(wèn),利用緩沖技術(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:用來(lái)區(qū)分具體設(shè)備的實(shí)例 查看設(shè)備及

2、其類型“l(fā)s -l /dev”n設(shè)備文件系統(tǒng)devfs /dev目錄過(guò)于龐大,很多設(shè)備文件沒有對(duì)應(yīng)系統(tǒng)中的設(shè)備 devfs根據(jù)系統(tǒng)中的實(shí)際設(shè)備構(gòu)建設(shè)備文件,并按目錄存放,如/dev/disk,/dev/ptsLinux Device & Module3基本概念基本概念用戶空間內(nèi)核空間I/O請(qǐng)求設(shè)備驅(qū)動(dòng)程序設(shè) 備ISR系統(tǒng)調(diào)用ret_from_sys_call返回,進(jìn)程繼續(xù)Linux Device & Module4基本概念基本概念用 戶 程 序 調(diào) 用Fd=fopen(“/dev/hda”,O_RDWR,0);read(buff,fd,size)write(fd,buff,si

3、ze)close(fd)Virtual file systemGeneric_file_read()Generic_file_write()塊 設(shè) 備 文 件建立設(shè)備:#mknod /dev/dev_name type major_number minor_number Linux Device & Module5VFSVFS中的文件中的文件ninclude/linux/fs.hstruct file struct file_operations *f_op;struct file_operations loff_t (*llseek)(struct file *,loff_t,int

4、); ssize_t (*read)(struct file *,char *,size_t,loff_t *); ssize_t (*write)(struct file *,const char *,size_t,loff_t *); int(*ioctl) (struct inode *,struct file *,unsigned int,unsigned long); int(*mmap) (struct file *,struct vm_area_struct *); int(*open) (struct inode *,struct file *); int(*release)

5、(struct inode *,struct file *); int(*fsync) (struct file *,struct dentry *,int datasync); int(*fasync) (int,struct file *,int); ;Linux Device & Module6(1) llseek(file, offset, whence):修改文件的讀寫指針。(2) read(file, buf, count, offset):從設(shè)備文件的offset 處開始讀出count個(gè)字節(jié),然后增加*offset的值。(3) write(file, buf, count

6、, 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):打開并初始化設(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è)備之間的異步通信。Linux Device & Modul

7、e7nfs/devices.cstruct device_struct const char * name; struct file_operations * fops;static struct device_struct chrdevsMAX_CHRDEV; 注冊(cè)與注銷函數(shù):int register_chrdev(unsigned int major, const char * name, struct file_operations *fops)int unregister_chrdev(unsigned int major, const char * name);注:major即設(shè)備的

8、主設(shè)備號(hào),注冊(cè)后就是訪問(wèn)數(shù)組chrdevs的索引(下標(biāo))。字符設(shè)備的注冊(cè)與管理字符設(shè)備的注冊(cè)與管理Linux Device & Module8PCIPCI設(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è)備時(shí),調(diào)用module_initmodule_init加載該設(shè)備的驅(qū)動(dòng)程加載該設(shè)備的驅(qū)動(dòng)程序序Linux Device &

9、amp; Module9塊設(shè)備塊設(shè)備nfs/block_dev.cstatic struct const char *name; struct block_device_operations *bdops; blkdevsMAX_BLKDEV; Linux Device & Module10塊設(shè)備注冊(cè)塊設(shè)備注冊(cè)nfs/block_register_blkdev(unsigned int major,const char *name, struct block_device_operations *bdops)nint unregister_blkdev(unsigned int maj

10、or, const char * name)Linux Device & Module11塊設(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

11、) (kdev_t);int (*revalidate) (kdev_t);struct module *owner;Linux Device & Module12nblock_device_operations并不能完全提供file_operations結(jié)構(gòu)中的所必需的主要函數(shù)(例如read、write),所以內(nèi)核實(shí)際上是采用def_blk_fops變量對(duì)相關(guān)的file_operations變量進(jìn)行了賦值: struct file_operations def_blk_fops ; n除了open、release等函數(shù)利用了設(shè)備注冊(cè)時(shí)提供的block_device_operation

12、s結(jié)構(gòu)中的成員變量之外,其他函數(shù)都是采用所有塊設(shè)備通用的操作函數(shù)(def_blk_fops)塊設(shè)備的缺省操作塊設(shè)備的缺省操作def_blk_fopsLinux Device & Module13nfs/block_dev.cstruct file_operations def_blk_fops = open:blkdev_open,release:blkdev_close,llseek:block_llseek,read:generic_file_read,write:generic_file_write,mmap:generic_file_mmap,fsync:block_fsync

13、,ioctl:blkdev_ioctl,;塊設(shè)備的缺省操作塊設(shè)備的缺省操作def_blk_fopsLinux Device & Module14nblock_read與block_write等函數(shù)是設(shè)備相關(guān)的n塊設(shè)備注冊(cè)時(shí)一個(gè)重要的任務(wù)就是提供這個(gè)設(shè)備相關(guān)的操作函數(shù)給內(nèi)核Linux Device & Module15devfs注冊(cè)與管理注冊(cè)與管理nfs/devfs/base.c nregister_chrdev()停止使用,改為devfs_register_chrdev()nregister_blkdev()停止使用,改為devfs_register_blkdev()nint

14、devfs_register_chrdev (unsigned int major, const char *name, struct file_operations *fops)nint devfs_register_blkdev (unsigned int major, const char *name, struct block_device_operations *bdops)nint devfs_unregister_chrdev (unsigned int major, const char *name)nint devfs_unregister_blkdev (unsigned

15、int major, const char *name)Linux Device & Module16塊設(shè)備的請(qǐng)求隊(duì)列塊設(shè)備的請(qǐng)求隊(duì)列n當(dāng)系統(tǒng)對(duì)塊設(shè)備進(jìn)行讀操作時(shí),僅僅是通過(guò)塊設(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*/ request_queue_t request_queue; queue_proc *queue; void

16、 *data;struct blk_dev_struct blk_devMAX_BLKDEV; Linux Device & Module17block_read()流程流程block_read( )ll_rw_block( )submit_bh ( )generic_make_request ( )_make_request ( )add_request ( ),給請(qǐng)求隊(duì)列添加新的請(qǐng)求Linux Device & Module18Linux網(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è)備接口Linux

17、 Device & Module19重要的數(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通過(guò)網(wǎng)絡(luò)地址族的不同來(lái)判斷是否應(yīng)該進(jìn)入到INET Socket層;這一層的數(shù)據(jù)存放在msghdr結(jié)構(gòu)的變量中n在INET Socket層中,分成面向連接和面向無(wú)連接兩種類型,區(qū)分TCP和UDP協(xié)議。在這一層中的操作對(duì)象是sock類型的數(shù)據(jù),而數(shù)據(jù)存放在sk_buff結(jié)構(gòu)中Linux Device & Module20模塊機(jī)制(模塊機(jī)制(M

18、odule)nLinux的單塊結(jié)構(gòu)(monolithic)使得其可擴(kuò)展性較差n模塊機(jī)制(Linux Kernel Module,LKM)提高了linux內(nèi)核的可擴(kuò)展性n利用linux源碼編譯生成內(nèi)核時(shí),如某功能允許“m”選項(xiàng)(其他為“y”, “ n”),說(shuō)明可以以模塊形式存在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à) Linux Device & Module21模塊的設(shè)計(jì)模塊的設(shè)計(jì)nEvery LKM consists of two basic functions (minimum

19、) :int init_module(void) /*used for all initialization stuff*/ . void cleanup_module(void) /*used for a clean shutdown*/ . n安裝模塊命令 # insmod module.o #modprobe module.on卸載模塊命令 # rmmod module.on查詢系統(tǒng)中已裝入的模塊 #lsmodLinux Device & Module22模塊的設(shè)計(jì)模塊的設(shè)計(jì)n例子 hello.c#define MODULE#include int init_module(voi

20、d) printk(Hello, worldn); return 0; void cleanup_module(void) printk(Goodbye cruel worldn); n編譯模塊 # 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 worldLinux Device & Module23模塊設(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

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論