系统总线:
1、链接CPU、RAM、I/O设备之间的数据流动。例如:PCI、ISA、EISA、MCA、SCSI、USB
2、任何I\O设备有且仅能链接一条总线。 I\O端口:
1、每个连接到I\O总线上的设备都有自己的I\O地址集,通常称为I\O端口。
2、一共提供了65536个8位的端口
3、可以讲2个8位的看作一个16位的(必须从偶数开始),2个16位的看作一个32位的端口(必须从4倍数开始)
4、对端口对读写命令 in、ins、out、outs
5、为了提高性能提供控制寄存器、状态寄存器、输入寄存器、输出寄存器 I\O接口:
1、专用I\O接口:专门用于一个特定的硬件设备;键盘接口、图形接口、磁盘接口、鼠标接口、网络接口
2、通用I\O接口:用来连接多个不同的硬件设备,通常是外部设备。并口、串口、PCMCIA接口、SCSI接口、USB 设备控制器:
1、复杂的设备需要,典型的是磁盘控制器,可以用来解析高级命令,转换成处理磁盘的低级磁盘操作。
2、简单的设备不需要,比如可编程中断控制器、可编程间隔定时器。
设备驱动程序模型:1、电源管理(控制设备电源线上不同的电压级别)
2、即插即用(配置设备时透明的资源分配)
3、热插拔(系统运行时支持设备的插入和移除)
4、内核全权负责所有硬件设备的电源管理,当计算机进入待机时,内核立即强制每个能够响应‘待机’状态的设备安装一定的顺序进入待机状态
5、为了满足上述功能,为系统中所有的总线、设备以及设备驱动程序提供了一个统一的视图,即设备驱动程序模型。 设备文件:
1、I\O设备可以被当作设备文件(device file)这种所谓的特殊文件来处理,即可以对其使用系统调用read、write
2、根据设备驱动程序的基本特性,设备文件可以分位两种块和字符
3、块设备的数据可以被随机访问,传输数据的时间少,且大致相同。例如硬盘、软盘、CD-ROM驱动器、DVD播放器等
4、字符设备的数据或者不可以被随机访问;或者可以但是访问随机数据的时间很大程度依赖数据在设备内的位置,例如磁带驱动器
5、一般设备文件名是无关紧要的,关键是设备类型、主设备号、次设备号
6、主设备号和次设备号最大为65536,Linux
2.6对其进行了扩展主设备号12位,次设备号20位
7、最好的解决方案时动态分配设备号;动态创建设备文件 设备驱动程序:
1、实现文件对象read方法的foo_read函数
2、处理中断的foo_interrupt函数
3、当用户在设备文件上发出read系统调用,一条命令被发往设备的控制寄存器,一段时间间隔后,设备把一个字节的数据放入输入寄存器,作为read系统调用的结果返回 直接访问内存(DMA):
1、不经过CPU,设备直接和RAM互传数据
2、如果DMA和CPU同时访问同一内存,冲突由叫做内存仲裁器的硬件电路来解决
3、使用最多的是磁盘驱动器和其他需要一次传输大量字节的设备。
4、DMA的设置时间较长,少量数据时使用CPU效率更高
5、同步DMA由进程触发,例如播放电影、音乐;播放音乐时,将内存数据采用DMA传到声卡播放
6、异步DMA有硬件设备触发,例如网卡;网卡接收到数据,产生中断,将数据采用DMA方式传到内存 内核支持的I\O级别:
1、根本不支持:应用程序只能用适当的in、out汇编语言直接与设备I|O端口交互 2、最小支持: 内核不识别硬件设备,但是能识别I\O接口,用户程序将I\O接口视为能够读写字符流的顺序设备
3、扩展支持:内核能识别硬件,并处理I\O接口本身。这种设备可能没有对应的设备文件。 字符设备驱动程序:
1、比较简单,不涉及复杂到缓存策略,磁盘高速缓存
2、有些必须实现复杂到通信协议

深入理解Linux内核-I/O体系结构和设备驱动程序的更多相关文章

  1. 读书笔记之Linux系统编程与深入理解Linux内核

    前言 本人再看深入理解Linux内核的时候发现比较难懂,看了Linux系统编程一说后,觉得Linux系统编程还是简单易懂些,并且两本书都是讲Linux比较底层的东西,只不过侧重点不同,本文就以Linu ...

  2. 《深入理解Linux内核》 读书笔记

    深入理解Linux内核 读书笔记 一.概论 操作系统基本概念 多用户系统 允许多个用户登录系统,不同用户之间的有私有的空间 用户和组 每个用于属于一个组,组的权限和其他人的权限,和拥有者的权限不一样. ...

  3. 【读书笔记::深入理解linux内核】内存寻址【转】

    转自:http://www.cnblogs.com/likeyiyy/p/3837272.html 我对linux高端内存的错误理解都是从这篇文章得来的,这篇文章里讲的 物理地址 = 逻辑地址 – 0 ...

  4. 【读书笔记::深入理解linux内核】内存寻址

    我对linux高端内存的错误理解都是从这篇文章得来的,这篇文章里讲的 物理地址 = 逻辑地址 – 0xC0000000:这是内核地址空间的地址转换关系. 这句话瞬间让我惊呆了,根据我的CPU的知识,开 ...

  5. 【深入理解Linux内核架构】第3章:内存管理

    3.1 概述 内存管理涵盖了许多领域: 内存中物理内存页的管理: 分配大块内存的伙伴系统: 分配小块内存的slab.slub.slob分配器: 分配非连续内存块的vmalloc机制: 进程的地址空间. ...

  6. 【深入理解Linux内核架构】6.6 资源分配

    一段摘自<Linux设备驱动程序>的话: 每种外设都通过读写寄存器进行控制.大部分外设都有多个寄存器,不管是内存地址空间还是I/O地址空间,这些寄存器的访问地址都是连续的. 在硬件层,内存 ...

  7. 理解Linux内核之中断控制

    乍一看下边的Linux内核代码,貌似L3389有bug,于是我就绕有兴趣地阅读了一下local_irq_save/local_irq_restore的源代码. /* linux-4.14.12/mm/ ...

  8. Linux内核0.11体系结构 ——《Linux内核完全注释》笔记打卡

    0 总体介绍 一个完整的操作系统主要由4部分组成:硬件.操作系统内核.操作系统服务和用户应用程序,如图0.1所示.操作系统内核程序主要用于对硬件资源的抽象和访问调度. 图0.1 操作系统组成部分 内核 ...

  9. Linux内存管理(深入理解Linux内核)

    Linux的内存管理,实际上是借助80x86的硬件分段和分页电路,将逻辑地址转化为物理地址的. 物理内存中,有一部分是一直(Permanently)映射给内核使用的,这部分主要用于保存内核的代码,以及 ...

随机推荐

  1. java 浮点运算

      CreateTime--2017年12月1日11:35:00 Author:Marydon java 浮点类型(float.double)间的运算工具类 /** * 进行BigDecimal对象的 ...

  2. Android开发之使用DefaultHandler处理XML数据

    一.定义规则 XML数据结构定义 请记住上面的定义,后面我会用“标签开始”.“文本”.“标签结束”表示SAX正在处理哪部分XML数据 事件模型 为什么这里我要谈到这个,因为SAX处理XML数据是采用事 ...

  3. vi编辑器的常用命令

    游标控制 h 游标向左移 j 游标向下移 k 游标向上移 l (or spacebar) 游标向右移 w 向前移动一个单词 b 向后移动一个单词 e 向前移动一个单词,且游标指向单词的末尾 ( 移到当 ...

  4. excel怎么在插入的方框上打勾

    本例主要介绍如何在excel中插入带对勾的方框.   工具/原料 Excel 操作步骤:  在编辑Excel表格模板时,比如说简历.人力信息登记表等,经常需要有一些可选项,如下例的婚姻状况就包括“有配 ...

  5. PHP调用mysql函数整理

    mysql函数整理 名称:mysql_connect() 用途:打开非持久的 MySQL 连接.如果成功,则返回一个 MySQL 连接标识,失败则返回 FALSE. 语法:mysql_connect( ...

  6. ubuntu下安装万能五笔

    之前一直习惯了万能五笔输入法,使用Ubuntu12.04安装wnwb 在网络上搜索了一下并没有找到可 以在ibus下直接使用万能五笔的方法,于是想自己动手解决这个问题, 参考别人之前做的万能五笔For ...

  7. (转)IntelliJ IDEA java项目导入jar包,打jar包

    以下为转载原文:https://www.cnblogs.com/yulia/p/6824058.html 一.导入 1.java项目在没有导入该jar包之前,如图: 2.点击 File ->   ...

  8. java面试题--实现一个百亿的计算器

    看了网上很多说法,没有具体把它实现的,我试了一下其实还是比较简单的. 直接看代码: package com.infomorrow; import java.math.BigInteger; impor ...

  9. linux中的signal机制(转)

    信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念.Linux对信号机制的大致实现方法.如何使用信号,以及有关信号的几个系统调用. 信号机制是进程之间相互传递消息的一种方法,信号全 ...

  10. kubelet源码分析(version: git tag 1.7.6)

    一.概述 kubelet源码入口:cmd/kubelet/kubelet.go main() cmd/kubelet/app 包中的Run函数: 查看先参数,kubelet.KubeletDeps t ...