1.按照交互对象分类
2.按交互方向分类
3.按外设特性分类
1.设备分配功能;
2.设备映射:将逻辑设备映射到物理设备
1)物理设备:I/O系统中实际安装的设备,ID或字符串
2)逻辑设备:应用软件使用的设备,友好名
设备独立性:物理设备对用户透明;
用户编程时使用设备的逻辑名,由系统实现转化的功能;
3.设备驱动;实现I/O操作;
接受应用的服务请求,转换为具体的I/O指令,由控制设备完成相关操作
向用户提供统一接口:read/write/open…
把外设作为特别文件处理
设备驱动程序的特点:
与硬件密切相关;
每个设备配置特定的驱动程序
由厂商编写
操作系统对设备的接口提出要求
设备分配方法:
独占设备的分配 共享设备的分配 虚拟设备的分配
独占型设备包括所有的字符型设备:
共享型设备包括所有块型设备:
宏观上,一个共享性设备被多个用户使用;
微观上,可以被多个设备使用;
共享性设备不需要申请,不存在设备被占用的情况.
虚拟技术:在一类物理设备上模拟另一类物理设备的技术
借出辅存部分区域模拟独占设备,将独占设备转化为共享设备;
虚拟设备;
1.用来模拟独占设备的部分辅存称为虚拟设备,虚拟独占设备;
2.输入井:模拟输入设备的区域;
3.输出井:模拟输出设备的区域;
虚拟分配:
当进程需要与独占设备交换信息时,就采用虚拟技术将与该独占设备所对用的虚拟设备(部分辅存)分配给他;
SPOOLing系统是虚拟技术和虚拟分配的实现
Simultaneaus Periphernal Operations Online
外部设备同时联机操作[假脱机输入/输出操作]
一种未经链接的可执行代码
经过装载(链接)成为内核的一部分
可以动态加载或卸载
编译模块:gcc -o hellomodule.ko D_KERNEL -DMODULE hello.c
安装模块:sudo insmod hellomodule.ko
删除模块:sudo rmmod module
查看内核信息:dmesg
查看模块:lsmod
Linux的两种运转模式:用户态,内核态;
2.块设备:
块设备的存取是通过buffer cache来进行
可以进行随机访问
例如IDE硬盘设备
支持可安装文件系统
3.网络设备
通过BSD套接口访问:(SOCKET)
ls -l dev 列出设备文件
c 字符设备 b块设备
主设备号和次设备号
主设备号:标识该设备种类,标识驱动程序
次设备号:标识同一设备驱动程序的不同硬件设备(只在驱动程序内部使用)
MOD_INC_USE_COUNT(增加模块的引用计数)
MOD_DEC_USE_COUNT(减少模块的引用计数)
module_init(my_init)向Linux系统记录设备初始化的函数名称
module_exit(my_exit)向Linux系统记录设备退出的函数名称
可以写个Makefile文件来指导编译的过程
Windows固定采用DriverEntry作为入口函数;
给pDiverObject->DriverUnload赋值退出函数指针
创建设备对象并命名—
IoCreateDevice()第3个参数是设备名
内核可以通过设备名访问\Device\目录下面的设备.
应用程序对\Device\目录没有访问权
-创建符号链接让应用程序访问\Device\中的设备
在内核??目录中创建符号链接指向\Device\中的设备
创建符号链接的函数:IoCreateSymbolicLink()