[转载]来认识寄存器,内存,IO空间,IO端口,IO内存

整天说内存,寄存器,端口,他们有什么联系,有什么不同之处,你了解他们么?

第一、寄存器和内存的区别

寄存器和内存都是可以用来读写的,但寄存器的操作时有副作用,称之为(side effect 边际效果)

读取一个寄存器可能导致寄存器中的内容发生变化,比如在一些设备的中断状态寄存器中,读取了寄存器后会自动清零

第二、IO空间和内存空间

并不是所有的体系结构都有IO空间这个定义的,我所了解的只有X86体系上有,而ARM体系结构就没有这种区别,

在X86上,IO空间和内存是独立的,他们各自有各自的总线,并且IO空间一般是64K,即16位,内存空间为4G

可见他们的差别是很大

第三、IO 端口和IO内存

在有了IO空间的概念后,就有IO端口和IO内存

当一个寄存器或内存位于IO空间时候,称之为IO端口

当一个寄存器或内存位于内存空间时候,称之为IO内存

这种映射是通过OS的MMU来把虚拟地址映射为物理地址的

可能单纯的这样解释会不明白,看下面这个图或许会好些

当你还在疑惑为什么指针可以想减而不可以相加的时候,了解了页表映射会或许就明白了!

在Linux驱动程序开发中,关于二者的不同,可以参看下这篇文章

http://www.360doc.com/content/10/1011/07/1317564_60018145.shtml

文章出处:http://blog.csdn.net/seanyxie/article/details/5946219

时间: 2024-10-13 00:05:25

[转载]来认识寄存器,内存,IO空间,IO端口,IO内存的相关文章

linux的io空间和内存空间

1 IO空间和内存空间 并不是所有的体系结构都有IO空间这个定义的,我所了解的只有X86体系上有,而ARM 体系结构就没有这种区别,ARM统一编址, 在X86上,IO空间和内存是独立的,他们各自有各自的总线,并且IO空间一般是64K, 即16位,采用IN和OUT指令访问.内存空间为4G. 可见他们的差别是很大. 2 静态映射: I/O静态映射方式通常是用在寄存器资源的映射上,这样在编写内核代码或驱动时就不 需要再进行ioremap,直接使用映射后的内核虚拟地址访问. map_io成员即内核提供给

Java API —— IO流(数据操作流 & 内存操作流 & 打印流 & 标准输入输出流 & 随机访问流 & 合并流 & 序列化流 & Properties & NIO)

1.操作基本数据类型的流 1) 操作基本数据类型 · DataInputStream:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型.应用程序可以使用数据输出流写入稍后由数据输入流读取的数据. · DataOutputStream:数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中.然后,应用程序可以使用数据输入流将数据读入. package datastreamdemos; import java.io.*; /** * Created b

UNIX高级环境编程(7)标准IO函数库 - 二进制文件IO,流定位,创建临时文件和内存流

? 1 二进制IO(Binary IO) 在前一篇我们了解了逐字符读写和逐行读写函数. 如果我们在读写二进制文件,希望以此读写整个文件内容,这两个函数虽然可以实现,但是明显会很麻烦且多次循环明显效率很低. 为了应对这种场景,标准IO库提供了fread和fwrite函数. 函数声明: #include <stdio.h> size_t fread(void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp); size_t fw

python(十)下:事件驱动与 阻塞IO、非阻塞IO、IO多路复用、异步IO

上节的问题: 协程:遇到IO操作就切换. 但什么时候切回去呢?怎么确定IO操作完了? 一.事件驱动模型介绍 通常,我们写服务器处理模型的程序时,有以下几种模型: (1)每收到一个请求,创建一个新的进程,来处理该请求: (2)每收到一个请求,创建一个新的线程,来处理该请求: (3)每收到一个请求,放入一个事件列表,让主进程通过非阻塞I/O方式来处理请求 第三种就是协程.时间驱动的方式,一般普遍认为第(3)种方式是大多数网络服务器采用的方式 论事件驱动模型 在UI编程中,,常常要对鼠标点击进行相应,

理论铺垫:阻塞IO、非阻塞IO、IO多路复用/事件驱动IO(单线程高并发原理)、异步IO

完全来自:http://www.cnblogs.com/alex3714/articles/5876749.html 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本文讨论的背景是Linux环境下的network IO. 一 概念说明 在进行解释之前,首先要说明几个概念:- 用户空间和内核空间- 进程切换- 进程的阻塞- 文件描述符- 缓存 I/O 用户空间与内核空间 现在操作系统都是采用虚拟存储器,

Java 中阻塞Io 以及非阻塞IO

在开始之前 关于本教程 新的输入/输出 (NIO) 库是在 JDK 1.4 中引入的.NIO 弥补了原来的 I/O 的不足,它在标准 Java 代码中提供了高速的.面向块的 I/O.通过定义包含数据的类,以及通过以块的形式处理这些数据,NIO 不用使用本机代码就可以利用低级优化,这是原来的 I/O 包所无法做到的. 在本教程中,我们将讨论 NIO 库的几乎所有方面,从高级的概念性内容到底层的编程细节.除了学习诸如缓冲区和通道这样的关键 I/O 元素外,您还有机会看到在更新后的库中标准 I/O 是

缓存io和非缓冲io

首先,先稍微了解系统调用的概念: 系统调用,英文名system call,每个操作系统都在内核里有一些内建的函数库,这些函数可以用来完成一些系统系统调用把应用程序的请求传给内核,调用相应的的内核函数完成所需的处理,将处理结果返回给应用程序,如果没有系统调用和内核函数,用户将不能编写大型应用程序,及别的功能,这些函数集合起来就叫做程序接口或应用编程接口(Application Programming Interface,API),我们要在这个系统上编写各种应用程序,就是通过这个API接口来调用系统

同步IO,异步IO,阻塞IO,非阻塞IO的联系与区别

转载 POSIX 同步IO.异步IO.阻塞IO.非阻塞IO,这几个词常见于各种各样的与网络相关的文章之中,往往不同上下文中它们的意思是不一样的,以致于我在很长一段时间对此感到困惑,所以想写一篇文章整理一下. POSIX(可移植操作系统接口)把同步IO操作定义为导致进程阻塞直到IO完成的操作,反之则是异步IO 按POSIX的描述似乎把同步和阻塞划等号,异步和非阻塞划等号,但是为什么有的人说同步IO不等于阻塞IO呢?先来说说几种常见的IO模型吧. IO模型 这里统一使用Linux下的系统调用recv

socket.io 中文手册 socket.io 中文文档

socket.io 中文手册,socket.io 中文文档转载于:http://www.cnblogs.com/xiezhengcai/p/3956401.html 服务端 io.on('connection',function(socket));//监听客户端连接,回调函数会传递本次连接的socket io.sockets.emit('String',data);//给所有客户端广播消息 io.sockets.socket(socketid).emit('String', data);//给指