HUST OS 8.0 设备管理【自学笔记】

第八章 设备管理

8.1 设备管理概念

8.2 Spooling系统

8.3 Linux模块机制,Linux驱动程序,Windows驱动程序

8.1 设备管理概念

1.按照交互对象分类
2.按交互方向分类
3.按外设特性分类

  • 设备管理的主要功能

1.设备分配功能;

2.设备映射:将逻辑设备映射到物理设备
1)物理设备:I/O系统中实际安装的设备,ID或字符串
2)逻辑设备:应用软件使用的设备,友好名

设备独立性:物理设备对用户透明;
用户编程时使用设备的逻辑名,由系统实现转化的功能;

3.设备驱动;实现I/O操作;
接受应用的服务请求,转换为具体的I/O指令,由控制设备完成相关操作

向用户提供统一接口:read/write/open…
把外设作为特别文件处理

设备驱动程序的特点:
与硬件密切相关;
每个设备配置特定的驱动程序
由厂商编写
操作系统对设备的接口提出要求

8.2 Spooling系统

设备分配方法:
独占设备的分配 共享设备的分配 虚拟设备的分配

  • 独占型设备包括所有的字符型设备:

  • 共享型设备包括所有块型设备:
    宏观上,一个共享性设备被多个用户使用;
    微观上,可以被多个设备使用;
    共享性设备不需要申请,不存在设备被占用的情况.

  • 虚拟技术:在一类物理设备上模拟另一类物理设备的技术
    借出辅存部分区域模拟独占设备,将独占设备转化为共享设备;

虚拟设备;
1.用来模拟独占设备的部分辅存称为虚拟设备,虚拟独占设备;
2.输入井:模拟输入设备的区域;
3.输出井:模拟输出设备的区域;

  • 虚拟分配:
    当进程需要与独占设备交换信息时,就采用虚拟技术将与该独占设备所对用的虚拟设备(部分辅存)分配给他;

  • SPOOLing系统是虚拟技术和虚拟分配的实现

Simultaneaus Periphernal Operations Online

外部设备同时联机操作[假脱机输入/输出操作]

  • Spooling的结构:
    输入井和输出井:磁盘上开辟的两个存储区域
    输入缓冲区和输出缓冲区:内存中开辟的存储区域
    输入监控进程和输出监控进程

8.3 Linux模块机制,Linux驱动程序,Windows驱动程序

8.3.1 Linux模块机制
  • Linux内核模块:
    Loadable Kernel Module:LKM
    解决单体内核机制的不足;

一种未经链接的可执行代码
经过装载(链接)成为内核的一部分
可以动态加载或卸载

编译模块:gcc -o hellomodule.ko D_KERNEL -DMODULE hello.c
安装模块:sudo insmod hellomodule.ko
删除模块:sudo rmmod module
查看内核信息:dmesg
查看模块:lsmod

8.3.2 Linux驱动程序(LDD)

Linux的两种运转模式:用户态,内核态;

  • Linux设备的分类:
    1.字符设备:
    以字节为单位逐个进行I/O操作
    eg:串口设备

2.块设备:
块设备的存取是通过buffer cache来进行
可以进行随机访问
例如IDE硬盘设备
支持可安装文件系统

3.网络设备
通过BSD套接口访问:(SOCKET)

  • 设备文件
    硬件设备作为文件看待:设备文件
    用文件接口来完成设备的操作:打开|关闭|读写|I/O控制等

ls -l dev 列出设备文件
c 字符设备 b块设备

主设备号和次设备号

主设备号:标识该设备种类,标识驱动程序
次设备号:标识同一设备驱动程序的不同硬件设备(只在驱动程序内部使用)

MOD_INC_USE_COUNT(增加模块的引用计数)
MOD_DEC_USE_COUNT(减少模块的引用计数)

module_init(my_init)向Linux系统记录设备初始化的函数名称

module_exit(my_exit)向Linux系统记录设备退出的函数名称

可以写个Makefile文件来指导编译的过程

8.3.3 Windows的驱动程序

Windows固定采用DriverEntry作为入口函数;
给pDiverObject->DriverUnload赋值退出函数指针

创建设备对象并命名—

IoCreateDevice()第3个参数是设备名
内核可以通过设备名访问\Device\目录下面的设备.
应用程序对\Device\目录没有访问权
-创建符号链接让应用程序访问\Device\中的设备

在内核??目录中创建符号链接指向\Device\中的设备

创建符号链接的函数:IoCreateSymbolicLink()

你可能感兴趣的:(OS)