当前位置: 技术问答>linux和unix
老问题,关于CPU寄存器的读写
来源: 互联网 发布时间:2016-06-07
本文导语: 1、在linux启动时,会把寄存器的地址映射到虚拟地址,因此在驱动中只要知道CPU寄存器的绝对地址,通过相关函数(内核提供)转换成虚拟地址,然后对这些虚拟地址的读写就能够操作CPU寄存器了(我现在都这么做)...
1、在linux启动时,会把寄存器的地址映射到虚拟地址,因此在驱动中只要知道CPU寄存器的绝对地址,通过相关函数(内核提供)转换成虚拟地址,然后对这些虚拟地址的读写就能够操作CPU寄存器了(我现在都这么做)。
2、但是linux似乎还有一个ioremap的函数(没用过),据说它能够把实际的i/o地址映射到虚拟地址,进而通过虚拟地址读写I/O,但是第一点不是已经可以实现这个功能了? 那ioremap还有存在的必要吗?
请高人讲解一下,或者提供链接,谢谢!
2、但是linux似乎还有一个ioremap的函数(没用过),据说它能够把实际的i/o地址映射到虚拟地址,进而通过虚拟地址读写I/O,但是第一点不是已经可以实现这个功能了? 那ioremap还有存在的必要吗?
请高人讲解一下,或者提供链接,谢谢!
|
linux 的内存映射分为动态和静态两种, x86 通常是动态映射的, arm 上的一部分硬件地址是直接通过静态映射,
所谓的静态映射只是在物理地址上加了一个偏移量。这些可以从 kernel的代码中得知。而动态映射则是用 ioremap
ioremap 的存在是非常有必要的, 静态映射需要在 linux 启动时候就映射好,
而ioremap 则在需要使用该硬件的时候才去映射,比如驱动作成模块形式,完全不需要去修改kernel 。
所谓的静态映射只是在物理地址上加了一个偏移量。这些可以从 kernel的代码中得知。而动态映射则是用 ioremap
ioremap 的存在是非常有必要的, 静态映射需要在 linux 启动时候就映射好,
而ioremap 则在需要使用该硬件的时候才去映射,比如驱动作成模块形式,完全不需要去修改kernel 。