`
ackerman
  • 浏览: 75020 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Linux设备I/O (一)

阅读更多

一、外设的访问

几乎每一种外部设备都是通过读写设备上的寄存器来进行访问的,这些寄存器分为控制寄存器、状态寄存器和数据寄存器,而且一个外设的寄存器通常被连续编址。外部寄存器也成为"I/O端口"。

二、外设的编址方式

CPU对外设IO端口物理地址的编址方式有两种:一种是I/O映射方式(I/O-mapped),另一种是内存映射方式(Memory-mapped)。而具体采用哪一种则取决于CPU的体系结构。

(1)X86(I/O-mapped)

为外设专门实现了一个单独地地址空间,称为“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映射方式”的一个主要缺点。

(2)ARM(Memory-mapped)

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

三、linux下对I/O端口的访问

Linux将基于I/O映射方式的或内存映射方式的I/O端口通称为“I/O区域”(I/O region),IO区域是基于IO资源(Resource)来实现的。linux对I/O端口映射和I/O内存映射提供了不同的操作函数。对于I/O内存映射,为了提高兼容性,linux也为这些平台提供了I/O端口操作函数,他们实际上还是通过访问I/O内存映射地址来访问的,因此,不管你的程序是使用IO端口映射还是IO内存 映射,它都可以很好的运行到各种平台上。

分享到:
评论

相关推荐

    Linux下必用的I/O 操作手段I/O文件

    在Linux操作系统中,I/O操作是程序与外部设备交互的关键途径。系统调用是用户空间程序与内核交互的桥梁,提供了对操作系统功能的访问。Linux系统调用包括多种类型,其中I/O相关的调用是程序员必须掌握的重要部分,...

    Linux的I/O编程的基础实验open.c

    在Linux操作系统中,I/O(Input/Output)编程是系统编程的重要组成部分,它涉及与硬件设备进行数据交换的过程。在这个基础实验"open.c"中,我们将深入探讨如何使用C语言来实现Linux下的I/O操作,特别是文件的打开...

    嵌入式Linux下文件I/O

    在嵌入式Linux系统中,文件I/O是操作系统与外部设备进行数据交换的重要途径。本文将深入探讨嵌入式Linux下的文件I/O机制,包括基本概念、API接口、以及实际应用示例。我们将通过分析提供的课件、源码和说明,帮助你...

    Linux直接I/O机制介绍

    针对上述问题,Linux引入了一种名为直接I/O的机制,旨在克服缓存I/O的一些限制,尤其适用于自缓存应用程序。 **直接I/O的特点**: - **绕过页缓存**:直接I/O机制允许数据直接在应用程序地址空间与磁盘之间传输,...

    linux系统文件I/O编程

    掌握Linux中系统调用的基本概念 掌握Linux中用户编程接口(API)及系统...掌握Linux下文件相关的不带缓存I/O函数的使用 掌握Linux下设备文件读写方法 掌握Linux中对串口的操作 熟悉Linux中标准文件I/O函数的使用

    linux 设备驱动中的阻塞与非阻塞 I/O

    在Linux设备驱动开发中,I/O操作是核心部分,它涉及到如何与硬件交互来传输数据。I/O模型主要有两种:阻塞(Blocking)和非阻塞(Non-blocking),这两种方式在处理设备请求时有着本质的区别。 阻塞I/O是Linux内核...

    很全面的资料:Linux之I/O端口

    - I/O端口是I/O接口内部的寄存器,每个寄存器都有一个唯一的地址。常见的寄存器类型包括数据寄存器、状态寄存器和控制寄存器,CPU通过它们与外设交互。这些寄存器既可以位于I/O空间,也可以位于内存空间,统称为I/O...

    异步通知和异步I/O

    总的来说,异步通知和异步I/O是Linux设备驱动开发中的核心概念,它们是优化系统性能和提升用户体验的关键。通过深入学习和实践,开发者可以构建出更加高效、响应迅速的驱动程序,满足现代计算环境中对速度和效率的高...

    Linux I/O 原理和 Zero-copy 技术全面揭秘

    Linux I/O 原理和 Zero-copy 技术全面揭秘 在现代的计算机系统中,尤其是在网络服务器领域,I/O(输入/输出)已经成为决定系统性能的关键因素。由于大多数网络应用基于客户端-服务端模型,大量的数据交换使得I/O...

    IBM Power服务器I/O Drawer硬件特性及介绍

    IBM Power服务器I/O Drawer是IBM推出的一种用于扩展服务器I/O能力的硬件设备,主要针对POWER6和POWER7架构的服务器。这些I/O Drawer提供了多种型号,包括fc#5802,fc#5877和fc#5803,以满足不同用户的扩展需求。 fc...

    I/O管理程序(最新发表) I/O管理程序(最新发表)

    本文将深入探讨Linux 2.4.0内核中的I/O子系统,特别是关于I/O端口资源管理的实现原理,这对于理解操作系统内核机制和设备驱动程序开发至关重要。 在硬件层面上,I/O端口是CPU与外设通信的关键通道。它们分为控制、...

    浅谈Linux 网络 I/O 模型简介(图文)

    根据UNIX网络编程的分类,Linux提供了五种I/O模型,分别是阻塞I/O、非阻塞I/O、I/O复用模型、信号驱动I/O以及异步I/O。 1. **阻塞I/O模型**: 在这个模型中,进程调用如`recvfrom`这样的系统调用时,会一直等待...

    Linux.IO.stack_v1.0.pdf

    这个过程涉及多个层次和组件,包括系统调用接口、虚拟文件系统、缓冲缓存、直接I/O、文件系统层、块设备I/O层以及硬件抽象层。 首先,应用程序通过各种库函数,如open、read、write等发起I/O请求,这些库函数最终会...

    ARM9 I/O driver source

    3. **Linux设备驱动框架** - **字符设备驱动**:适用于简单的、顺序访问的设备,如温度传感器18B20。 - **块设备驱动**:处理连续的数据块,如硬盘驱动。 - **驱动注册**:通过`register_chrdev()`或`register_...

    如何更改Linux 的I/O调度器?

    Linux 的 I/O 调度器是一个以块式 I/O 访问存储卷的进程,有时也叫磁盘调度器。Linux I/O 调度器的工作机制是控制块设备的请求队列:确定队列中哪些 I/O 的优先级更高以及何时下发 I/O 到块设备,以此来减少磁盘寻道...

    pci9054I/O模式驱动

    PCI9054驱动程序是针对特定硬件设备——PCI9054...总的来说,PCI9054 I/O模式驱动程序的开发是一个涉及硬件接口、操作系统内核、通信协议等多个层面的技术挑战,需要开发者具备扎实的计算机系统知识和丰富的实践经验。

    fio - Flexible I/O tester rev. 3.9

    fio(Flexible I/O Tester)是一款强大的I/O性能测试工具,主要用于存储设备的基准测试。它支持多种I/O引擎,包括但不限于Linux AIO、POSIX、Solaris、SPDK等,并且能够提供丰富的命令行选项来定制测试场景。fio自...

    Linux文件I/O编程实验代码copy_file

    在Linux系统中,文件I/O(输入/输出)编程是应用程序与存储设备交互的基础,它涉及到读取、写入和处理文件。在这个实验"Linux文件I/O编程实验代码copy_file"中,我们将深入理解如何使用C语言进行低级别的文件复制。...

Global site tag (gtag.js) - Google Analytics