Linux中采取的地点类型列表:

Linux中动用的地方类型列表:

【翻译】【linux设备驱动】linux地址类型,linux设备地址类型

Linux中应用的地方类型列表:

用户虚拟地址(User virtual addresses)

用户空间程序可知的平时地址。用户虚拟地址的长度为31位或六1多少人,信赖于底层的硬件系统框架结构,各样进度有它和谐的虚拟地址空间。

大体地址(Physical addresses)

总括机和系统内部存款和储蓄器之间选拔的地址。物理地址的尺寸为叁十二位或陆十几个人;三十位操作系统上有时也能够选拔过量叁拾2个人的情理地址(PAE)

总线地址(Bus addresses)

表面总线和系列内部存款和储蓄器之间接选举用的地址。日常总线地址和大体地址是同一的,但也不必然。有个别种类布局上,有三个IOMMU(IO
memory management
unit)将总线地址重映射为大体地址。IOMMU在无数气象下有协理,比如将散落的情理内部存款和储蓄注重映射成再三再四的总线地址,设备看起来总线地址是接连的。但那也拉动了额外的工作量,比如在DMA操作时,须要对IOMMU额外的编制程序(填写映射项)。当然,总线地址是和系统布局中度相关的。

水源逻辑地址(Kernel logical addresses)

【澳门金沙国际】linux设备地址类型,linux地址类型。基本逻辑地址组成了根本的常见地址空间。这几个地址映射部分或任何主存地址,而且平日被认为它们貌似便是情理地址。在抢先1/2种类架构上,逻辑地址和连锁的大体地址之间就只差了叁个定点的偏移量。逻辑地址的品种为硬件本地指针大小,因此,在三拾贰位重载的体系上,可能否访问具有的情理地址。逻辑地址的连串一般为unsigned
long可能void *。通过kmalloc分配出来的内部存款和储蓄器,地址类型为逻辑地址。

水源虚拟地址(Kernel virtual addresses)

基础虚拟地址和水源逻辑地址相似,因为它们正是基本空间地址向物理内部存款和储蓄器的投射。与基本逻辑地址不相同的是,内核虚拟地址在炫耀时,不必线性大概一对一映射成物理地址。全体的根本逻辑地址为根本虚拟地址,但为数不少内核虚拟地址却不是基本逻辑地址。比如vmalloc分配出来的内部存款和储蓄器为水源虚拟地址(但未间接照射为大体地址)。kmap函数重返的也是内核虚拟地址。内核虚拟地址常常储存在指针变量中。

 

宏__pa()(定义在<asm/page.h>)将基本逻辑地址转换到物理地址。宏__va()将物理地址转换回内核逻辑地址,但只针对低地址生效。

Linux中利用的地址类型列表: 用户虚拟地址(User virtual addresses)
用户空间程序…

要上学Java虚拟机,笔者觉着先要建立完全的知识系统,掌握部分操作系统内存管理方面包车型大巴学问:

  • 虚拟地址空间(virtual address space)
  • 澳门金沙国际,大体地址(physical address)
  • 逻辑地址(logical address)
  • 线性地址(linear address)
  • 虚拟地址(virtual address)
  • 用户空间&内核空间
  • 内部存款和储蓄器映射文件
    此处将逐一对那个概念举办叙述。

用户虚拟地址(User virtual addresses)

用户虚拟地址(User virtual addresses)

虚拟地址空间(virtual address space)

虚拟地址 vs 物理地址

澳门金沙国际 1

当代CPU都匡助多职务处理,各个进度运维在融洽的沙箱环境中,这几个沙箱正是虚拟地址空间(Virtual
Address
Space)。CPU读/写内部存款和储蓄器,都会选择虚拟地址。在33位的操作系统上,贰个指南针的大大小小是4字节,寻址能力是0x00000000
~ 0xFFFFFFFF(0~2^32 –
1),最大值即表示4GB大小的体积。在60个人的操作系统上,虚拟地址的申辩大小为2^64=16EB(1EB=1024
* 1024 *
1024GB),但实际上不会动用全64bit,以下落地点转换的本金,具体使用多少bit因CPU架构而异,x86架构平时是应用低48bit的VAS(256TB)。

利用虚拟地址的优势:

  • 各进度的虚拟地址相互隔断,不会相互影响。
  • 先后可以选用一文山会海相邻的虚拟地址来做客物理内部存款和储蓄器中不相邻的大内部存储器缓冲区。
  • 先后能够行使一密密麻麻虚拟地址来访问大于可用物理内部存款和储蓄器的内部存款和储蓄器缓冲区。当物理内存的供应量变小时,内部存款和储蓄器管理器会将物理内部存款和储蓄器页保存到磁盘文件。数据或代码页会依照供给在物理内存与磁盘之间活动。

用户空间程序可知的平时地址。用户虚拟地址的尺寸为叁16人或6二人,正视于底层的硬件系统架构,每一种进程有它和谐的虚拟地址空间。

用户空间程序可见的不以为奇地址。用户虚拟地址的长短为叁10位或陆10位,依赖于底层的硬件系统架构,每一种进程有它本身的虚拟地址空间。

各样地方(physical address|linear adress…)

此处引用天涯论坛上的1个作答Linux
线性地址,逻辑地址和虚拟地址的关联?,感觉讲的比较清楚:

在 速龙 平台下,逻辑地址(logical address)是 selector:offset
那种样式,selector 是 CS (code segment,代码段)寄存器的值,offset 是
EIP (instruction pointer,指令指针)寄存器的值。借使用 selector 去 GDT(
global (segment) descriptor table,全局段号记录表) 里获得 segment base
address(段基址) 然后增加offset(段内偏移),那就赢得了 linear
address。大家把这几个历程称作段式内存管理。
只要再把 linear address 切成四段,用前三段分别作为目录去PGD、PMD、Page
Table里查表,最后就会取得1个页表项(Page Table
Entry),那里边的值正是一页物理内存的苗子地址,把它丰裕 linear address
切分之后第肆段的剧情(又叫页内偏移)就获得了最终的 physical
address。大家把这些进度称作页式内部存款和储蓄器管理。
难点来了,为什么没涉及 virtual address,那是个什么样东西?其实在 英特尔IA-32
手册里并从未关系那些术语,但是在根本的确是用到了那些概念,比如__va和__pa那四个宏定义。看似神秘的
virtual address
究其本质便是先后里面使用的地点比如贰个指针值,指针的本质正是 EIP
寄存器里的值,说直白点,virtual address 正是 EIP
寄存器的值。你会意识大家地点说过,logical address 由 selector 和
offset 两部分构成,offset 也是 EIP 寄存器的值,所以结论为:logical
address 的 offset 就是 virtual address,它俩是一个事物。
既然搞领悟了 logical address 和 virtual address
的涉嫌,那么大家再来看下,linear address 和 virtual address
是什么关联。在上面讲到的段式内部存款和储蓄器管理中,Linux 内核会将 segment base
address(段基址)设成 0,于是就有 linear address = 0+offset,又因为
virtual address 正是 offset,所以算出的 linear address在数值上分外virtual
address,注意,是数值上万分,它们之间是差了段基址的,只可是段基址为 0
罢了。
网上海人民广播电视台大素材认为逻辑地址是虚拟地址的外号,其实它们不是一个事物。还有不少材料把线性地址作为虚拟地址的别称,其实它们也不是贰个东西,只是Linux在x86下将它们搞得数值相等而已,尽管值至极可是精神区别。

简单易行总括一下 intel x86_32架构内存寻址进程:

  • Linux简化了分段机制(将段基址设成0),使得虚拟地址和线性地址总是一样。
  • 逻辑地址–分段–线性地址(虚拟地址) –分页–物理地址

物理地址(Physical addresses)

大体地址(Physical addresses)

用户空间&内核空间

x86_32架构下,每种进程分配4G的虚拟地址空间,用户空间从0到3G(0xC0000000),内核空间占据3G到4G,各样进度能够透过系统调用进入基础,因而Linux内核空间由系统内的享有进度共享,而各类进程的用户空间是全然独立的。
基本空间是由基本负责映射,它并不会随之进度变化,是定位的,而用户空间对应进度,随着进度的切换而变化。
用户格局(user
mode)下运营的代码可以访问用户空间,但无法访问基本空间。此限制可预防用户形式代码读或更改受敬爱的操作系统数据结构。内核方式(kernel
mode)下运作的代码既能够访问用户空间,也得以访问基本空间。
intel cpu提供RING0 ~ 福睿斯ING3八种级其余运作方式(简称Murano0 ~
PRADO3),Kuga0级别最高,牧马人3级别最低。Linux使用奥迪Q53级别运营用户情势,帕杰罗0运维基本方式。君越3状态不可能访问途乐0的地址空间,包罗代码和数量。因而用户情势只可以通过系统调用切换来根本情势,在成就操作后再切换回用户格局

电脑和系统内部存储器之间利用的地方。物理地址的尺寸为33位或陆拾伍个人;三21个人操作系统上偶然也足以使用超越叁15人的情理地址(PAE)

电脑和种类内部存款和储蓄器之间选用的地点。物理地址的长短为30人或陆拾陆位;30个人操作系统上间或也能够使用超越叁12个人的物理地址(PAE)

内部存储器映射文件

I/O操作是调用操作系统提供的read()、write()系统调用函数实现对应操作的,调用时经过由用户态切换成内核态,将读到的多少缓存在根本空间的缓冲区中,再拷贝到用户空间中,由于内核会预读更加多的数量到缓冲区,因而下三次读操作恐怕是直接从基础缓冲区拷贝到用户空间,节省了2遍不行的磁盘I/O操作。
内部存款和储蓄器映射文件则不必要将数据先读到根本缓冲区,而是将用户空间中的一段地址空间区域与公事对象建立映射关系(由系统调用mmap()完毕)。在进程第贰次引用那段地址时,会触发缺页中断,并由刹车处理函数依照映射关系一贯将文件数量拷贝到用户空间。与日常I/O比较,少了把文件数量读到内核缓冲区这一步,由此内存映射文件的效用更高。

在JVM中有direct
memory(直接内部存款和储蓄器)那块区域,是调用native函数直接分配的堆外内部存款和储蓄器,然后在Java堆中通过二个DirectByteBuffer对象作为那块内部存款和储蓄器的引用,那样防止了Java堆和native堆之间来回拷贝数据。

总线地址(Bus addresses)

总线地址(Bus addresses)

表面总线和系统内存之间利用的地点。日常总线地址和大体地址是相同的,但也不必然。有个别系列布局上,有三个IOMMU(IO
memory management
unit)将总线地址重映射为大体地址。IOMMU在更仆难数光景下有援救,比如将分流的情理内部存款和储蓄注重映射成延续的总线地址,设备看起来总线地址是延续的。但那也拉动了附加的工作量,比如在DMA操作时,供给对IOMMU额外的编制程序(填写映射项)。当然,总线地址是和系统布局中度相关的。

表面总线和系统内部存款和储蓄器之间接选举择的地址。平日总线地址和大体地址是一模一样的,但也不必然。有个别种类布局上,有多个IOMMU(IO
memory management
unit)将总线地址重映射为大体地址。IOMMU在重重情景下有协助,比如将分散的大体内部存款和储蓄注重映射成三番五次的总线地址,设备看起来总线地址是再而三的。但这也带来了附加的工作量,比如在DMA操作时,需求对IOMMU额外的编制程序(填写映射项)。当然,总线地址是和体系布局中度相关的。

水源逻辑地址(Kernel logical addresses)

基本逻辑地址(Kernel logical addresses)

水源逻辑地址组成了水源的平凡地址空间。那几个地址映射部分或任何主存地址,而且平日被认为它们貌似正是物理地址。在大部分系统架构上,逻辑地址和血脉相通的大体地址之间就只差了3个一定的偏移量。逻辑地址的类型为硬件本地指针大小,因此,在33人重载的系统上,或许或无法访问具有的情理地址。逻辑地址的品种一般为unsigned
long也许void *。通过kmalloc分配出来的内部存款和储蓄器,地址类型为逻辑地址。

基础逻辑地址组成了水源的平日地址空间。那个地址映射部分或任何主存地址,而且常常被认为它们貌似便是大体地址。在大多数系统架构上,逻辑地址和连锁的情理地址之间就只差了1个稳定的偏移量。逻辑地址的项目为硬件本地指针大小,由此,在3四位重载的种类上,或许否访问具有的物理地址。逻辑地址的档次一般为unsigned
long只怕void *。通过kmalloc分配出来的内存,地址类型为逻辑地址。

基础虚拟地址(Kernel virtual addresses)

根本虚拟地址(Kernel virtual addresses)

基本虚拟地址和基本逻辑地址相似,因为它们便是基础空间地址向物理内部存款和储蓄器的映照。与根本逻辑地址分裂的是,内核虚拟地址在炫耀时,不必线性或然一对一映射成物理地址。全数的木本逻辑地址为根本虚拟地址,但许多根本虚拟地址却不是基本逻辑地址。比如vmalloc分配出来的内部存款和储蓄器为基石虚拟地址(但未直接照射为大体地址)。kmap函数重回的也是内核虚拟地址。内核虚拟地址常常储存在指针变量中。

基本虚拟地址和基本逻辑地址相似,因为它们便是水源空间地址向物理内部存款和储蓄器的照射。与基本逻辑地址不相同的是,内核虚拟地址在炫耀时,不必线性只怕一对一映射成物理地址。全部的木本逻辑地址为基本虚拟地址,但过多基石虚拟地址却不是基础逻辑地址。比如vmalloc分配出来的内部存款和储蓄器为水源虚拟地址(但未直接照射为大体地址)。kmap函数再次来到的也是内核虚拟地址。内核虚拟地址常常储存在指针变量中。

 

 

宏__pa()(定义在<asm/page.h>)将基本逻辑地址转换来物理地址。宏__va()将物理地址转换回内核逻辑地址,但只针对低地址生效。

宏__pa()(定义在<asm/page.h>)将根本逻辑地址转换来物理地址。宏__va()将大体地址转换回内核逻辑地址,但只针对低地址生效。

相关文章