版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、1Linux Device & Module設(shè)備管理與模塊機制設(shè)備管理與模塊機制n基本概念n傳統(tǒng)方式的設(shè)備注冊與管理ndevfs注冊與管理n塊設(shè)備的請求隊列n網(wǎng)絡(luò)設(shè)備n模塊機制2Linux Device & Module基本概念基本概念n字符設(shè)備、塊設(shè)備、網(wǎng)絡(luò)設(shè)備 字符設(shè)備以字節(jié)為單位進行數(shù)據(jù)處理,通常只允許按順序訪問 塊設(shè)備將數(shù)據(jù)按可尋址的塊為單位進行處理,可以隨機訪問,利用緩沖技術(shù)網(wǎng)絡(luò)設(shè)備是一類特殊的設(shè)備,每塊網(wǎng)卡有名字但沒有設(shè)備文件與之對應(yīng) 查看系統(tǒng)中的設(shè)備:/proc/devicesn主設(shè)備號和次設(shè)備號 major number:相同的設(shè)備使用相同的驅(qū)動程序 minor number:
2、用來區(qū)分具體設(shè)備的實例 查看設(shè)備及其類型“l(fā)s -l /dev”n設(shè)備文件系統(tǒng)devfs /dev目錄過于龐大,很多設(shè)備文件沒有對應(yīng)系統(tǒng)中的設(shè)備 devfs根據(jù)系統(tǒng)中的實際設(shè)備構(gòu)建設(shè)備文件,并按目錄存放,如/dev/disk,/dev/pts3Linux Device & Module基本概念基本概念用戶空間內(nèi)核空間I/O請求設(shè)備驅(qū)動程序設(shè) 備ISR系統(tǒng)調(diào)用ret_from_sys_call返回,進程繼續(xù)4Linux Device & Module基本概念基本概念用 戶 程 序 調(diào) 用Fd=fopen(“/dev/hda”,O_RDWR,0);read(buff,fd,size)write(f
3、d,buff,size)close(fd)Virtual file systemGeneric_file_read()Generic_file_write()塊 設(shè) 備 文 件建立設(shè)備:#mknod /dev/dev_name type major_number minor_number 5Linux Device & ModuleVFSVFS中的文件中的文件ninclude/linux/fs.hstruct file struct file_operations *f_op;struct file_operations loff_t (*llseek)(struct file *,loff_
4、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) (struct inode *,struct file *,unsigned int,unsigned long); int(*mmap) (struct file *,struct vm_area_struct *); int(*open) (struct inode *,struct file *); int(*rele
5、ase) (struct inode *,struct file *); int(*fsync) (struct file *,struct dentry *,int datasync); int(*fasync) (int,struct file *,int); ;6Linux Device & Module(1) llseek(file, offset, whence):修改文件的讀寫指針。(2) read(file, buf, count, offset):從設(shè)備文件的offset 處開始讀出count個字節(jié),然后增加*offset的值。(3) write(file, buf, coun
6、t, offset):從設(shè)備文件的offset處寫入count個字節(jié),然后增加*offset的值。(4) ioctl(inode, file, cmd, arg):向一個硬件設(shè)備發(fā)命令,對設(shè)備進行控制。(5) mmap(file, vma):將設(shè)備空間映射到進程地址空間。(6) open(inode, file):打開并初始化設(shè)備。(7) release(inode, file):關(guān)閉設(shè)備并釋放資源。(8) fsync(file, dentry):實現(xiàn)內(nèi)存與設(shè)備之間的同步通信。(9) fasync(file, on):實現(xiàn)內(nèi)存與設(shè)備之間的異步通信。7Linux Device & Modulen
7、fs/devices.cstruct device_struct const char * name; struct file_operations * fops;static struct device_struct chrdevsMAX_CHRDEV; 注冊與注銷函數(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è)備的主設(shè)備
8、號,注冊后就是訪問數(shù)組chrdevs的索引(下標(biāo))。字符設(shè)備的注冊與管理字符設(shè)備的注冊與管理8Linux Device & ModulePCIPCI設(shè)備(驅(qū)動實現(xiàn)見設(shè)備(驅(qū)動實現(xiàn)見wordword文檔)文檔)Linux內(nèi)核啟動時會對所有內(nèi)核啟動時會對所有PCI設(shè)備進行掃描、登錄和分配資源等初始化設(shè)備進行掃描、登錄和分配資源等初始化操作,建立起系統(tǒng)中所有操作,建立起系統(tǒng)中所有PCI設(shè)備的拓撲結(jié)構(gòu)設(shè)備的拓撲結(jié)構(gòu)此后當(dāng)內(nèi)核欲初始化某設(shè)備時,調(diào)用此后當(dāng)內(nèi)核欲初始化某設(shè)備時,調(diào)用module_initmodule_init加載該設(shè)備的驅(qū)動程加載該設(shè)備的驅(qū)動程序序9Linux Device & Modul
9、e塊設(shè)備塊設(shè)備nfs/block_dev.cstatic struct const char *name; struct block_device_operations *bdops; blkdevsMAX_BLKDEV; 10Linux Device & Module塊設(shè)備注冊塊設(shè)備注冊nfs/block_register_blkdev(unsigned int major,const char *name, struct block_device_operations *bdops)nint unregister_blkdev(unsigned int major, const char
10、* name)11Linux Device & Module塊設(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 (*re
11、validate) (kdev_t);struct module *owner;12Linux Device & Modulenblock_device_operations并不能完全提供file_operations結(jié)構(gòu)中的所必需的主要函數(shù)(例如read、write),所以內(nèi)核實際上是采用def_blk_fops變量對相關(guān)的file_operations變量進行了賦值: struct file_operations def_blk_fops ; n除了open、release等函數(shù)利用了設(shè)備注冊時提供的block_device_operations結(jié)構(gòu)中的成員變量之外,其他函數(shù)都是采用所有塊
12、設(shè)備通用的操作函數(shù)(def_blk_fops)塊設(shè)備的缺省操作塊設(shè)備的缺省操作def_blk_fops13Linux Device & Modulenfs/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,ioctl:blkdev_ioctl,;塊設(shè)備的缺省
13、操作塊設(shè)備的缺省操作def_blk_fops14Linux Device & Modulenblock_read與block_write等函數(shù)是設(shè)備相關(guān)的n塊設(shè)備注冊時一個重要的任務(wù)就是提供這個設(shè)備相關(guān)的操作函數(shù)給內(nèi)核15Linux Device & Moduledevfs注冊與管理注冊與管理nfs/devfs/base.c nregister_chrdev()停止使用,改為devfs_register_chrdev()nregister_blkdev()停止使用,改為devfs_register_blkdev()nint devfs_register_chrdev (unsigned int
14、 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 int major, const char *name)16Linux
15、 Device & Module塊設(shè)備的請求隊列塊設(shè)備的請求隊列n當(dāng)系統(tǒng)對塊設(shè)備進行讀操作時,僅僅是通過塊設(shè)備通用的讀操作函數(shù)block_read( ),將這一個請求發(fā)送給對應(yīng)的設(shè)備,并保存在該設(shè)備的操作請求隊列(request queue)中。然后調(diào)用這個塊設(shè)備的底層處理函數(shù),對請求隊列中的操作請求進行逐一的執(zhí)行struct blk_dev_struct /*include/linux/blkdev.h*/ request_queue_t request_queue; queue_proc *queue; void *data;struct blk_dev_struct blk_devMAX
16、_BLKDEV; 17Linux Device & Moduleblock_read()流程流程block_read( )ll_rw_block( )submit_bh ( )generic_make_request ( )_make_request ( )add_request ( ),給請求隊列添加新的請求18Linux Device & ModuleLinux網(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è)備接口19Linux Device & Module重要的數(shù)據(jù)結(jié)構(gòu)重要的數(shù)據(jù)結(jié)構(gòu)n以socket文件描述符作為
17、參數(shù),系統(tǒng)調(diào)用從用戶空間切換到內(nèi)核空間,從而進入到BSD Socket層的操作。操作的對象是socket結(jié)構(gòu),每一個這樣的結(jié)構(gòu)對應(yīng)的是一個網(wǎng)絡(luò)連接 n通過網(wǎng)絡(luò)地址族的不同來判斷是否應(yīng)該進入到INET Socket層;這一層的數(shù)據(jù)存放在msghdr結(jié)構(gòu)的變量中n在INET Socket層中,分成面向連接和面向無連接兩種類型,區(qū)分TCP和UDP協(xié)議。在這一層中的操作對象是sock類型的數(shù)據(jù),而數(shù)據(jù)存放在sk_buff結(jié)構(gòu)中20Linux Device & Module模塊機制(模塊機制(Module)nLinux的單塊結(jié)構(gòu)(monolithic)使得其可擴展性較差n模塊機制(Linux Kerne
18、l Module,LKM)提高了linux內(nèi)核的可擴展性n利用linux源碼編譯生成內(nèi)核時,如某功能允許“m”選項(其他為“y”, “ n”),說明可以以模塊形式存在n多數(shù)設(shè)備驅(qū)動程序以模塊的方式掛接到內(nèi)核n系統(tǒng)啟動時已將若干模塊掛入了內(nèi)核n用戶只要有權(quán)限,就可以編寫模塊掛入內(nèi)核n模塊的缺點:增加了內(nèi)核管理代價 21Linux Device & Module模塊的設(shè)計模塊的設(shè)計nEvery LKM consists of two basic functions (minimum) :int init_module(void) /*used for all initialization stuf
19、f*/ . void cleanup_module(void) /*used for a clean shutdown*/ . n安裝模塊命令 # insmod module.o #modprobe module.on卸載模塊命令 # rmmod module.on查詢系統(tǒng)中已裝入的模塊 #lsmod22Linux Device & Module模塊的設(shè)計模塊的設(shè)計n例子 hello.c#define MODULE#include int init_module(void) 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 world23Linux Device & Module模塊設(shè)計注意事項模塊設(shè)計注意事項n模塊設(shè)計與應(yīng)用程序設(shè)計模塊是
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工作心得體會格式
- 2025機械試用買賣合同書參考式樣
- 2025贊助合同常用版范本
- 2025補償貿(mào)易購銷合同書范本
- 二零二五年度農(nóng)村房屋買賣合同協(xié)議書(含農(nóng)村土地整治工程)
- 二零二五年度高效養(yǎng)雞場飼養(yǎng)員技能提升合同3篇
- 二零二五年度二零二五年度商標(biāo)轉(zhuǎn)讓與全球市場布局合同3篇
- 2025知識產(chǎn)權(quán)共享合同范本
- 2025年度子女對父母贍養(yǎng)及家庭財產(chǎn)管理協(xié)議3篇
- 2025年度公司汽車銷售業(yè)務(wù)員銷售目標(biāo)責(zé)任合同2篇
- 2024信息技術(shù)應(yīng)用創(chuàng)新信息系統(tǒng)適配改造成本度量
- 廣東省廣州市2025屆高三上學(xué)期12月調(diào)研測試(零模)英語 含解析
- 陜西測繪地理信息局所屬事業(yè)單位2025年上半年招聘87人和重點基礎(chǔ)提升(共500題)附帶答案詳解
- 保險學(xué)期末試題及答案
- 高一數(shù)學(xué)上學(xué)期期末模擬試卷01-【中職專用】2024-2025學(xué)年高一數(shù)學(xué)上學(xué)期(高教版2023基礎(chǔ)模塊)(解析版)
- 嚴重精神障礙患者隨訪服務(wù)記錄表
- 2024-2025學(xué)年人教版八年級上冊地理期末測試卷(一)(含答案)
- 統(tǒng)編版(2024新版)七年級上冊道德與法治第四單元綜合測試卷(含答案)
- 滬教版英語小學(xué)六年級上學(xué)期期末試題與參考答案(2024-2025學(xué)年)
- 北京市海淀區(qū)2023-2024學(xué)年四年級上學(xué)期語文期末試卷
- 混凝土企業(yè)安全培訓(xùn)
評論
0/150
提交評論