博主按:下文原作者在linux2.4.0基础上分析的,我现在的内核是2.6.32。在有区别的地方我会用红色文字标出,作为对原文的一些补充吧。

本文主要从内核实现的角度分析linux 2.4.0内核IO子系统中对IO端口资源的管理的实现原理。本文是为那些想要深入分析Linux的IO子系统的读者和设备驱动程序开发人员而写的。

  Copyright ?0? 2002 by 詹荣开
  E-mail:zhanrk@sohu.com
  linux-2.4.0
  Version 1.0.0,2002-10-1

  关键词:设备管理、驱动程序、I/O端口、资源

  申明:这份文档是按照自由软件开放源代码的精神发布的,任何人可以免费获得、使用和重新发布,但是你没有限制别人重新发布你发布内容的权利。发布本文的目的是希望它能对读者有用,但没有任何担保,甚至没有适合特定目的的隐含的担保。更详细的情况请参阅GNU通用公共许可证(GPL),以及GNU自由文档协议(GFDL)。

  几乎每一种外设都是通过读写设备上的寄存器来进行的。外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器三大类,而且一 个外设的寄存器通常被连续地编址。CPU对外设IO端口物理地址的编址方式有两种:一种是I/O映射方式(I/O-mapped),另一种是内存映射方式 (Memory-mapped)。而具体采用哪一种则取决于CPU的体系结构。

  有些体系结构的CPU(如,PowerPC、m68k等)通常只实现一个物理地址空间(RAM)。在这种情况下,外设I/O端口的物理地址就被映射到 CPU的单一物理地址空间中,而成为内存的一部分。此时,CPU可以象访问一个内存单元那样访问外设I/O端口,而不需要设立专门的外设I/O指令。这就 是所谓的“内存映射方式”(Memory-mapped)。

  而另外一些体系结构的CPU(典型地如X86)则为外设专门实现了一个单独地地址空间,称为“I/O地址空间”或者“I/O端口空间”。这是一个与 CPU地RAM物理地址空间不同的地址空间,所有外设的I/O端口均在这一空间中进行编址。CPU通过设立专门的I/O指令(如X86的IN和OUT指 令)来访问这一空间中的地址单元(也即I/O端口)。这就是所谓的“I/O映射方式”(I/O-mapped)。与RAM物理地址空间相比,I/O地址空 间通常都比较小,如x86 CPU的I/O空间就只有64KB(0-0xffff)。这是“I/O映射方式”的一个主要缺点。

  linux将基于I/O映射方式的或内存映射方式的I/O端口通称为“I/O区域”(I/O region)。在讨论对I/O区域的管理之前,我们首先来分析一下Linux是如何实现“I/O资源”这一抽象概念的。

3.1 linux对I/O资源的描述

  linux设计了一个通用的数据结构resource来描述各种I/O资源(如:I/O端口、外设内存、DMA和IRQ等)。该结构定义在include/linux/ioport.h头文件中:

struct resource {
    const char *name;
    unsigned long start, end;
    unsigned long flags;
    struct resource *parent, *sibling, *child;
  };
2.6.32中start和end的类型是resource_size_t,在64位系统下是u64,32位系统下是u32

  各成员的含义如下:

  1. name指针:指向此资源的名称。
  2. start和end:表示资源的起始物理地址和终止物理地址。它们确定了资源的范围,也即是一个闭区间[start,end]。
  3. flags:描述此资源属性的标志(见下面)。
  4. 指针parent、sibling和child:分别为指向父亲、兄弟和子资源的指针。

  属性flags是一个unsigned long类型的32位标志值,用以描述资源的属性。比如:资源的类型、是否只读、是否可缓存,以及是否已被占用等。下面是一部分常用属性标志位的定义(ioport.h):

/*
* IO resources have these defined flags.
*/
#define IORESOURCE_BITS 0x000000ff /* Bus-specific bits */

#define IORESOURCE_IO 0x00000100 /* Resource type */
#define IORESOURCE_MEM 0x00000200
#define IORESOURCE_IRQ 0x00000400
#define IORESOURCE_DMA 0x00000800

#define IORESOURCE_PREFETCH 0x00001000 /* No side effects */
#define IORESOURCE_READONLY 0x00002000
#define IORESOURCE_CACHEABLE 0x00004000
#define IORESOURCE_RANGELENGTH 0x00008000
#define IORESOURCE_SHADOWABLE 0x00010000
#define IORESOURCE_BUS_HAS_VGA 0x00080000

#define IORESOURCE_UNSET 0x20000000
#define IORESOURCE_AUTO 0x40000000
#define IORESOURCE_BUSY 0x80000000
/* Driver has marked this resource busy */

  指针parent、sibling和child的设置是为了以一种树的形式来管理各种I/O资源。

转载于:https://www.cnblogs.com/java-time/archive/2011/01/20/tt43.html

Linux对I/O端口资源的管理〔1〕相关推荐

  1. Linux对I/O端口资源的管理(5)

    3.6 访问I/O内存资源 尽管I/O端口空间曾一度在x86平台上被广泛使用,但是由于它非常小,因此大多数现代总线的设备都以内存映射方式(Memory-mapped)来 映射它的I/O端口(指I/O寄 ...

  2. Linux实用操作:小技巧(快捷键)、软件安装、systemctl、软连接、日期时区、IP地址、主机名、网络传输、端口、进程管理、主机状态、环境变量、上传、下载、压缩和解压

    版本说明 当前版本号[20230415]. 版本 修改说明 20230415 初版 本课程的笔记已经更新完毕,各位可以通过点击黑马程序员2023年新版Linux零基础快速入门到精通>学习笔记总目 ...

  3. 【linux开发】IO端口和IO内存的区别及分别使用的函数接口

    IO端口和IO内存的区别及分别使用的函数接口 每个外设都是通过读写其寄存器来控制的.外设寄存器也称为I/O端口,通常包括:控制寄存器.状态寄存器和数据寄存器三大类.根据访问外设寄存器的不同方式,可以把 ...

  4. linux查询对外2827端口运行文件,lsof介绍

    1.lsof 简介 lsof 是 linux 下的一个非常实用的系统级的监控.诊断工具. 它的意思是 List Open Files,很容易你就记住了它是 "ls + of"的组合 ...

  5. Linux、Windows常见端口号大全

    哪些端口是系统预留自用的? Linux端口一般是1到65535 1-1023为系统端口,也叫BSD保留端口,也叫系统端口,这些端口只有系统特许的进程才能使用. 1024-65535为用户端口,其中: ...

  6. Linux操作系统之—所有端口详解大全手册

    Linux操作系统之-端口详解大全手册 0|无效端口,通常用于分析操作系统  1|传输控制协议端口服务多路开关选择器  2|管理实用程序  3|压缩进程  5|远程作业登录  7|回显  9|丢弃  ...

  7. linux系统工程师----2.linux中内核级加强型火墙的管理

    linux中内核级加强型火墙的管理 前言 一.selinux的功能 二.Selinux的三种状态及管理 三.Selinux的安全上下文 1.查看 2.修改安全上下文 四.SEBOOL 五.SEPORT ...

  8. Linux系统工程师--(1)Vsftpd服务的部署及优化与linux中内核级加强型火墙的管理

    Linux系统工程师 实验所用系统为Redhat-rhel8.2. 目录 Linux系统工程师 Linux的系统工程师--Vsftpd服务的部署及优化 一.ftp介绍 二.vsftpd安装及启用 三. ...

  9. esxi远程管理端口_如何在 vmware esxi 中开放 VNC功能及端口实现远程管理 完整篇...

    VMWare esxi中开放 VNC功能及端口实现远程管理 完整篇 在多个论坛上看了相关文章,总的写得不完整.现将各方资源整编写完整版.详文如下! 步骤1. 修改ESXi主机的firewall配置 在 ...

最新文章

  1. Linux用init命令关机、重启、切换模式
  2. java 判断二叉树是否平衡_剑指Offer - 判断二叉树是否是平衡二叉树
  3. 频率分布直方图组距如何确定_吃透教材理解教参,《直方图》教学反思
  4. linux command find
  5. Android小项目源码汇总
  6. Centos中常见error(网卡、网络、防火墙)
  7. VC读取注册表中二进制类型REG_BINARY的代码
  8. Android之运行app提示The application could not be installed: INSTALL_FAILED_TEST_ONLY
  9. 2021年上半年系统集成项目管理工程师综合知识真题及答案解析
  10. 用gRPC建设微服务,Proto 怎么管理更合适
  11. Tensorflow训练和预测中的BN层的坑(转载)
  12. HTTP 应用层过滤的兼容性问题及解决方案
  13. 配合大脑一天24小时最佳的工作时间表
  14. java代码禁止反编译_Java代码防止反编译
  15. C语言工程实践--物业费管理系统
  16. dict后缀_词根词缀法记单词之dict
  17. word 插入图片方式
  18. 如何隐藏或显示 计算机 桌面图标,如何隐藏电脑桌面图标或文件
  19. 机器学习和人工智能发展简史
  20. 51信用卡孙海涛:信用卡账单背后的大数据 | 万物互联创新大会

热门文章

  1. mysql的索引本质是一颗_一文揭开Mysql索引本质
  2. python生成gif【简明教程】
  3. 用python做数据分析,安装包一次到位
  4. DIP第九章习题解答
  5. 韩文版ie8 启用java_只有在启用了javascript的情况下,IE8才会在IE8模式下重新加载崩溃...
  6. Mysql data type
  7. 合成模式(Composite)
  8. Maven一:maven的下载和环境安装以及创建简单的Maven项目
  9. 选项卡TabPanel控件
  10. 如何解决:Android中 Error generating final archive: Debug Certificate expired on 10/09/18 16:30 的错误...