设备管理与模块机制ppt

上传人:ji****72 文档编号:51939132 上传时间:2018-08-17 格式:PPT 页数:26 大小:271KB
返回 下载 相关 举报
设备管理与模块机制ppt_第1页
第1页 / 共26页
设备管理与模块机制ppt_第2页
第2页 / 共26页
设备管理与模块机制ppt_第3页
第3页 / 共26页
设备管理与模块机制ppt_第4页
第4页 / 共26页
设备管理与模块机制ppt_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《设备管理与模块机制ppt》由会员分享,可在线阅读,更多相关《设备管理与模块机制ppt(26页珍藏版)》请在金锄头文库上搜索。

1、1设备管理与模块机制n基本概念n传统方式的设备注册与管理ndevfs注册与管理n块设备的请求队列n网络设备n模块机制2基本概念n字符设备、块设备、网络设备字符设备以字节为单位进行数据处理,通常只允许按顺序访问块设备将数据按可寻址的块为单位进行处理,可以随机访问,利用缓冲技术 网络设备是一类特殊的设备,每块网卡有名字但没有设备文件与之对应查看系统中的设备:/proc/devices n主设备号和次设备号major number:相同的设备使用相同的驱动程序minor number:用来区分具体设备的实例查看设备及其类型“ls -l /dev” n设备文件系统devfs/dev目录过于庞大,很多设

2、备文件没有对应系统中的设备devfs根据系统中的实际设备构建设备文件,并按目录存放,如/dev/disk, /dev/pts3基本概念4基本概念建立设备:#mknod /dev/dev_name type major_number minor_number 5VFS中的文件ninclude/linux/fs.h struct file struct file_operations *f_op; ; struct file_operations loff_t (*llseek)(struct file *,loff_t,int);ssize_t (*read)(struct file *,cha

3、r *,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) (struct inode *,struct file *);int(*fsync

4、) (struct file *,struct dentry *,int datasync);int(*fasync) (int,struct file *,int); ;6(1) llseek(file, offset, whence):修改文件的读写指针。(2) read(file, buf, count, offset):从设备文件的offset 处开始读出count个字 节,然后增加*offset的值。(3) write(file, buf, count, offset):从设备文件的offset处写入count个字节, 然后增加*offset的值。(4) ioctl(inode, f

5、ile, cmd, arg):向一个硬件设备发命令,对设备进行控制 。(5) mmap(file, vma):将设备空间映射到进程地址空间。(6) open(inode, file):打开并初始化设备。(7) release(inode, file):关闭设备并释放资源。(8) fsync(file, dentry):实现内存与设备之间的同步通信。(9) fasync(file, on):实现内存与设备之间的异步通信。7nfs/devices.c struct device_struct const char * name;struct file_operations * fops; ; st

6、atic struct device_struct chrdevsMAX_CHRDEV; 注册与注销函数: int register_chrdev(unsigned int major, const char * name, struct file_operations *fops) int unregister_chrdev(unsigned int major, const char * name); 注:major即设备的主设备号,注册后就是访问数组chrdevs 的索引(下标)。字符设备的注册与管理8PCI设备(驱动实现见word文档) Linux内核启动时会对所有PCI设备进行扫描、

7、登录和分配资源等初始化操作,建立起系统中所有PCI设备的拓扑结构 此后当内核欲初始化某设备时,调用module_init加载该设备的驱动程序9块设备nfs/block_dev.cstatic struct const char *name;struct block_device_operations *bdops; blkdevsMAX_BLKDEV; 10块设备注册nfs/block_register_blkdev(unsigned int major,const char *name,struct block_device_operations *bdops)nint unregister

8、_blkdev(unsigned int major,const char * name)11块设备的操作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) (kd

9、ev_t); int (*revalidate) (kdev_t); struct module *owner; ;12nblock_device_operations并不能完全提供 file_operations结构中的所必需的主要函数(例如 read、write),所以内核实际上是采用 def_blk_fops变量对相关的file_operations变量进 行了赋值:struct file_operations def_blk_fops ; n除了open、release等函数利用了设备注册时提供 的block_device_operations结构中的成员变量之 外,其他函数都是采用所

10、有块设备通用的操作函 数(def_blk_fops)块设备的缺省操作def_blk_fops13nfs/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, ;块设备的缺省操作def_blk_fops14nb

11、lock_read与block_write等函数是设备相关 的n块设备注册时一个重要的任务就是提供这 个设备相关的操作函数给内核15devfs注册与管理nfs/devfs/base.c nregister_chrdev()停止使用,改为devfs_register_chrdev()nregister_blkdev()停止使用,改为devfs_register_blkdev()nint devfs_register_chrdev (unsigned int major, const char *name, struct file_operations *fops)nint devfs_regis

12、ter_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)16块设备的请求队列n当系统对块设备进行读操作时,仅仅是通过块设备通用的 读操作函数block_read( ),将这一个请求发送给对应的设 备,并保存在该设

13、备的操作请求队列(request queue)中 。然后调用这个块设备的底层处理函数,对请求队列中的 操作请求进行逐一的执行 struct blk_dev_struct /*include/linux/blkdev.h*/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_

14、request ( )add_request ( ),给请求队列添加新的请求18Linux网络协议栈19重要的数据结构n以socket文件描述符作为参数,系统调用从用户空 间切换到内核空间,从而进入到BSD Socket层的 操作。操作的对象是socket结构,每一个这样的 结构对应的是一个网络连接 n通过网络地址族的不同来判断是否应该进入到 INET Socket层;这一层的数据存放在msghdr结 构的变量中n在INET Socket层中,分成面向连接和面向无连接 两种类型,区分TCP和UDP协议。在这一层中的 操作对象是sock类型的数据,而数据存放在 sk_buff结构中20模块机制(

15、Module)nLinux的单块结构(monolithic)使得其可扩展性 较差n模块机制(Linux Kernel Module,LKM)提高了 linux内核的可扩展性n利用linux源码编译生成内核时,如某功能允许 “m”选项(其他为“y”, “ n”),说明可以以模块 形式存在n多数设备驱动程序以模块的方式挂接到内核n系统启动时已将若干模块挂入了内核n用户只要有权限,就可以编写模块挂入内核n模块的缺点:增加了内核管理代价 21模块的设计nEvery LKM consists of two basic functions (minimum) : int init_module(void)

16、 /*used for all initialization stuff*/ . void cleanup_module(void) /*used for a clean shutdown*/ . n安装模块命令 # insmod module.o #modprobe module.on卸载模块命令 # rmmod module.on查询系统中已装入的模块#lsmod22模块的设计n例子 hello.c #define MODULE #include int init_module(void) printk(“Hello, worldn“); return 0; void cleanup_module(void) printk(“Goodbye cruel worldn“)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号