设备管理与模块机制
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
建立设备: #mknod /dev/dev_name type major_number minor_number
VFS中的文件
• include/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 *,char
*,size_t,loff_t *); ssize_t (*write)(struct file *,const char
*,size_t,loff_t *);
PCI设备(驱动实现见word文档)
✓Linux内核启动时会对所有PCI设备进行扫描、登录和分配资源等初始化 操作,建立起系统中所有PCI设备的拓扑结构 ✓此后当内核欲初始化某设备时,调用module_init加载该设备的驱动程 序
块设备
• fs/block_dev.c
static struct { const char *name; struct block_device_operations *bdops;
(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, file, cmd, arg):向一个硬件设备发命令,对设备进行控制。 (5) mmap(file, vma):将设备空间映射到进程地址空间。 (6) open(inode, file):打开并初始化设备。 (7) release(inode, file):关闭设备并释放资源。 (8) fsync(file, dentry):实现内存与设备之间的同步通信。 (9) fasync(file, on):实现内存与设备之间的异步通信。
Fd=fopen(“/dev/hda”,O_RDW R,0); read(buff,fd,size) write(fd,buff,size) close(fd)
Virtual file system
G en eric_ file_ read ()
G en eric_ file_ w rite()
块设备文件
struct file_operations def_blk_fops ;
• 除了open、release等函数利用了设备注册时提供 的block_device_operations{}结构中的成员变量之 外,其他函数都是采用所有块设备通用的操作函 数(def_blk_fops{})
查看系统中的设备:/proc/devices
• 主设备号和次设wenku.baidu.com号
major number:相同的设备使用相同的驱动程序 minor number:用来区分具体设备的实例
基本概念
I/O请求
用户空间
返回,进程继续
设备驱动程序 设备
ISR
内核空间
ret_from_sys_call 系统调用
基本概念
用户程序调用
} blkdevs[MAX_BLKDEV];
块设备注册
• fs/block_dev.c
• register_blkdev(unsigned int major,const char *name, struct block_device_operations *bdops)
• int unregister_blkdev(unsigned int major, const char * name)
设备管理与模块机制
• 基本概念 • 传统方式的设备注册与管理 • devfs注册与管理 • 块设备的请求队列 • 网络设备 • 模块机制
基本概念
• 字符设备、块设备、网络设备
字符设备以字节为单位进行数据处理,通常只 允许按顺序访问
块设备将数据按可寻址的块为单位进行处理, 可以随机访问,利用缓冲技术 网络设备是一类特殊的设备,每块网卡有名字 但没有设备文件与之对应
字符设备的注册与管理
fs/devices.c struct device_struct {
const char * name; struct file_operations * fops; }; static struct device_struct chrdevs[MAX_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 的索引(下标)。
unsigned long); int (*check_media_change) (kdev_t); int (*revalidate) (kdev_t); struct module *owner;
};
块设备的缺省操作def_blk_fops
• block_device_operations{}并不能完全提供 file_operations结构中的所必需的主要函数(例如 read、write),所以内核实际上是采用 def_blk_fops变量对相关的file_operations{}变量进 行了赋值:
块设备的操作block_device_operations
struct block_device_operations { int (*open) (struct inode *, struct file *); int (*release) (struct inode *, struct file *); int (*ioctl) (struct inode *, struct file *, unsigned,
VFS中的文件
• include/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 *,char
*,size_t,loff_t *); ssize_t (*write)(struct file *,const char
*,size_t,loff_t *);
PCI设备(驱动实现见word文档)
✓Linux内核启动时会对所有PCI设备进行扫描、登录和分配资源等初始化 操作,建立起系统中所有PCI设备的拓扑结构 ✓此后当内核欲初始化某设备时,调用module_init加载该设备的驱动程 序
块设备
• fs/block_dev.c
static struct { const char *name; struct block_device_operations *bdops;
(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, file, cmd, arg):向一个硬件设备发命令,对设备进行控制。 (5) mmap(file, vma):将设备空间映射到进程地址空间。 (6) open(inode, file):打开并初始化设备。 (7) release(inode, file):关闭设备并释放资源。 (8) fsync(file, dentry):实现内存与设备之间的同步通信。 (9) fasync(file, on):实现内存与设备之间的异步通信。
Fd=fopen(“/dev/hda”,O_RDW R,0); read(buff,fd,size) write(fd,buff,size) close(fd)
Virtual file system
G en eric_ file_ read ()
G en eric_ file_ w rite()
块设备文件
struct file_operations def_blk_fops ;
• 除了open、release等函数利用了设备注册时提供 的block_device_operations{}结构中的成员变量之 外,其他函数都是采用所有块设备通用的操作函 数(def_blk_fops{})
查看系统中的设备:/proc/devices
• 主设备号和次设wenku.baidu.com号
major number:相同的设备使用相同的驱动程序 minor number:用来区分具体设备的实例
基本概念
I/O请求
用户空间
返回,进程继续
设备驱动程序 设备
ISR
内核空间
ret_from_sys_call 系统调用
基本概念
用户程序调用
} blkdevs[MAX_BLKDEV];
块设备注册
• fs/block_dev.c
• register_blkdev(unsigned int major,const char *name, struct block_device_operations *bdops)
• int unregister_blkdev(unsigned int major, const char * name)
设备管理与模块机制
• 基本概念 • 传统方式的设备注册与管理 • devfs注册与管理 • 块设备的请求队列 • 网络设备 • 模块机制
基本概念
• 字符设备、块设备、网络设备
字符设备以字节为单位进行数据处理,通常只 允许按顺序访问
块设备将数据按可寻址的块为单位进行处理, 可以随机访问,利用缓冲技术 网络设备是一类特殊的设备,每块网卡有名字 但没有设备文件与之对应
字符设备的注册与管理
fs/devices.c struct device_struct {
const char * name; struct file_operations * fops; }; static struct device_struct chrdevs[MAX_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 的索引(下标)。
unsigned long); int (*check_media_change) (kdev_t); int (*revalidate) (kdev_t); struct module *owner;
};
块设备的缺省操作def_blk_fops
• block_device_operations{}并不能完全提供 file_operations结构中的所必需的主要函数(例如 read、write),所以内核实际上是采用 def_blk_fops变量对相关的file_operations{}变量进 行了赋值:
块设备的操作block_device_operations
struct block_device_operations { int (*open) (struct inode *, struct file *); int (*release) (struct inode *, struct file *); int (*ioctl) (struct inode *, struct file *, unsigned,