精华内容
下载资源
问答
  • C++三大IO流类总结——标准IO流、文件IO流、内存IO流 IO流类一览标准IO流标准IO流的条件状态条件状态标志条件状态函数标准IO流的输入输出成员函数代码示例条件状态put和get函数getline函数标准IO的格式控制输出格式...

    IO流类一览

    • ios:流基类(抽象类)
    • istream:通用输入流类和其他输入流的基类
    • ostream:通用输出流类和其他输出类的基类
    • iostream:通用输入输出流类和其他输入输出流类的基类
    • ifstream:输入文件流类
    • ofstream:输出文件流类
    • fstream:输入输出文件流
    • istrstream:输入字符串流类
    • ostrstream:输出字符串流类
    • strstream:输入输出字符串类
    • iostream_withassign: 通用输入输出流类和其他输入输出流类iostream的的派生类

    关系图如下:

    派生
    派生
    派生
    派生
    派生
    派生
    派生
    派生
    派生
    ios类:流基类
    istream:通用输入流类
    ostream:通用输出流类
    iostream:通用输入输出类
    ifstream:输入文件流类
    istringstream:输入字符串流类
    ofstream:输出文件流类
    ostringstream:输出字符串流类
    fstream:输入输出文件流类
    stringstream:输入输出字符串流类

    标准IO流

    C++中包含几个预定义的流对象,即标准IO流,它们是标准输入流对象cin、标准输出流对象cout、非缓冲型的标准出错流对象cerr、缓冲型的标准出错流对象clog。

    • cin是istream的派生类istream_withassign的对象,它与标准输入设备(通常是键盘)相联系。
    • cout是ostream的派生类ostream_withassign的对象,它与标准输出设备(通常是显示器)相联系。
    • cerr是ostream的派生类ostream_withassign的对象,它与标准错误输入设备(通常是显示器)相联系。
    • clog是ostream的派生类ostream_withassign的对象,它与标准错误输入设备(通常是显示器)相联系。

    标准IO流的条件状态

    C++语言IO类中定义了一些函数和标志,可以用来访问IO流的条件状态。

    一旦一个流发生错误,对其进行IO操作都无法进行。可以将流作为条件判断,这也是最简单的一种方式,但这样无法知晓 流的具体错误。通过IO类中的条件状态函数,可以知道流操作为什么失败。

    条件状态标志

    strm::iostate:条件状态集合
    strm::badbit:指示流是否崩溃
    strm::failbit:表示一个IO操作失败
    strm::eofbit:表示到流遇到结束标志
    strm::goodbit:表示流正常使用

    条件状态函数

    对于标准IO流s,有如下成员函数
    s.setstate(flag):将流s状态置为flag,返回void
    s.rdstate():返回流s的当前状态,返回类型为strm::iostate
    s.eof():若eofbit置位则返回true,表示到达流s末尾
    s.fail():若badbit或failbit置位,则返回true
    s.good():若流s处于有效状态,则返回true
    s.clear():清空各个状态位,将流置为有效
    s.clear(flag):复位flag中设置的标志位。可以先使用rdstate()读取到流标志位,进行位操作,作为flag参数传入。

    标准IO流的输入输出成员函数

    • put函数
      put函数用于输出一个字符格式:cout.put(char ch)
      例如:输出A可以采用以下方法:
      cout.put('A'); cout.put(65) ; cout.put(25+40);

    • get函数
      get函数的功能与提取运算符>>类似,主要不同之处是get函数在读入数据时可以包括空白字符,而后者不可以。

      • get函数用于读入一个字符,调用形式:cin.get()
      • get函数用于传入一个字符到char型变量,调用形式:cin.get(char ch)
    • getline函数
      getline函数用于从输入流读取n-1个字符,赋给指定的字符数组(或字符指针指向的数组),然后插入一个字符串结束志"\n"。("\n"可以用其他字符代替)遇到’\n‘会提前终止读取字符。

      getline函数调用格式:

      • cin.getline(字符数组,字符个数n,终止标志字符)
      • cin.getline(字符指针,字符个数n,终止标志字符)
    • ignore函数
      ignore函数的功能是跳过输入流的n个字符(默认的个数为1),或在遇到指定的终止符时 提前结束。
      调用格式:cin.ignore(n,终止字符);cin.ignore();cin.ignore(1,EOF)

    代码示例

    条件状态
    #include <iostream>
    using namespace std;
    
    int main() {
    
        cout<<"初始状态:"<<endl;
        //cout<<"failbit: "<<cin.failbit<<endl;
        cout<<"fail(): "<<cin.fail()<<endl;
        //cout<<"badbit: "<<cin.badbit<<endl;
        cout<<"bad(): "<<cin.bad()<<endl;
        //cout<<"eofbit: "<<cin.eofbit<<endl;
        cout<<"eof(): "<<cin.eof()<<endl;
        //cout<<"goodbit: "<<cin.goodbit<<endl;
        cout<<"good(): "<<cin.good()<<endl;
    
        int i;
    
        cout<<"在这里我们输入EOF:"<<endl;
        cin>>i;
    
        cout<<"输入EOF后:"<<endl;
        cout<<"fail(): "<<cin.fail()<<endl;
        cout<<"bad(): "<<cin.bad()<<endl;
        cout<<"eof(): "<<cin.eof()<<endl;
        cout<<"good(): "<<cin.good()<<endl;
    
        cout<<"先clear(),在这里我们正常输入一个数字:"<<endl;
    
        cin.clear();
        cin>>i;
    
        cout<<"正常输入数字后:"<<endl;
    
        cout<<"fail(): "<<cin.fail()<<endl;
        cout<<"bad(): "<<cin.bad()<<endl;
        cout<<"eof(): "<<cin.eof()<<endl;
        cout<<"good(): "<<cin.good()<<endl;
    
        cout<<"在这里我们输入一个字符串:"<<endl;
        cin>>i;
        cout<<"输入字符串后:"<<endl;
    
        cout<<"fail(): "<<cin.fail()<<endl;
        cout<<"bad(): "<<cin.bad()<<endl;
        cout<<"eof(): "<<cin.eof()<<endl;
        cout<<"good(): "<<cin.good()<<endl;
        
        return 0;
    }
    
    put和get函数
    #include<iostream>
    using namespace std;
    int main()
    {
     char ch;
     cout<<"Input:";
     while(cin.get(ch))   //读取输入的字符,直到结束为止 
      {
       cout.put(ch);      //输出字符 
      } 
      return 0;
    }
    /*
    程序运行结果是:
     input:123 abc xyz
     123 abc xyz 
    */
    
    getline函数
    #include<iostream>
    using namespace std;
    int main()
    {
     char ch[20];
     cout<<"输入一行字符:"<<endl;
     cin.getline(ch,21,'t');
     cout<<ch<<endl;;
     return 0;
    }
    /*
    程序运行结果是:
    输入一行字符:
    shdfjsfefrsdfjt
    shdfjsfefrsdfj 
    */
    

    标准IO的格式控制

    输出格式控制
    缓冲区控制
    • <<endl: 输出换行符, 刷新缓冲区
    • <<ends: 输出空字符, 刷新缓冲区
    • flush: 刷新缓冲区
    控制bool类型格式
    • <<boolalpha: 输出true 或者 false
    • <<noboolalpha: 输出0或1
    进制控制
    • <<oct: 八进制格式输出
    • <<dec: 十进制格式输出
    • <<hex: 十六进制格式输出
    • <<showbase: 输出指明进制类型, 0代表八进制,0x代表16进制
    • <<noshowbase: 输出不指明进制类型
    其他常用输出格式控制
    • cout.precision(int n)或者cout<<prcision(int n): 设置浮点数打印位数为n
    • <<showwpoint: 总是打印浮点数小数点
    • <<noshowpoint: 有小数部分才打印小数点
    • <<setw(int n): 指定打印宽度为n
    • <<left'或<<right`: 设置左对齐或者右对齐(默认对齐)
    • <<setfill(char ch): 设定填充字符,默认是空格
    输入格式控制
    • >>skipws: 输入跳过空白符
    • >>noskipws: 输入不跳过空白符

    文件输入输出流

    根据继承关系可以知道,文件输入输出流继承了iostream流类的所有成员函数,同时多了一些自身特有的成员函数和操作如下:

    • 文件流的关联
      fin.open(“test.txt”,ios::binary) //从文件读取数据
      fout.open(“test.txt”,ios::binary) //输出到文件,向文件写数据
      fboth.open(“test.txt”,ios::in|ios::out|ios::binary) //读写都可以
      或者
      ifstream fin(“test.txt”,ios::binary)
      ofstream fout(“test.txt”,ios::binary)
      fstream fboth(“test.txt”,ios::in|ios::out|ios::binary)

    • 标志位含义:
      ios::in 打开文件做读操作
      ios::out 打开文件做写操作,会删除原有数据
      ios::app 在每次写之前找到文件尾
      ios::trunc 打开文件时清空已存在的文件流
      ios::ate 打开文件后立即定位到文件末尾
      ios::binary 以二进制模式进行IO操作
      ios::nocreate: 不建立文件,所以文件不存在时打开失败
      ios::noreplace:不覆盖文件,所以打开文件时如果文件存在失败

    • 文件流的关闭: 调用close()成员函数

    字符串输入输出流类

    字符串流和文件流操作基本一致相同,区别在于:

    • 输出时数据不是流向外存文件,而是流向内存中的一个存储空间。输入时从内存中的存储空间读取数据,因此又称内存输入输出流类.
    • 字符串流对象关联的不是文件,而是内存中的一个存储空间,因此不需要打开和关闭文件。
    展开全文
  • 当你的Windows连续开机一个星期时,你是不是发现机器特别慢,点啥啥不开...由于系统的虚拟内存管理,当内存使用达到一定程度时,系统会将内存中 的数据交换到硬盘中,也就是Windos的虚拟内存,在Linux中叫Swap分区。此


    当你的Windows连续开机一个星期时,你是不是发现机器特别慢,点啥啥不开。但是你去看资源管理器的又发现内存占用也没有到90%,CPU也没跑满。那为什么这个时候会那么卡呢?

    其中一个原因就是由于长期使用机器且没有关机,导致内存中缓存了大量的数据。由于系统的虚拟内存管理,当内存使用达到一定程度时,系统会将内存中 的数据交换到硬盘中,也就是Windos的虚拟内存,在Linux中叫Swap分区。此时如果要使用交换到硬盘上的数据,那么系统首先要把内存中最远最久没有 使用的数据交换到硬盘,再把硬盘中需要的数据加载到内存,然后才可以跑逻辑,这样就造成了“点啥啥不开”的残像了。

    那么这样的情况会不会发生在我们的Server端Linux上呢?答案当然是肯定的。而且一旦该情况发生,有可能产生雪崩效应,一下就把服务器弄回老家了。 这里的典型案例就有云风大大遇到的Redis转储。又或者可以自己手写一个无限分配 内存并使用的例子。然后静静等待系统挂掉的那一刻。

    那么什么时候会发生这样的情况?或者说当我们的系统表现出什么的症状时我们要考虑这样的情况?如何进行确诊?

    一般当系统频繁的需要新内存时可能发生这样的情况,如频繁的读文件而不释放、网络接收大量文件写磁盘(写磁盘跟不上内存从网络接收的量)。此时我们的系统 对外相应速度会急剧下降但是CPU又没有跑满。这时我们就应该考虑是不是虚拟内存频繁交换的问题了。通过使用vmstat可以帮助我们来确诊是不是这个原因。

    1. vmstat输出

    裸奔运行vmstat命令,可以看到一行输出。该行输出内容表示的自系统最近启动后虚拟内存和CPU的平均情况。 在输出的第一行我们称之为表头。依次包含了:

    procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
    

    几个字段,第二行我们称之为子表头,依次包含了:

     r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
    

    其意义分别为:

    1. procs : 使用内存IO的进程统计

      • r : 获取了IO资源而等待cpu运行的进程数目
      • b : 因为等待IO资源而阻塞休眠的进程数目
    2. memory: 虚拟内存相关统计

      • swpd : 用掉的虚拟内存大小。也就是交换分区内用掉的大小
      • free : 空闲的内存大小。
      • buff : 被用作系统buffer的大小。比如write系统调用的时候,系统不会立马写磁盘,而是先缓冲到buffer中然后在合适的时候写入磁盘。
      • cache : 被用作系统cache的大小。

    这里,free的大小表示一定可以使用的大小,即malloc不会出错的大小。但是超过free时malloc会一定出错么?也不一定。因为系统的buff和cache在必要 的时候也会优先给malloc使用。只有在不可使用时才会出错,如被设置为共享内存。因此观察时要综合这四个位置一起作判断。当分配内存时首先使用free,free不够的时候从buff和cache中匀得,当还不够时选择从swap分区中取得。

    1. swap: 交换分区的使用情况

      • si : 每秒从硬盘中交换到内存中的大小。
      • so :每秒从内存中交换到硬盘中的大小。
    2. io : 块设备IO统计

      • bi : 每秒从块设备读入内存的大小
      • bo : 每秒从内存中写入快设备的大小

    什么是块设备?Linux下的设备主要分成字符设备和块设备(可以参考LDD《linux device driver》),类似于Socket属于流设备,而磁盘一般属于块设备。因此这个参数可以用来衡量写磁盘的性能。

    1. system : 操作系统中断和上下文切换统计

      • in : 操作的系统每秒触发的中断数目
      • cs : 操作系统每秒上下文切换次数,这里上下文切换可以认为是系统态到用户态或者反过来的切换
    2. cpu: cpu相关统计

      • us : 用户态代码执行占用的cpu时间。
      • sy :系统态代码执行占用的cpu时间。
      • id : cpu空闲时间,也就是执行系统idle的时间,cpu是不可能停机的。
      • wa : 耗费在等待IO上的时间
      • st : 其他的等待时间。

    2. vmstat的使用

    上面我们裸跑vmstat就可以得到一个输出,表示的是:自系统最近启动后虚拟内存和CPU的平均情况。

    vmstat的调用格式为:

    vmstat delay count [options]
    

    这里先介绍一个“-a”选项。 如果使用了 “-a” 选项,我们会发现其输出和上面描述的有点不一样。在memory的下面,没有了buff和cache子列了,取而代之的是inact和active子列。 他们分别表示激活的和非激活的内存大小。那怎样理解“激活”呢?对比增加了-a选和没有增加-a选项的结果我们可以发现inact + active = cache大小。 也就是我们上面讨论,如果系统中free的内存不够了,那么就去用cache和buff里面的内存。但是并不是都可以用的,其中可以用的就是inact部分。因此 我们可以知道,系统此时还可以使用的内存大小为 free+inact大小。如果该和持续下降,那么我们就要注意了。是不是有内存泄露、或者内存分配洪请求等 情况的出现了。

    除此之外还有个"-d"选项 通过使用“-d”选项,可以仅查看写磁盘的性能。有一级表头 disk, reads, writes, IO四大块。disk表示的是分区名称。reads和writes分别表示 读写扇区数目。其中都有: total merged sectors ms : total : 总共读取/写入成功的数目 merged : 合在一起读取操作的数目 sectors :读取/写入成功的扇区数目 ms :一次读或者写耗费的时间,单位是毫秒

    IO中包含了cur表示当前正在处理的IO数目,s表示每处理一个IO请求耗费的时间,单位是秒。 “-d”选项中包含了很多ram开头的随机分区。为了更清楚的查看可以使用 “-p”选项 指定某个分区。如 :

    vmstat -dp /dev/sda1
    

    可以仅查看该分区硬盘的读写情况。

    3. 通过vmstat进行诊断

    从上面我们了解了vmstat的基本使用,就可以拿它当听诊器进行诊断了。运行

    vmstat 1 100
    

    会每个一秒输出一次统计

    procs -----------memory---------- ---swap-- -----io---- -system-- -----cpu------
    r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
    0  0     64 180428 394096 30058348    0    0    41   183    3    5  0  0 99  0  0
    0  0     64 180428 394096 30058348    0    0     0    44  267  138  0  1 99  0  0
    0  0     64 181048 394096 30058348    0    0     0     0  259  223  0  0 100  0  0
    0  0     64 181048 394096 30058348    0    0     0     0  254  124  0  0 100  0  0
    
    1. 情景1:swpd 大小不断变化,si/so持续变化。 此时说明内存频繁进行换入换出操作,此时系统系能会急剧下降
    2. 情景2:id较高但是free 非常低,如果加上-a参数free+inactiv非常低。 此时内存可能被耗尽。
    3. 情景3:wa较高 系统等待IO时间过长,考虑IO的阻塞
    4. 。。。 有待补充
    展开全文
  • 当驱动和调用者进行内存操作的时候,比如驱动读取写入调用者的内存。windows上面总共有3种方法:DO_BUFFERED_IO,DO_DIRECT_IO和其他。 内核模式下操作调用者buffer WDM:各种方式有不同的使用方法,参考...

    当驱动和调用者进行内存操作的时候,比如驱动读取写入调用者的内存。windows上面总共有3种方法:DO_BUFFERED_IODO_DIRECT_IO其他。

    内核模式下操作调用者buffer

    WDM:各种方式有不同的使用方法,参考http://blog.csdn.net/zj510/article/details/8212032

    WDF: 统一使用WdfRequestRetrieveInputBuffer和WdfRequestRetrieveOutputBuffer就可以了。这个简化了很多。如:

    WdfRequestRetrieveOutputBuffer(Request, 10, &out_buf, NULL);
    RtlCopyMemory(out_buf, dev_ctx->_Buffer, 10);
    WdfRequestCompleteWithInformation(Request, STATUS_SUCCESS, 10);

     

    修改IO方式

    WDM: 通过DEVICE_OBJECT 的成员flags,如fdo->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE;

    WDF: 通过API WdfDeviceInitSetIoType, 如WdfDeviceInitSetIoType(device_init, WdfDeviceIoDirect);

    展开全文
  • 1,IO空间:X86一个特有的空间,与内存空间独立的空间,同样利用IO空间可以操作数据,只不过是利用对应的IO端口操作函数,例如inb(), inbw(), inl(); outb(), outw(), outl()等。  2,内存空间:内存地址的寻址...

        1,IO空间:X86一个特有的空间,与内存空间独立的空间,同样利用IO空间可以操作数据,只不过是利用对应的IO端口操作函数,例如inb(), inbw(), inl(); outb(), outw(), outl()等。

        2,内存空间:内存地址的寻址范围,例如32位操作系统内存空间为2的32次幂,即4G。

        3,IO端口:当外部寄存器或内存映射到IO空间时,即只能用IO端口操作函数进行数据读写,称为IO端口。

        4,IO内存:当外部寄存器或内存映射到内存空间时,即使用访问内存的方式对外部寄存器或者内存进行读写操作。

        从上面定义可以看出,外部设备只能通过设备上的寄存器或者内存(SRAM?DRAM?)与CPU进行通讯,外部设备的寄存器可以是IO端口(映射到IO空间),也可以是IO内存(映射到地址空间)。当映射到IO空间时,必须使用对应的IO操作函数;映射到内存空间时就要注意要使用特定的IO内存操作函数,最好不要直接使用指针操作,IO内存操作函数有如下:

        IO内存读函数:

        unsigned int ioread8(void *addr);

        unsigned int ioread16(void *addr);

        unsigned int ioread32(void *addr);

        IO内存写函数:

        unsigned int iowrite8(u8 value, void *addr);

        unsigned int iowrite16(u8 value, void *addr);

        unsigned int iowrite32(u8 value, void *addr);

        以下这些函数读和写一系列值到给定的I/O内存区域,从给定的buf读或写count个值到addr,参数count表示要读写的数据个数,而不是字节数

        void ioread8_rep(void *addr, void *buf, unsigned long count);

        void ioread16_rep(void *addr, void *buf, unsigned long count);

        void ioread32_rep(void *addr, void *buf, unsigned long count);

        void iowrite8_rep(void *addr, const void *buf, unsigned long count);

        void iowrite16_rep(void *addr, const void *buf, unsigned long count);

        void iowrite32_rep(void *addr, const void *buf, unsigned long count);

        需要操作一块IO地址时,使用下列函数(这些函数的行为类似于它们的C库类似函数)

        void memcpy_io(void *addr, u8 value, unsigned int count);

        void memcpy_fromio(void *dest, void *source, unsigned int count);

        void memcpy_fromio(void *dest, void *source, unsigned int count);

        由于边际效应的缘故,不管是否需要 ioremap,都不鼓励直接使用I/O内存指针,而应使用专门的I/O内存操作函数。这些I/O内存操作函数不仅在所有平台上是安全,而且对直接使用指针操作 I/O 内存的情况进行了优化。 --->《LDD》Chapter 9, Page 249

    展开全文
  • 内存空间: 内存地址寻址范围,32位操作系统内存空间为2的32次幂,即4G。 物理内存: 实实在在的物理设备,一般 ...IO空间: ...X86特有的一个空间,与内存空间彼此独立的地址空间...当一个寄存器或内存位于IO空间时,称
  • 内存IO,磁盘IO,网络IO

    千次阅读 2020-09-26 21:57:37
    2内存io关系 3网络io 任何程序都有 0:标准输入 1:标准输出 2:报错输出 /proc/$$进入当前进程目录 $$表示当前bash的pid $BASHPID 也可以获取进程pid /proc/$$/fd 进入当前进程的文件描述符目录,可以...
  • IO端口,IO内存IO映射 内存映射

    千次阅读 2014-09-22 14:36:58
    Linux系统下IO Memory和IO Port的区别 2014年07月06日 ⁄ Linux知识⁄ 共 721字 ⁄ 字号 小 中 大 ⁄ 评论 7 条 下面以x86架构为例,其它的架构可能并不适用。 先说一下本人对IO Memory和IO Port的...
  • IO端口 和 IO 内存

    2014-11-26 23:16:31
    IO 内存 一、概念 1.1 什么是IO端口?   芯片内核之外有诸多外设,如GPIO,I2C,USB,LCD等等,在S3C2440中,各种外设挂到了AHB总线或APB总线上,每种外设都是通过读写与其相关的寄存器进行控制。外设中寄存器的...
  • 内存IO访问

    千次阅读 2016-11-14 01:11:17
    内存IO访问
  • IO端口和IO内存的区别

    2014-05-19 02:59:24
    这时应该称外设IO寄存器为IO端口,访问IO寄存器可通过ioport_map将其映射 到虚拟地址空间,但实际上这是给开发人员制造的一个“假象”,并没有映射到内核虚拟地址,仅仅是为了可以使用和IO内存一样的接口访问IO...
  • 内存IO访问

    千次阅读 2018-02-18 21:44:55
    IO空间是相对于内存空间而言的, x86一般使用IO空间 arm等嵌入式cpu一般不提供IO空间,只存在内存空间 详看宋宝华第三版第11章:内存IO访问 1.内存空间可以直接通过地址,指针来访问,程序即在程序运行中使用...
  • <br />整天说内存,寄存器,端口,他们有...读取了寄存器后会自动清零 第二、IO空间和内存空间 并不是所有的体系结构都有IO空间这个定义的,我所了解的只有X86体系上有,而ARM体系结构就没有这种区别
  • IO端口与IO内存

    2012-05-21 20:45:37
    IO端口访问的另一种方式是将IO端口映射为内存进行访问。步骤:申请,ioport_map,操作,ioport_unmap,释放。 IO内存的访问步骤:申请,ioremap,操作,iounmap,释放。 将设备地址映射到用户空间: void *mmap ...
  • 整天说内存,寄存器,端口,他们有什么联系,有什么...读取了寄存器后会自动清零   第二、IO空间和内存空间 并不是所有的体系结构都有IO空间这个定义的,我所了解的只有X86体系上有,而ARM体系结
  • io端口与io内存

    千次阅读 2012-01-19 21:10:37
    结合下图,我们彻底讲述IO端口和IO内存以及内存之间的关系。主存16M字节的SDRAM,外设是个视频采集卡,上面有16M字节的SDRAM作为缓冲区。 1.  CPU是i386架构的情况在i386系列的处理中,内存和外部IO是独立...
  • IO端口和IO内存

    2011-10-27 22:25:17
    结合下图,我们彻底讲述IO端口和IO内存以及内存之间的关系。主存16M字节的SDRAM,外设是个视频采集卡,上面有16M字节的SDRAM作为缓冲区。 1.  CPU是i386架构的情况在i386系列的处理中,内存和外部IO是独立...
  • io端口和io内存

    千次阅读 2012-12-11 16:19:44
    linux中的 IO端口映射和IO内存映射 (一)地址的概念 1)物理地址:CPU地址总线传来的地址,由硬件电路控制其具体含义。物理地址中很大一部分是留给内存条中的内存的,但也常被映射到其他存储器上 (如显存、...
  • IO端口与IO内存详解

    千次阅读 2018-03-07 10:19:55
    物理地址中很大一部分是留给内存条中的内存的,但也常被映射到其他存储器上(如显存、BIOS等)。在程序指令中的虚拟地址经过段映射和页面映射后,就生成了物理地址,这个物理地址被放到CPU的地址线上。物理地址空间...
  • IO端口与IO内存管理

    2015-09-05 23:43:16
    一、I/O端口    端口(port)是接口电路中能被CPU直接访问的寄存器的地址。几乎每一种外设都是通过读写设备上的寄存器来进行的。CPU通过这些地址即端口向接口电路中的寄存器发送命令,...二、IO内存    例如,在P
  • IO内存IO端口的主要区别是,IO端口操作具有边际效应,而内存则没有(所以可以用多种方法进行优化,比如重新排序、告诉缓存等)。   使用IO内存前要先申请request_mem_region,然后ioremap映射;使用
  • IO端口和IO内存访问

    千次阅读 2015-11-18 19:52:52
    主要包括由驱动做IO Port和IO Memory访问所衍生出来的一系列问题。包含总线、驱动(或者内核)想对IO Port和IO Memory操作的方法,设备地址通过mmap向用户...讨论了remap_pfn_range创建物理与虚拟内存连接的一些问题。
  • IO端口和IO内存简介

    2012-08-28 13:16:05
    这些存取地址要么处于内存地址空间,要么属于IO地址空间。  从纯硬件的角度来看,内存区域和IO区域没有概念上的区别。它们都是通过在地址总线和控制总线上发出电信号(即, 读写信号)来访问,并且都是从数据总线读取...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 679,890
精华内容 271,956
关键字:

内存io