- 浏览: 75468 次
- 性别:
- 来自: 北京
一、外设的访问
几乎每一种外部设备都是通过读写设备上的寄存器来进行访问的,这些寄存器分为控制寄存器、状态寄存器和数据寄存器,而且一个外设的寄存器通常被连续编址。外部寄存器也成为"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内存 映射,它都可以很好的运行到各种平台上。
发表评论
-
排序算法---计数排序
2011-11-27 14:57 609#include <stdio.h> vo ... -
排序算法---归并排序
2011-11-26 19:33 748#include <stdio.h> vo ... -
排序算法---交换排序(冒泡排序、快速排序)
2011-11-26 19:32 702#include <stdio.h> vo ... -
排序算法---选择排序(简单插入排序、堆排序)
2011-11-26 19:31 649#include <stdio.h> vo ... -
排序算法---插入排序(简单排序、shell排序)
2011-11-26 19:29 650#include <stdio.h> vo ... -
删除字符串中的特定字符和重复字符
2011-11-26 13:45 666#include <stdio.h> vo ... -
Linux编程-多线程、同步和互斥(转载)
2011-11-14 15:27 1209http://www.cnblogs.com/skynet/a ... -
寻找字符串中的最大数字子串
2011-09-22 17:17 1523#include <stdio.h> int f ... -
删除子字符串
2011-09-21 15:27 604#include <stdio.h> #incl ... -
c语言随机数
2011-09-18 17:15 687#include <stdio.h> #i ... -
带头结点有序单链表的合并
2011-09-08 14:21 1184typedef int Item; typedef s ... -
链表逆序的递归/非递归算法
2011-09-01 23:37 1412/** *链表逆序的递归/非递归算法 */ # ... -
递归算法---字符串---全/部分组合和全排列
2011-08-30 23:01 1222#include <stdio.h> #i ... -
递归算法---0-1背包问题(面试宝典)
2011-08-28 21:11 1901/** *正整数n,m,从数列1、2、3、...、n中随 ... -
递归算法---字符串全组合(面试宝典)
2011-08-28 17:24 1257/** *求一字符串所有字串的组合 */ #i ... -
递归算法---求解多元一次方程
2011-08-28 10:38 1898/** * 求解x1+x2+x3+...+x10 = ... -
(zz)关于类的sizeof
2011-08-27 18:16 587http://blog.sina.com.cn/s/blog_ ... -
(zz)结构体字节对齐原则
2011-08-27 17:53 1579结构体默认的字节对齐一般满足三个准则: 结构体变量的首 ... -
list.h from linux-2.4
2011-08-25 09:59 607#ifndef _LIST_H_ #define _L ... -
The C Programming Lang (K&R) hash table
2011-08-25 09:52 936hash.h #include <stdio.h ...
相关推荐
在Linux操作系统中,I/O操作是程序与外部设备交互的关键途径。系统调用是用户空间程序与内核交互的桥梁,提供了对操作系统功能的访问。Linux系统调用包括多种类型,其中I/O相关的调用是程序员必须掌握的重要部分,...
在Linux操作系统中,I/O(Input/Output)编程是系统编程的重要组成部分,它涉及与硬件设备进行数据交换的过程。在这个基础实验"open.c"中,我们将深入探讨如何使用C语言来实现Linux下的I/O操作,特别是文件的打开...
在嵌入式Linux系统中,文件I/O是操作系统与外部设备进行数据交换的重要途径。本文将深入探讨嵌入式Linux下的文件I/O机制,包括基本概念、API接口、以及实际应用示例。我们将通过分析提供的课件、源码和说明,帮助你...
针对上述问题,Linux引入了一种名为直接I/O的机制,旨在克服缓存I/O的一些限制,尤其适用于自缓存应用程序。 **直接I/O的特点**: - **绕过页缓存**:直接I/O机制允许数据直接在应用程序地址空间与磁盘之间传输,...
掌握Linux中系统调用的基本概念 掌握Linux中用户编程接口(API)及系统...掌握Linux下文件相关的不带缓存I/O函数的使用 掌握Linux下设备文件读写方法 掌握Linux中对串口的操作 熟悉Linux中标准文件I/O函数的使用
在Linux设备驱动开发中,I/O操作是核心部分,它涉及到如何与硬件交互来传输数据。I/O模型主要有两种:阻塞(Blocking)和非阻塞(Non-blocking),这两种方式在处理设备请求时有着本质的区别。 阻塞I/O是Linux内核...
- I/O端口是I/O接口内部的寄存器,每个寄存器都有一个唯一的地址。常见的寄存器类型包括数据寄存器、状态寄存器和控制寄存器,CPU通过它们与外设交互。这些寄存器既可以位于I/O空间,也可以位于内存空间,统称为I/O...
总的来说,异步通知和异步I/O是Linux设备驱动开发中的核心概念,它们是优化系统性能和提升用户体验的关键。通过深入学习和实践,开发者可以构建出更加高效、响应迅速的驱动程序,满足现代计算环境中对速度和效率的高...
Linux I/O 原理和 Zero-copy 技术全面揭秘 在现代的计算机系统中,尤其是在网络服务器领域,I/O(输入/输出)已经成为决定系统性能的关键因素。由于大多数网络应用基于客户端-服务端模型,大量的数据交换使得I/O...
IBM Power服务器I/O Drawer是IBM推出的一种用于扩展服务器I/O能力的硬件设备,主要针对POWER6和POWER7架构的服务器。这些I/O Drawer提供了多种型号,包括fc#5802,fc#5877和fc#5803,以满足不同用户的扩展需求。 fc...
本文将深入探讨Linux 2.4.0内核中的I/O子系统,特别是关于I/O端口资源管理的实现原理,这对于理解操作系统内核机制和设备驱动程序开发至关重要。 在硬件层面上,I/O端口是CPU与外设通信的关键通道。它们分为控制、...
根据UNIX网络编程的分类,Linux提供了五种I/O模型,分别是阻塞I/O、非阻塞I/O、I/O复用模型、信号驱动I/O以及异步I/O。 1. **阻塞I/O模型**: 在这个模型中,进程调用如`recvfrom`这样的系统调用时,会一直等待...
这个过程涉及多个层次和组件,包括系统调用接口、虚拟文件系统、缓冲缓存、直接I/O、文件系统层、块设备I/O层以及硬件抽象层。 首先,应用程序通过各种库函数,如open、read、write等发起I/O请求,这些库函数最终会...
3. **Linux设备驱动框架** - **字符设备驱动**:适用于简单的、顺序访问的设备,如温度传感器18B20。 - **块设备驱动**:处理连续的数据块,如硬盘驱动。 - **驱动注册**:通过`register_chrdev()`或`register_...
Linux 的 I/O 调度器是一个以块式 I/O 访问存储卷的进程,有时也叫磁盘调度器。Linux I/O 调度器的工作机制是控制块设备的请求队列:确定队列中哪些 I/O 的优先级更高以及何时下发 I/O 到块设备,以此来减少磁盘寻道...
PCI9054驱动程序是针对特定硬件设备——PCI9054...总的来说,PCI9054 I/O模式驱动程序的开发是一个涉及硬件接口、操作系统内核、通信协议等多个层面的技术挑战,需要开发者具备扎实的计算机系统知识和丰富的实践经验。
fio(Flexible I/O Tester)是一款强大的I/O性能测试工具,主要用于存储设备的基准测试。它支持多种I/O引擎,包括但不限于Linux AIO、POSIX、Solaris、SPDK等,并且能够提供丰富的命令行选项来定制测试场景。fio自...
在Linux系统中,文件I/O(输入/输出)编程是应用程序与存储设备交互的基础,它涉及到读取、写入和处理文件。在这个实验"Linux文件I/O编程实验代码copy_file"中,我们将深入理解如何使用C语言进行低级别的文件复制。...