#define S3C_ADDR_BASE (0xF4000000)
#define S3C_ADDR(x) ((void __iomem __force *)S3C_ADDR_BASE + (x))
S3C_ADDR (0x00500000)
#define S3C64XX_VA_GPIO S3C_ADDR(0x00500000)
#define S3C64XX_GPA_BASE (S3C64XX_VA_GPIO + 0x0000)
这样的话用了虚地址先别说,但是有的却是直接用了它的真正的物理地址来进行操作
也就是直接iowrite() ioread()
这样也能准确操作到对应的寄存器,真是不可思议,这样的话地址不就是有点乱吗?
8 个解决方案
#1
用户驱动中应该访问虚拟地址,内核将其翻译成物理地址;
两种情况下,使用的函数应该是不同的。
两种情况下,使用的函数应该是不同的。
#2
但是我看了很多模块,都是这样用,没有什么两样呀!
#3
Linux系统不太了解。
WinCE也有物理地址和虚拟地址,情况和Linux应该是相同的。
在Boot的最初阶段使用物理地址,在MMU启动配置好页面之后,开始使用虚拟地址。
驱动里面通常是使用虚拟地址,不过有的时候也会有直接用物理地址的情况。
不管是直接操作物理地址,还是使用虚拟地址,经过MMU翻译成物理地址,
最终操作的寄存器等等都是相同的。
WinCE也有物理地址和虚拟地址,情况和Linux应该是相同的。
在Boot的最初阶段使用物理地址,在MMU启动配置好页面之后,开始使用虚拟地址。
驱动里面通常是使用虚拟地址,不过有的时候也会有直接用物理地址的情况。
不管是直接操作物理地址,还是使用虚拟地址,经过MMU翻译成物理地址,
最终操作的寄存器等等都是相同的。
#4
6410有进行虚拟地址和物理地址的转换,注意每个对内存的操作后面都会跟一个虚拟物理转换函数
#5
#6
MMU是硬件实现的虚拟地址和物理地址的转换,#define S3C_ADDR_BASE (0xF4000000)地址与0x7F008000的偏差是初始化时MMU将物理地址重映射的到的一个虚拟地址而0xF4000000应该是重映射后GPACON的虚拟地址,而linux内核中的虚拟地址到物理地址的转换是由软件实现的。
ARM架构内核空间中虚拟地址和物理地址仅存在一个偏移量,而用户空间是通过分页机制由页表和页表项实现虚拟地址和物理地址转换的,这两种转换都由内核代码实现。
iowrite() ioread() 给这两个函数实参,也是个虚拟地址而非物理地址,这个地址在使用前是需要映射的(ioremap)从而建立了虚拟地址和物理地址的联系。
ARM架构内核空间中虚拟地址和物理地址仅存在一个偏移量,而用户空间是通过分页机制由页表和页表项实现虚拟地址和物理地址转换的,这两种转换都由内核代码实现。
iowrite() ioread() 给这两个函数实参,也是个虚拟地址而非物理地址,这个地址在使用前是需要映射的(ioremap)从而建立了虚拟地址和物理地址的联系。
#7
二、MMU的相关概念
——地址范围、虚拟地址映射为物理地址 以及 分页机制 任何时候,计算机上都存在一个程序能够产生的地址集合,我们称之为地址范围。这个范围的大小由CPU的位数决定,例如一个32位的CPU,它的地址范围是0~0xFFFFFFFF (4G),而对于一个64位的CPU,它的地址范围为0~0xFFFFFFFFFFFFFFFF (64T).这个范围就是我们的程序能够产生的地址范围,我们把这个地址范围称为虚拟地址空间,该空间中的某一个地址我们称之为虚拟地址。与虚拟地址空间和虚拟地址相对应的则是物理地址空间和物理地址,大多数时候我们的系统所具备的物理地址空间只是虚拟地址空间的一个子集。这里举一个最简单的例子直观地说明这两者,对于一台内存为256M的32bit x86主机来说,它的虚拟地址空间范围是0~0xFFFFFFFF(4G),而物理地址空间范围是0x000000000~0x0FFFFFFF(256M)。 在没有使用虚拟存储器的机器上,虚拟地址被直接送到内存总线上,使具有相同地址的物理存储器被读写;而在使用了虚拟存储器的情况下,虚拟地址不是被直接送到内存地址总线上,而是送到存储器管理单元MMU,把虚拟地址映射为物理地址。 大多数使用虚拟存储器的系统都使用一种称为分页(paging)机制。虚拟地址空间划分成称为页(page)的单位,而相应的物理地址空间也被进行划分,单位是页桢(frame).页和页桢的大小必须相同。在这个例子中我们有一台可以生成32位地址的机器,它的虚拟地址范围从0~0xFFFFFFFF(4G),而这台机器只有256M的物理地址,因此他可以运行4G的程序,但该程序不能一次性调入内存运行。这台机器必须有一个达到可以存放4G程序的外部存储器(例如磁盘或是FLASH),以保证程序片段在需要时可以被调用。在这个例子中,页的大小为4K,页桢大小与页相同——这点是必须保证的,因为内存和外围存储器之间的传输总是以页为单位的。对应4G的虚拟地址和256M的物理存储器,他们分别包含了1M个页和64K个页桢。 刚刚看了下mmu的概念
——地址范围、虚拟地址映射为物理地址 以及 分页机制 任何时候,计算机上都存在一个程序能够产生的地址集合,我们称之为地址范围。这个范围的大小由CPU的位数决定,例如一个32位的CPU,它的地址范围是0~0xFFFFFFFF (4G),而对于一个64位的CPU,它的地址范围为0~0xFFFFFFFFFFFFFFFF (64T).这个范围就是我们的程序能够产生的地址范围,我们把这个地址范围称为虚拟地址空间,该空间中的某一个地址我们称之为虚拟地址。与虚拟地址空间和虚拟地址相对应的则是物理地址空间和物理地址,大多数时候我们的系统所具备的物理地址空间只是虚拟地址空间的一个子集。这里举一个最简单的例子直观地说明这两者,对于一台内存为256M的32bit x86主机来说,它的虚拟地址空间范围是0~0xFFFFFFFF(4G),而物理地址空间范围是0x000000000~0x0FFFFFFF(256M)。 在没有使用虚拟存储器的机器上,虚拟地址被直接送到内存总线上,使具有相同地址的物理存储器被读写;而在使用了虚拟存储器的情况下,虚拟地址不是被直接送到内存地址总线上,而是送到存储器管理单元MMU,把虚拟地址映射为物理地址。 大多数使用虚拟存储器的系统都使用一种称为分页(paging)机制。虚拟地址空间划分成称为页(page)的单位,而相应的物理地址空间也被进行划分,单位是页桢(frame).页和页桢的大小必须相同。在这个例子中我们有一台可以生成32位地址的机器,它的虚拟地址范围从0~0xFFFFFFFF(4G),而这台机器只有256M的物理地址,因此他可以运行4G的程序,但该程序不能一次性调入内存运行。这台机器必须有一个达到可以存放4G程序的外部存储器(例如磁盘或是FLASH),以保证程序片段在需要时可以被调用。在这个例子中,页的大小为4K,页桢大小与页相同——这点是必须保证的,因为内存和外围存储器之间的传输总是以页为单位的。对应4G的虚拟地址和256M的物理存储器,他们分别包含了1M个页和64K个页桢。 刚刚看了下mmu的概念
#8
现代操作系统普遍采用虚拟内存管理(Virtual Memory Management)机制,这需要MMU(Memory Management Unit,内存管理单元)的支持。有些嵌入式处理器没有MMU,则不能运行依赖于虚拟内存管理的操作系统。本节简要介绍MMU的作用和操作系统的虚拟内存管理机制。
首先引入两个概念,虚拟地址和物理地址。如果处理器没有MMU,或者有MMU但没有启用,CPU执行单元发出的内存地址将直接传到芯片引脚上,被内存芯片(以下称为物理内存,以便与虚拟内存区分)接收,这称为物理地址(Physical Address,以下简称PA)。
如果处理器启用了MMU,CPU执行单元发出的内存地址将被MMU截获,从CPU到MMU的地址称为虚拟地址(Virtual Address,以下简称VA),而MMU将这个地址翻译成另一个地址发到CPU芯片的外部地址引脚上,也就是将虚拟地址映射成物理地址。
首先引入两个概念,虚拟地址和物理地址。如果处理器没有MMU,或者有MMU但没有启用,CPU执行单元发出的内存地址将直接传到芯片引脚上,被内存芯片(以下称为物理内存,以便与虚拟内存区分)接收,这称为物理地址(Physical Address,以下简称PA)。
如果处理器启用了MMU,CPU执行单元发出的内存地址将被MMU截获,从CPU到MMU的地址称为虚拟地址(Virtual Address,以下简称VA),而MMU将这个地址翻译成另一个地址发到CPU芯片的外部地址引脚上,也就是将虚拟地址映射成物理地址。
#1
用户驱动中应该访问虚拟地址,内核将其翻译成物理地址;
两种情况下,使用的函数应该是不同的。
两种情况下,使用的函数应该是不同的。
#2
但是我看了很多模块,都是这样用,没有什么两样呀!
#3
Linux系统不太了解。
WinCE也有物理地址和虚拟地址,情况和Linux应该是相同的。
在Boot的最初阶段使用物理地址,在MMU启动配置好页面之后,开始使用虚拟地址。
驱动里面通常是使用虚拟地址,不过有的时候也会有直接用物理地址的情况。
不管是直接操作物理地址,还是使用虚拟地址,经过MMU翻译成物理地址,
最终操作的寄存器等等都是相同的。
WinCE也有物理地址和虚拟地址,情况和Linux应该是相同的。
在Boot的最初阶段使用物理地址,在MMU启动配置好页面之后,开始使用虚拟地址。
驱动里面通常是使用虚拟地址,不过有的时候也会有直接用物理地址的情况。
不管是直接操作物理地址,还是使用虚拟地址,经过MMU翻译成物理地址,
最终操作的寄存器等等都是相同的。
#4
6410有进行虚拟地址和物理地址的转换,注意每个对内存的操作后面都会跟一个虚拟物理转换函数
#5
#6
MMU是硬件实现的虚拟地址和物理地址的转换,#define S3C_ADDR_BASE (0xF4000000)地址与0x7F008000的偏差是初始化时MMU将物理地址重映射的到的一个虚拟地址而0xF4000000应该是重映射后GPACON的虚拟地址,而linux内核中的虚拟地址到物理地址的转换是由软件实现的。
ARM架构内核空间中虚拟地址和物理地址仅存在一个偏移量,而用户空间是通过分页机制由页表和页表项实现虚拟地址和物理地址转换的,这两种转换都由内核代码实现。
iowrite() ioread() 给这两个函数实参,也是个虚拟地址而非物理地址,这个地址在使用前是需要映射的(ioremap)从而建立了虚拟地址和物理地址的联系。
ARM架构内核空间中虚拟地址和物理地址仅存在一个偏移量,而用户空间是通过分页机制由页表和页表项实现虚拟地址和物理地址转换的,这两种转换都由内核代码实现。
iowrite() ioread() 给这两个函数实参,也是个虚拟地址而非物理地址,这个地址在使用前是需要映射的(ioremap)从而建立了虚拟地址和物理地址的联系。
#7
二、MMU的相关概念
——地址范围、虚拟地址映射为物理地址 以及 分页机制 任何时候,计算机上都存在一个程序能够产生的地址集合,我们称之为地址范围。这个范围的大小由CPU的位数决定,例如一个32位的CPU,它的地址范围是0~0xFFFFFFFF (4G),而对于一个64位的CPU,它的地址范围为0~0xFFFFFFFFFFFFFFFF (64T).这个范围就是我们的程序能够产生的地址范围,我们把这个地址范围称为虚拟地址空间,该空间中的某一个地址我们称之为虚拟地址。与虚拟地址空间和虚拟地址相对应的则是物理地址空间和物理地址,大多数时候我们的系统所具备的物理地址空间只是虚拟地址空间的一个子集。这里举一个最简单的例子直观地说明这两者,对于一台内存为256M的32bit x86主机来说,它的虚拟地址空间范围是0~0xFFFFFFFF(4G),而物理地址空间范围是0x000000000~0x0FFFFFFF(256M)。 在没有使用虚拟存储器的机器上,虚拟地址被直接送到内存总线上,使具有相同地址的物理存储器被读写;而在使用了虚拟存储器的情况下,虚拟地址不是被直接送到内存地址总线上,而是送到存储器管理单元MMU,把虚拟地址映射为物理地址。 大多数使用虚拟存储器的系统都使用一种称为分页(paging)机制。虚拟地址空间划分成称为页(page)的单位,而相应的物理地址空间也被进行划分,单位是页桢(frame).页和页桢的大小必须相同。在这个例子中我们有一台可以生成32位地址的机器,它的虚拟地址范围从0~0xFFFFFFFF(4G),而这台机器只有256M的物理地址,因此他可以运行4G的程序,但该程序不能一次性调入内存运行。这台机器必须有一个达到可以存放4G程序的外部存储器(例如磁盘或是FLASH),以保证程序片段在需要时可以被调用。在这个例子中,页的大小为4K,页桢大小与页相同——这点是必须保证的,因为内存和外围存储器之间的传输总是以页为单位的。对应4G的虚拟地址和256M的物理存储器,他们分别包含了1M个页和64K个页桢。 刚刚看了下mmu的概念
——地址范围、虚拟地址映射为物理地址 以及 分页机制 任何时候,计算机上都存在一个程序能够产生的地址集合,我们称之为地址范围。这个范围的大小由CPU的位数决定,例如一个32位的CPU,它的地址范围是0~0xFFFFFFFF (4G),而对于一个64位的CPU,它的地址范围为0~0xFFFFFFFFFFFFFFFF (64T).这个范围就是我们的程序能够产生的地址范围,我们把这个地址范围称为虚拟地址空间,该空间中的某一个地址我们称之为虚拟地址。与虚拟地址空间和虚拟地址相对应的则是物理地址空间和物理地址,大多数时候我们的系统所具备的物理地址空间只是虚拟地址空间的一个子集。这里举一个最简单的例子直观地说明这两者,对于一台内存为256M的32bit x86主机来说,它的虚拟地址空间范围是0~0xFFFFFFFF(4G),而物理地址空间范围是0x000000000~0x0FFFFFFF(256M)。 在没有使用虚拟存储器的机器上,虚拟地址被直接送到内存总线上,使具有相同地址的物理存储器被读写;而在使用了虚拟存储器的情况下,虚拟地址不是被直接送到内存地址总线上,而是送到存储器管理单元MMU,把虚拟地址映射为物理地址。 大多数使用虚拟存储器的系统都使用一种称为分页(paging)机制。虚拟地址空间划分成称为页(page)的单位,而相应的物理地址空间也被进行划分,单位是页桢(frame).页和页桢的大小必须相同。在这个例子中我们有一台可以生成32位地址的机器,它的虚拟地址范围从0~0xFFFFFFFF(4G),而这台机器只有256M的物理地址,因此他可以运行4G的程序,但该程序不能一次性调入内存运行。这台机器必须有一个达到可以存放4G程序的外部存储器(例如磁盘或是FLASH),以保证程序片段在需要时可以被调用。在这个例子中,页的大小为4K,页桢大小与页相同——这点是必须保证的,因为内存和外围存储器之间的传输总是以页为单位的。对应4G的虚拟地址和256M的物理存储器,他们分别包含了1M个页和64K个页桢。 刚刚看了下mmu的概念
#8
现代操作系统普遍采用虚拟内存管理(Virtual Memory Management)机制,这需要MMU(Memory Management Unit,内存管理单元)的支持。有些嵌入式处理器没有MMU,则不能运行依赖于虚拟内存管理的操作系统。本节简要介绍MMU的作用和操作系统的虚拟内存管理机制。
首先引入两个概念,虚拟地址和物理地址。如果处理器没有MMU,或者有MMU但没有启用,CPU执行单元发出的内存地址将直接传到芯片引脚上,被内存芯片(以下称为物理内存,以便与虚拟内存区分)接收,这称为物理地址(Physical Address,以下简称PA)。
如果处理器启用了MMU,CPU执行单元发出的内存地址将被MMU截获,从CPU到MMU的地址称为虚拟地址(Virtual Address,以下简称VA),而MMU将这个地址翻译成另一个地址发到CPU芯片的外部地址引脚上,也就是将虚拟地址映射成物理地址。
首先引入两个概念,虚拟地址和物理地址。如果处理器没有MMU,或者有MMU但没有启用,CPU执行单元发出的内存地址将直接传到芯片引脚上,被内存芯片(以下称为物理内存,以便与虚拟内存区分)接收,这称为物理地址(Physical Address,以下简称PA)。
如果处理器启用了MMU,CPU执行单元发出的内存地址将被MMU截获,从CPU到MMU的地址称为虚拟地址(Virtual Address,以下简称VA),而MMU将这个地址翻译成另一个地址发到CPU芯片的外部地址引脚上,也就是将虚拟地址映射成物理地址。