Linux操作系统分析 中国科学技术大学计算机系 陈香兰(0512- )

Slides:



Advertisements
Similar presentations
7.1 内置对象概述及分类 JSP 视频教学课程. JSP2.2 目录 1. 内置对象简介 1. 内置对象简介 2. 内置对象分类 2. 内置对象分类 3. 内置对象按功能区分 3. 内置对象按功能区分 4. 内置对象作用范围 4. 内置对象作用范围.
Advertisements

阻塞操作. 在 linux 里,一个等待队列由一个 wait_queue_head_t 类型的结构来描述 等待队列的初始化: static wait_queue_head_t testqueue; init_waitqueue_head(&testqueue);
LSF系统介绍 张焕杰 中国科学技术大学网络信息中心
第三章 数据类型和数据操作 对海量数据进行有效的处理、存储和管理 3.1 数据类型 数据源 数据量 数据结构
实用操作系统概念 张惠娟 副教授 1.
项目四 组建跨地区网络 授课教师:肖颖.
Oracle数据库 Oracle 子程序.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
在PHP和MYSQL中实现完美的中文显示
计算机基础知识 丁家营镇九年制学校 徐中先.
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
嵌入式操作系统 陈香兰 Fall 2009.
Kvm异步缺页中断 浙江大学计算机体系结构实验室 徐浩.
LSF系统介绍 张焕杰 中国科学技术大学网络信息中心
中国科学技术大学计算机系 陈香兰(0512- ) spring 2011
Hadoop I/O By ShiChaojie.
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
存储系统.
把COM口设置到没有使用的 COM1 – COM4
中国科学技术大学计算机系 陈香兰 Fall2013 第九讲 设备管理 中国科学技术大学计算机系 陈香兰 Fall2013.
走进编程 程序的顺序结构(二).
网络常用常用命令 课件制作人:谢希仁.
SPI驱动 广州创龙电子科技有限公司 Guangzhou Tronlong Electronic Technology Co., Ltd.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
文件读写实践 广州创龙电子科技有限公司 01 广州创龙电子科技有限公司
第十章 IDL访问数据库 10.1 数据库与数据库访问 1、数据库 数据库中数据的组织由低到高分为四级:字段、记录、表、数据库四种。
本节内容 模拟线程切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
逆向工程-汇编语言
如何生成设备节点 广州创龙电子科技有限公司
CPU结构和功能.
中国科学技术大学计算机系 陈香兰(0551- ) Spring 2009
Windows 7 的系统设置.
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
SOA – Experiment 2: Query Classification Web Service
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
内容摘要 ■ 课程概述 ■ 教学安排 ■ 什么是操作系统? ■ 为什么学习操作系统? ■ 如何学习操作系统? ■ 操作系统实例
C语言程序设计 主讲教师:陆幼利.
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
微机系统的组成.
第四章 MCS-51定时器/计数器 一、定时器结构 1.定时器结构框图
K60入门课程 02 首都师范大学物理系 王甜.
VisComposer 2019/4/17.
实验四、TinyOS执行机制实验 一、实验目的 1、了解tinyos执行机制,实现程序异步处理的方法。
Cassandra应用及高性能客户端 董亚军 来自Newegg-NESC.
实验七 安全FTP服务器实验 2019/4/28.
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
本节内容 Win32 API中的宽字符 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
信号量(Semaphore).
iSIGHT 基本培训 使用 Excel的栅栏问题
第八章 总线技术 8.1 概述 8.2 局部总线 8.3 系统总线 8.4 通信总线.
本节内容 文件系统 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
Visual Basic程序设计 第13章 访问数据库
GIS基本功能 数据存储 与管理 数据采集 数据处理 与编辑 空间查询 空间查询 GIS能做什么? 与分析 叠加分析 缓冲区分析 网络分析
WSAAsyncSelect 模型 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang
主讲:陈香兰 助教:贾永泉、毛熠璐 (西区电三421) Autumn 2007
第六章 Excel的应用 五、EXCEL的数据库功能 1、Excel的数据库及其结构 2、Excel下的数据排序 (1)Excel的字段名行
基于列存储的RDF数据管理 朱敏
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
本节内容 如何调试驱动程序? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
本节内容 进程 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第四章 UNIX文件系统.
第十七讲 密码执行(1).
FVX1100介绍 法视特(上海)图像科技有限公司 施 俊.
实验六静态路由.
工业机器人入门使用教程 ESTUN机器人 主讲人:李老师
DSP技术与应用 电子与信息技术系.
Presentation transcript:

Linux操作系统分析 中国科学技术大学计算机系 陈香兰(0512-87161312) xlanchen@ustc.edu.cn 助教:裴建国、冯晓静 Autumn 2008

管理I/O设备 中国科学技术大学计算机系 陈香兰(0512-87161312) xlanchen@ustc.edu.cn 助教:裴建国、冯晓静 Autumn 2008

I/O体系结构 总线:PC的CPU、RAM、I/O设备之间需要某些数据通路来保证信息的流动 总类: ISA、 EISA、 VESA、PCI以及MCA等等 三种基本类型 数据总线(pentium,64位) 地址总线(pentium,32位) 控制总线 当总线用于CPU与I/O设备之间的连接时,成为I/O总线 2018/12/2 Linux OS Analysis

在x86处理器中,只使用了32位地址总线中的16位对I/O设备进行寻址 寻址范围? 使用64位数据总线中的8、16、32位传送数据 I/O设备与CPU之间的连接层次为: CPUI/O端口I/O接口设备控制器 2018/12/2 Linux OS Analysis

PC的I/O体系结构 2018/12/2 Linux OS Analysis

I/O端口(I/O port) 每个I/O端口8位,由于只使用16位地址总线访问,因此I/O地址空间一共提供65536个I/O端口 特定的指令用来访问I/O端口:in,ins,out,outs I/O端口的另外一种访问方法 直接映射到物理地址空间 可以使用存储器操作指令,如mov,and,or等等 2018/12/2 Linux OS Analysis

I/O端口中的寄存器 命令 状态 输入数据 输出数据 2018/12/2 Linux OS Analysis

Linux中访问I/O端口的操作 inb、inw、inl inb_p、inw_p、inl_p outb、outw、outl outb_p、outw_p、outl_p insb、insw、insl outsb、outsw、outsl 2018/12/2 Linux OS Analysis

I/O端口的分配 不同的设备使用各自不同的端口 内核使用资源信息来记录端口分配信息 一个资源表示I/O端口地址的一个范围 所有同种资源使用树形结构记录,ioport_resource。 一个较大范围可以进一步划分为子范围,使用兄弟链表表示 2018/12/2 Linux OS Analysis

相关的操作 2018/12/2 Linux OS Analysis

I/O接口 I/O接口是处于一组I/O端口和对应的设备控制器之间的一种硬件电路 专用I/O接口和通用I/O接口 连接到PIC上,代表设备发出中断请求 专用I/O接口和通用I/O接口 2018/12/2 Linux OS Analysis

专用I/O接口 专用于一个特定的硬件设备 键盘接口 图形接口 磁盘接口 总线鼠标接口 网络接口 2018/12/2 Linux OS Analysis

通用I/O接口 现代PC都包含连接很多外部设备的几个通用I/O接口 并口:传输单位1个字节 串口:逐位传送 USB口 PCMCIA接口 SCSI接口 2018/12/2 Linux OS Analysis

设备控制器 复杂的设备需要一个设备控制器(device controller)来驱动 作用 典型的设备控制器,例如磁盘控制器 对I/O接口接收到的高级命令进行解释,并控制设备执行特定的操作 对从设备接收到的电信号进行解释和转换,并修改状态寄存器 典型的设备控制器,例如磁盘控制器 2018/12/2 Linux OS Analysis

I/O共享存储器 很多硬件设备都有自己的存储器,通常称之为I/O共享存储器(I/O Shared Memory),如显存 根据设备和总线类型的不同,可以在三个不同的物理地址范围之间进行映射 对于连接到ISA总线上的大多数设备 0xa0000~0xfffff 对于使用VESA局部总线的一些老设备(图形卡) 0xe00000~0xffffff(现在基本不生产) 2018/12/2 Linux OS Analysis

关于图形加速端口AGP(Accelerated Graphics Port)标准 对于连接到PCI总线的设备 映射到RAM物理地址的顶端 关于图形加速端口AGP(Accelerated Graphics Port)标准 是高性能图形卡的PCI增强版 不仅有I/O共享存储器,还能通过图形地址再映射表GART(Graphics Address Remapping Table)直接对主板的RAM部分进行寻址 2018/12/2 Linux OS Analysis

I/O共享存储器的访问 对于物理地址1M之内的I/O共享存储器访问 对于高端I/O共享存储器访问 直接访问3G以上的对应线性区间 addr+3G 对于高端I/O共享存储器访问 没有直接映射在3G以上的线性区间 需要为其创建一块非连续线性区,并将其映射到高端I/O共享存储器的物理地址上 ioremap/iounmap io_mem=ioremap(某个物理起始地址,长度) 访问io_mem+相对于起始地址的偏移处 2018/12/2 Linux OS Analysis

DMA(直接存储器访问,Direct Memory Access) 所有的PC都包含一个DMAC(DMA控制器) 一种辅助处理器 用来控制在RAM和I/O设备之间传送数据 设置并激活DMAC DMAC自行传送数据 数据传送结束后,DMAC发出一个中断请求 当CPU和DMAC并发访问同一个存储单元时,通过存储器仲裁器解决冲突 使用者:慢速设备 如,磁盘驱动器 2018/12/2 Linux OS Analysis

设备文件 Unix类操作系统都是基于文件概念的 文件是以字符序列而构成的信息载体,因此一个I/O设备也可以当作文件来处理 例如对/dev/lp0设备文件的write()可以将数据发往打印机 2018/12/2 Linux OS Analysis

设备文件的分类 根据设备驱动程序的基本特性,设备文件可以分为: 字符设备 块设备 数据可以被随机访问 在用户看来,访问任何位置的数据时间大致相同 典型例子:硬盘、软盘、CD-ROM、DVD播放器等 2018/12/2 Linux OS Analysis

字符设备 网络 要么不可以随机访问,例如声卡 如果可被随机访问(往往通过顺序访问方式实现),但随着数据的位置的不同,其访问时间会相差很大,例如磁带 网络 网卡不与文件相关联,使用专门的处理方式 2018/12/2 Linux OS Analysis

老式的设备文件 在Linux2.4中存在两种设备文件 老式的设备文件 Devfs设备文件 这是存放在文件系统中的实际文件 索引节点不对磁盘上的数据块编址,而是包含硬件设备的一个标识 每个设备文件包括: 名字、类型(字符/块) 设备号(主设备号:次设备号) 同一设备 驱动程序 不同设备 2018/12/2 Linux OS Analysis

mknod()系统调用用来创建老式的设备文件 设备文件名 设备号 16位, 主设备号:次设备号 操作权限和设备类型 其中设备类型指定: S_IFCHR或S_IFBLK 2018/12/2 Linux OS Analysis

设备文件通常包含在/dev目录中 一些设备文件的例子 2018/12/2 Linux OS Analysis

注意:字符设备与块设备具有独立的编号, 设备文件通常可以表示 例如,块设备(3,0)不同于字符设备(3,0) 一个硬件设备,例如磁盘/dev/hda 或硬件设备的某一物理或逻辑分区,例如磁盘分区/dev/hda2 或一个虚拟的逻辑设备(不会与任何硬件设备相关联),例如/dev/null代表一个“黑洞” 2018/12/2 Linux OS Analysis

对内核而言,一个设备文件的名字是无关紧要的,关键在于设备文件的类型及其主次设备号 如,建立一个设备文件/tmp/disk,其类型为块设备,设备号为(3,0),那么内核认为它与/dev/hda等价 2018/12/2 Linux OS Analysis

Devfs设备文件 使用主次设备号标识设备存在局限性 上述原因以及其他的一些因素综合起来,促使了devfs设备文件的产生 8位长的主次设备号不够用 上述原因以及其他的一些因素综合起来,促使了devfs设备文件的产生 Devfs虚拟文件系统允许设备驱动程序通过名字而不是主次设备号注册设备,例如 所有的磁盘可以放在/dev/disks目录下 /dev/hda/dev/disks/disc0 /dev/hdb/dev/disks/disc1 2018/12/2 Linux OS Analysis

使用devfs文件系统的I/O驱动程序通过调用devfs_register()注册设备 一个注册了的设备文件自动出现在devfs的虚拟目录下 2018/12/2 Linux OS Analysis

设备文件的VFS处理 进程访问普通文件时,通过文件系统访问磁盘分区中的数据块 当进程访问设备文件时,却可以驱动硬件设备 HOW? VFS 例如,进程访问计算机上的温度计对应的设备文件获得温度 HOW? VFS 2018/12/2 Linux OS Analysis

VFS VFS在设备文件打开时使用与设备相关的函数调用替换其缺省的文件操作 这些设备相关函数调用对硬件设备进行操作 2018/12/2 Linux OS Analysis

设备驱动程序 这是一个软件层,使得硬件设备能够响应预定义好的编程接口,就是一组控制设备的VFS函数接口 上述函数的具体实现由设备驱动程序提供 open,read,lseek,ioctl等 上述函数的具体实现由设备驱动程序提供 此外设备驱动程序必须 首先注册并初始化自己 并在进行数据传送的时候监控I/O操作 2018/12/2 Linux OS Analysis

注册设备驱动程序 注册一个设备驱动程序意味着把它与对应的设备文件连接起来 访问一个没有注册设备驱动程序的设备文件将会返回错误码-ENODEV 使得对设备文件发出的系统调用可以由内核转化为相应的设备驱动程序对应的函数 访问一个没有注册设备驱动程序的设备文件将会返回错误码-ENODEV 2018/12/2 Linux OS Analysis

注册时机 如果设备驱动程序被静态编译进内核,则注册发生在内核初始化阶段 如果作为一个内核模块来编译,则在装入模块的时候注册(并在卸载模块时注销) 2018/12/2 Linux OS Analysis

设备驱动程序的初始化 对设备驱动程序进行注册与初始化是两件不同的事情 注册应当尽早:使得用户可以使用设备文件 初始化应当推迟到最后可能的时候 原因:初始化就意味着需要分配系统中的稀缺资源,例如: 1,中断向量(动态分配的情况下) 2,用于DMA传送的缓冲区的页框 3,包括DMA通道本身 2018/12/2 Linux OS Analysis

监控I/O操作 I/O操作的持续时间通常不可预知,可能与各种因素相关,例如 为此,设备驱动程序必须通过某种监控手段监控I/O操作终止或超时 机械装置的状态,如对于磁盘来讲,磁头的当前位置 或实际的随机事件,例如数据包何时到达网卡 以及人为因素,例如人对键盘、鼠标的使用,以及发现打印机卡纸时的操作 为此,设备驱动程序必须通过某种监控手段监控I/O操作终止或超时 2018/12/2 Linux OS Analysis

两种可用的技术 轮询模式(polling mode) CPU重复检查(轮询)设备的状态寄存器,直到寄存器的值表明I/O操作已经完成为止 中断模式(interrupt mode) 如果I/O控制器能够通过IRQ线发出I/O操作结束的信号,就可以使用中断模式 2018/12/2 Linux OS Analysis

轮询模式的简单例子 Why ”--count” 也可以使用jiffies进行超时判断 若时间比较长,比如ms级,可以在每次轮询操作之后调用schedule主动放弃CPU,直到下次被调度再次轮询 可以用来粗略的判断超时 2018/12/2 Linux OS Analysis

中断模式的简单例子 假定实现一个简单的输入字符设备的驱动程序 当在对应的设备文件上发出read()系统调用时,一条输入命令被发往设备的控制寄存器 在一个不可预知的长时间后,设备把一个字节的数据放在输入寄存器 驱动程序然后将这个字节作为read()系统调用的结果返回 2018/12/2 Linux OS Analysis

这个驱动程序包含两个函数: 实现文件对象read方法的foo_read()函数 处理中断的foo_interrupt()函数 对I/O设备发出读命令 等待读操作的结束, 由中断处理程序唤醒 将获得的数据送到用户空间中 2018/12/2 Linux OS Analysis

从设备上读入数据 唤醒read的剩余部分 2018/12/2 Linux OS Analysis

再看foo_read的输入参数 Struct file*filp,在这个数据的私有数据项中,VFS已经将其转换成设备驱动程序的私有的信息 foo_dev_t, 被定义为包含如下信息: 一个信号量,互斥 使用intr作为标志 0:没有发生/处理中断 1:处理了中断 一个等待队列,用来给foo_read睡眠 一个数据区,长度为1,用来存放读到的数据 2018/12/2 Linux OS Analysis

foo_interrupt的输入参数没有得到使用,这是一种很普遍的情况 char* buf,用户提供的存放数据的空间 Count和ppos都没有用到 再看看foo_interrupt()中,这是通过foo一个全局变量获得设备的私有数据结构的,这个数据结构与foo_read()中通过filp中获得的私有数据一致 foo_interrupt的输入参数没有得到使用,这是一种很普遍的情况 2018/12/2 Linux OS Analysis

块设备驱动程序 典型的块设备驱动程序都有很高的平均访问时间 定义:相邻的数据 指当数据以相邻的方式存放在磁表面时,一次单独操作就可以访问它们 例如磁盘的每次操作都需要几个ms,主要是为了定位磁头,一旦定位后,就可以以稳定的高速率传输数据(几十MB/秒) 定义:相邻的数据 指当数据以相邻的方式存放在磁表面时,一次单独操作就可以访问它们 2018/12/2 Linux OS Analysis

内核对块设备处理程序的支持具有以下特点: 通过VFS提供统一接口 对磁盘数据进行有效的预读 为数据提供磁盘高速缓存 2018/12/2 Linux OS Analysis

用于块设备文件的缺省的文件操作方法 2018/12/2 Linux OS Analysis

块设备请求及其优化 虽然块设备驱动程序可以一次传送一个单独的数据块,但是内核并不会为每个要访问的数据块都执行一次I/O操作 内核试图把几个块合并在一起,作为一个整体来处理,从而减少磁头的平均移动时间 HOW? 2018/12/2 Linux OS Analysis

当请求发生时,内核检查是否能通过稍微扩展前一个一直处于等待状态的请求而满足新的请求,从而减少定位的时间,提高效率 为读写一个磁盘块的请求生成块设备请求 但推迟这个请求执行的时间 这是提高块设备性能的关键机制 当请求发生时,内核检查是否能通过稍微扩展前一个一直处于等待状态的请求而满足新的请求,从而减少定位的时间,提高效率 2018/12/2 Linux OS Analysis

每个块设备驱动程序都维护着自己的请求队列; 每个物理块设备应当有一个请求队列 低级的设备驱动程序一般采用如下策略: 请求可以以提高磁盘性能的方式进行排序 低级的设备驱动程序一般采用如下策略: 处理请求队列上的第一个请求,并设置设备控制器,以便在数据传送完成时可以产生一个中断,然后就停止 当设备控制器产生中断时,中断处理程序就激活下半部分。 下半部分将被处理的请求删除,并继续1 2018/12/2 Linux OS Analysis

驱动程序的编写 有专门的书《Linux设备驱动程序》来讲如何写Linux下的驱动程序 我们这里用最简单的例子来尝试驱动程序的编写 中译本有500多页 我们这里用最简单的例子来尝试驱动程序的编写 2018/12/2 Linux OS Analysis

1,确定设备名称与主次设备号(动态分配的不指定) 2,编写设备文件对内核上层的接口file_operations 包括: init, open, release, read, write, ioctl 等 3,编译并加载设备驱动(两种方法) 3.1,静态加载: 3.1.1,将初始化函数加入内核驱动初始化部分 3.1.2,修改相应的Makefile, 增加驱动的目标文件 3.1.3,重新编译内核,启用新的内核 2018/12/2 Linux OS Analysis

3.2,动态加载, 先编译成Linux模块目标文件,再用insmod将驱动模块加载,还有rmmod, lsmod命令,可查看man得知相应的功能。 4,在目录/dev下建立相应的设备文件。 mknod 创建设备对象, 参数: 设备名 设备类型 主设备号 次设备号 5,在用户态下编写应用程序测试,使用该设备驱动 2018/12/2 Linux OS Analysis

一个虚拟的字符驱动程序举例 char_dev.c makefile testchardev.c 设备名定为:char_dev 用命令insmod char_dev.o加载 用命令lsmod察看是否成功加载 使用dmesg察看主设备号 使用mknod char_dev c 253 1在/dev目录下创建设备文件 运行Testchardev.c测试 2018/12/2 Linux OS Analysis

Project7 实现一个虚拟的字符驱动程序 2018/12/2 Linux OS Analysis