为您找到与从ip地址到物理地址的映射相关的共200个结果:
端口映射主要用于建立web站点、Email、FTP 服务器等服务,还被用来在网络上设置公共服务,当外网用户想访问内网某台电脑时,就需要用到端口映射功能。今天读文网小编将给大家介绍金浪ESR-6400G路由器是如何进行端口映射的,希望对您有所帮助!
一、首先登陆金浪路由器,在左侧导航栏中选择端口映射菜单,出现设置页面。
(1)端口范围:您所定义的外网端口。
(2)映射端口方位:您所映射的内网服务器端口。
(3)服务器:空白默认为WAN 口IP 。
(4)映射服务器:内网的服务器IP 。
(5)协议:可以选择包括(TCP/UDP)。
按照对应顺序填好,点击保存,这样端口映射就完成了,例如你在192.168.0.98这台PC上架设了FTP 服务器,只需要做如上设置,就可以通过外网的IP 来访问192.168.0.98这台PC上的FTP 服务器。
二、IP地址映射
由于物理网络不能直接识别IP 地址,必须经过一定的转换才能将IP 地址映射为网络的物理地址。例如将外网的IP 地址(59.173.89.191)直接映射到内部服务器的IP地址(192.168.0.5)让外网用户可以充分利用内部网络的资源。
登陆金浪路由器,在左侧导航栏中选择IP地址映射菜单,出现设置页面。
(1)服务器IP 地址为外网的IP 地址。
(2)映射服务器填写的内网服务器IP 地址。
(3)最后点击保存,完成映射。
金浪ESR-6400G路由器的端口和IP地址映射讲完了,有需要的网友可以试着解决问题。
金浪路由器的相关
浏览量:2
下载量:0
时间:
当计算机使用过程中出现“计算机探测到IP地址与您的网卡物理地址发生冲突”的错误时,您就无法使用网络。读文网小编告诉您,此时,您可以做如下操作解决问题:
1 如果您使用的计算机的操作系统是:windows 98
点击左下角“开始”→“运行”,键入:winipcfg,点击“确定”,在弹出的窗口中,点击“全部释放”,然后点击“全部更新”,即可解决问题。
如果系统提示无法更新,则需要重新启动计算机。
2 如果您使用的计算机的操作系统是:windows 2000 或windows XP
点击左下角“开始”→“运行”,键入:ipconfig /release,点击“确定”,在此点击“开始”→“运行”,键入:ipconfig /renew,点击“确定”,即可解决问题。
网络互联
NNT流量网协是怎样实现的?网络互连设备,如以太网、分组交换网等,它们相互之间不能互通,不能互通的主要原因是因为它们所传送数据的基本单元(技术上称之为“帧”)的格式不同。IP协议实际上是一套由软件、程序组成的协议软件,它把各种不同“帧”统一转换成“网协数据包”格式,这种转换是因特网的一个最重要的特点,使所有各种计算机都能在因特网上实现互通,即具有“开放性”的特点。
数据包
那么,“数据包(data packet)”是什么?它又有什么特点呢?数据包也是分组交换的一种形式,就是把所传送的数据分段打成 “包”,再传送出去。但是,与传统的“连接型”分组交换不同,它属于“无连接型”,是把打成的每个“包”(分组)都作为一个“独立的报文”传送出去,所以叫做“数据包”。这样,在开始通信之前就不需要先连接好一条电路,各个数据包不一定都通过同一条路径传输,所以叫做“无连接型”。这一特点非常重要,它大大提高了网络的坚固性和安全性。
TCP/IP数据包格式每个数据包都有报头和报文这两个部分,报头中有目的地址等必要内容,使每个数据包不经过同样的路径都能准确地到达目的地。在目的地重新组合还原成原来发送的数据。这就要IP具有分组打包和集合组装的功能。
在传送过程中,数据包的长度为30000字节(Byte)(1字节=8二进制位)。
另外,特别注意的是,ip数据包指一个完整的ip信息,即ip数据包格式中各项的取值范围或规定,如版本号可以是4或者6,ip包头长度可以是20字节-60字节,总长度不超过65535字节,封装的上层协议可以是tcp和udp等。
浏览量:1
下载量:0
时间:
端口映射主要用于建立web站点、Email、FTP 服务器等服务,还被用来在网络上设置公共服务,当外网用户想访问内网某台电脑时,就需要用到端口映射功能。今天,读文网小编将给大家介绍金浪ESR-6400G路由器是如何进行端口映射的。
由于物理网络不能直接识别IP 地址,必须经过一定的转换才能将IP 地址映射为网络的物理地址。例如将外网的IP 地址(59.173.89.191)直接映射到内部服务器的IP地址(192.168.0.5)让外网用户可以充分利用内部网络的资源。
登陆金浪路由器,在左侧导航栏中选择IP地址映射菜单,出现设置页面。
(1)服务器IP 地址为外网的IP 地址。
(2)映射服务器填写的内网服务器IP 地址。
(3)最后点击保存,完成映射。
金浪ESR-6400G路由器的端口和IP地址映射讲完了,有需要的网友可以试着解决问题。
浏览量:2
下载量:0
时间:
linux虚拟地址怎么映射物理地址这个问题大家都想知道吧?下面读文网小编就给大家介绍下linux虚拟地址怎么映射物理地址的。
1. 虚拟空间(首先读文网小编必须要给大家介绍下什么是Linux操作系统的虚拟空间)
0-3G 用户空间 0x00000000 ~ 0xbfffffff
3-4G 内核空间 0xc0000000 ~ 0xffffffff
每个用户进程都有独立的用户空间(虚拟地址0-3),而内核空间是唯一的(相当于共享)
每个进程的用户空间用mm_struct描述,即task_struct.mm。
2.进程虚拟地址的组织
2.1 虚拟空间、用户空间
[cpp] view plaincopy
struct mm_struct {
struct vm_area_struct * mmap; /* list of VMAs */
...
pgd_t * pgd; //用于地址映射
atomic_t mm_users; /* How many users with user space? */
atomic_t mm_count; /* How many references to "struct mm_struct" (users count as 1) */
int map_count; /* number of VMAs */
...
//描述用户空间的段分布:数据段,代码段,堆栈段
unsigned long start_code, end_code, start_data, end_data;
unsigned long start_brk, brk, start_stack;
unsigned long arg_start, arg_end, env_start, env_end;
unsigned long rss, total_vm, locked_vm;
...
};
以上结构描述了进程的用户空间的结构,其中
pgd_t 是该进程用户空间地址映射到物理地址时使用
vm_area_struct 是进程用户空间已映射到物理空间的虚拟地址区间,mmap是该空间区块组成的链表。
虚拟空间的空洞:虚拟空间还未被映射的区块(即没有被使用),那么就没有vm_area_struct结构
2.2 内存区间
[cpp] view plaincopy
/*
* This struct defines a memory VMM memory area. There is one of these
* per VM-area/task. A VM area is any part of the process virtual memory
* space that has a special rule for the page-fault handlers (ie a shared
* library, the executable area etc).
*/
struct vm_area_struct {
struct mm_struct * vm_mm; /* VM area parameters */
unsigned long vm_start; //虚拟空间起始地址
unsigned long vm_end; //终止地址
/* linked list of VM areas per task, sorted by address */
struct vm_area_struct *vm_next;
//该区间的权限及标志
pgprot_t vm_page_prot;
unsigned long vm_flags;
//一些vm_area 的链接
...
struct vm_operations_struct * vm_ops;
unsigned long vm_pgoff; /* offset in PAGE_SIZE units, *not* PAGE_CACHE_SIZE */
struct file * vm_file; //用于将磁盘文件映射至用户空间
...
};
虚拟空间区间的描述中:
vm_start/vm_end 为该区块的起始和结束地址
vm_file 是在文件映射中使用到,即常用的mmap(fd,...)函数,简单说即将虚拟空间映射至文件在内核的缓冲区,那么这时候访问该虚拟空间将有别于pgd的映射。
vm_operations_struct 为本虚拟区间的操作,其中的nopage函数指针是处理内存缺页而使用的。对于通用的内存映射,该缺页处理函数为do_no_page()将虚拟地址映射到物理地址(匿名映射):分配物理页& 设置pgd & pte。
而对于mmap操作相关的虚拟地址,其缺页处理函数将和文件系统的缺页函数相关,filemap_nopage(),通过文件系统的缺页从磁盘将相关文件块加载如内核缓冲区.
[cpp] view plaincopy
struct vm_operations_struct {
void (*open)(struct vm_area_struct * area);
void (*close)(struct vm_area_struct * area);
struct page * (*nopage)(struct vm_area_struct * area, unsigned long address, int write_access); //缺页操作
};
3.系统物理地址的组织
内核将物理地址按页来组织,struct page描述系统的物理页的信息,但是页的数据内容是不在该结构中的。系统有全局数据 struct page mem_map[],用于记录每个物理页。
页面大小为4kb,在源码中用体现为(PAGE_SHIFT = 12)
[cpp] view plaincopy
/*
* Try to keep the most commonly accessed fields in single cache lines
* here (16 bytes or greater). This ordering should be particularly
* beneficial on 32-bit processors.
*
* The first line is data used in page cache lookup, the second line
* is used for linear searches (eg. clock algorithm scans).
*/
typedef struct page {
struct list_head list;
struct address_space *mapping;
unsigned long index;
struct page *next_hash;
atomic_t count;
unsigned long flags; /* atomic flags, some possibly updated asynchronously */
struct list_head lru;
unsigned long age;
wait_queue_head_t wait;
struct page **pprev_hash;
struct buffer_head * buffers;
void *virtual; /* non-NULL if kmapped */
struct zone_struct *zone;
} mem_map_t;
struct page是用于描述一个物理页面,该结构仅仅是作为描述,也就是说该页面的4kb数据时存储于某个连续的4kb的物理空间(由MMU决定,具体见下文)。其中:
lru 页面缓冲的调度策略(最少使用优先)
题外话:
page也可以用于文件缓冲,相关参数及作用:
buffer_head 是和设备文件相关的操作,例如在文件系统中,file的一个page有4个块,这些块就存储于buffer_head链表指定的内存中。
index 在文件系统中是用于file缓冲的页号。
3.1 用户空间页面目录(映射关系)
进程的虚拟空间描述中,pgd是用于页式存储的映射使用。当内核发生进程切换时,将新进程的pgd载入CR3寄存器,CPU中的MMU单元依据CR3寄存器进行页面映射。
pgd,pmd和pte可以看做是数组,为进程的地址空间到物理空间实现映射。其中虚拟地址的高位地址决定pgd,中间段地址决定pmd,而低位地址决定pte,pte是“page table entry”。
最终定位的pte中存放的即为对应物理页面的指针。[cpp] view plaincopy
typedef struct { unsigned long pte; } pte_t;
typedef struct { unsigned long pmd; } pmd_t;
typedef struct { unsigned long pgd; } pgd_t;
typedef struct { unsigned long pgprot; } pgprot_t; //操作标志
3.2用户空间的映射:
1. 用户空间的虚拟地址vaddr通过MMU(pgd,pmd,pte)找到对应的页表项x(即为物理地址)
2. 页表项x的高20位是物理也好,物理页号index = x >> PAGE_SHIFT, 同理,index后面补上12个0就是物理页表的首地址。
3. 通过物理页号,我们可以再内核中找到该物理页的描述的指针mem_map[index],当然这个指针是虚拟地址,page结构见上文。
3.3内核空间虚拟地址的映射:
内核空间与物理地址之间有直接的映射关系,而不需要向用户空间那样通过mmu(pgd)。系统空间映射(3G开始)到物理空间0G起始:
例如:
系统内核映像载入的虚拟地址为3G+1M的起始地址,那么对应的物理地址为1M。
紧接着分配在3G+2M开始分配了8M的虚拟地址(物理地址为2-9M)用于PDG
之后预留了16M空间用DMA于存储。
而全局的page结构的mem_page[]数组是在0xc1000000开始的。
所以内核空间虚拟地址到物理地址的转换为:
[cpp] view plaincopy
PAGE_OFFSET = 3GB
vitr_to_phys(kadd)
return vadd - PAGE_OFFSET
内核空间的虚拟地址vaddr是通过如下方式找到它对应物理地址的page结构:
vitr_to_page(vadd)
index = virt_to_phys(kadd) >> PAGE_SHIFT
return mem_map[index]
4. 相关数据结构关系图
说明:
1. 黑色+红色 箭头展示了虚拟地址空间到物理空间的映射关系
2. 蓝色箭头涉涉及到文件的映射操作mmap(),相比匿名映射,文件映射多了文件层的磁盘IO。
浏览量:2
下载量:0
时间:
如何利用路由器的映射功能,把局域网的内网IP映射到外网,使得外网的电脑能够通过远程桌面访问他的互联网IP从而访问到该机器。打个比方,读文网小编的机器本地ip是“192.168.0.123”外网IP是“36.121.211.11”,因为本地除了123在用这个外网ip外还有好多机器,诸如“124”“125”等,那么我们通过对路由器设置映射,把远程桌面的端口(默认3389)和本地某台电脑的IP映射到路由器上,这样控制电脑就能从互联网上通过外网IP找到这台电脑了,下面是读文网小编的详细操作!
先打开路由器控制页面,地址是http://192.168.0.1(根据自己家的实际情况),输入账号密码,如果没有修改一般都是admin,或者guest。(根据自己家的实际情况)。
这里我先说明下,有一部分特别基础的路由器,没有“映射IP”这个功能,但是大多数路由都是有的,建议买的时候一定买这种功能的,现在我就用我的讲解了,但凡都大同小异,如图选择“高级选项”。
“高级选项”里有个“端口映射”功能,点击“添加新规则”。按照图中的设置,分别在映射端口和内网IP填写自己的详细资料,IP一定要填本机本地IP,前面讲过,至于端口就按图上填吗,3389是远程桌面的默认端口,这样设置你访问的时候不需要在后面添加端口号了,如果是控制局域网里很多电脑可以自己分配设置,研究下哈。
在登陆局域网本机前,得先知道本机的外网IP,用IP138就能轻易知道了,如图
找到本机外网IP地址之后,在外网电脑用远程桌面登陆本机的外网IP,就可以直接登陆内网的机器了。
浏览量:2
下载量:0
时间:
MAC(Media Access Control或者Medium Access Control)地址,意译为媒体访问控制,或称为物理地址、硬件地址,用来定义网络设备的位置。今天读文网小编给大家介绍一下物理地址与虚拟地址的映射吧。供大家参考!
参考如下
一般情况下,Linux系统中,进程的4GB内存空间被划分成为两个部分------用户空间和内核空间,大小分别为0~3G,3~4G。
用户进程通常情况下,只能访问用户空间的虚拟地址,不能访问到内核空间。
每个进程的用户空间都是完全独立、互不相干的,用户进程各自有不同的页表。而内核空间是由内核负责映射,它并不会跟着进程改变,是固定的。内核空间地址有自己对应的页表,内核的虚拟空间独立于其他程序。
3~4G之间的内核空间中,从低地址到高地址依次为:物理内存映射区—隔离带—vmalloc虚拟内存分配区—隔离带—高端内存映射区—专用页面映射区—保留区。
【内核空间内存动态申请】
主要包括三个函数:kmalloc(), __get_free_pages, vmalloc。
kmalloc(), __get_free_pages申请的内存位于物理地址映射区,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因此存在较简单的转换关系。而vmalloc申请的内存位于vmalloc虚拟内存分配区(这些区都是以线性地址为度量),它在虚拟内存空间给出一块连续的内存区,实质上,这片连续的虚拟内存在物理内存中并不一定连续,而vmalloc申请的虚拟内存和物理内存之间也没有简单的换算关系。
因为vmalloc申请的在虚拟内存空间连续的内存区在物理内存中并不一定连续,可以想象为了完成vmalloc,新的页表需要被建立,因此,知识调用vmalloc来分配少量内存是不妥的。
一般来讲,kmalloc用来分配小于128K的内存,而更大的内存块需要用vmalloc来实现。
【虚拟地址与物理地址关系】
对于内核物理内存映射区的虚拟内存(用kmalloc(), __get_free_pages申请的),使用virt_to_phys()和phys_to_virt()来实现物理地址和内核虚拟地址之间的互相转换。它实际上,仅仅做了3G的地址移位。
上述方法适用于常规内存(内核物理内存映射区),高端内存的虚拟地址与物理地址之间不存在如此简单的换算关系。因为它涉及到了分离物理页的页表控制机制。
【ioremap】
在ARM中,设备的寄存器或者存储块的这部分空间属于内存空间的一部分,我们称之为IO内存。
在内核中访问IO内存之前,我们只有IO内存的物理地址,这样是无法通过软件直接访问的,需要首先用ioremap()函数将设备所处的物理地址映射到内核虚拟地址空间(3GB~4GB)。然后,才能根据映射所得到的内核虚拟地址范围,通过访问指令访问这些IO内存资源。
在将I/O内存资源的物理地址映射成核心虚地址后,理论上讲我们就可以象读写RAM那样直接读写I/O内存资源了。为了保证驱动程序的跨平台的可移植性,我们应该使用Linux中特定的函数来访问I/O内存资源,而不应该通过指向核心虚地址的指针来访问。
【mmap】
用mmap映射一个设备,意味着使用户空间的一段地址关联到设备内存上,这使得只要程序在分配的地址范围内进行读取或者写入,实际上就是对设备的访问。这种数据传输是直接的,不需要用到内核空间作为数据转移的中间站。
remap_page_range函数的功能是构造用于映射一段物理地址的新页表,实现了内核空间与用户空间的映射。
在内核驱动程序的初始化阶段,通过ioremap()将物理地址映射到内核虚拟空间;在驱动程序的mmap系统调用中,使用remap_page_range()将该块ROM映射到用户虚拟空间。这样内核空间和用户空间都能访问这段被映射后的虚拟地址。
Ioremap:
进程空间ç内核空间çIO内存
其中,后面两个指的是同一段物理内存区域,只是一个为虚拟地址,一个为物理地址。进程空间和内核空间对应着不同的物理地址,它们之间的数据传递,是实际的数据的拷贝。
Mmap:
进程空间çIO内存
其中,进程空间mmap得到的那段虚拟地址跟IO内存对应着同一段物理地址。这个过程没有额外的数据中转,读写都直接针对硬件的物理地址进行。
一般来讲,小数据量的传输用ioremap()就足够了,
【IO内存的一般访问方法】
1. 首先是调用request_mem_region()申请资源,即告诉内核,本驱动正在使用这段物理内存,其他驱动不得访问它们。在设备驱动模块加载或open()函数中进行。
2. 接着讲寄存器地址通过ioremap()映射到内核空间虚拟地址,之后就可以通过Linux设备访问编程接口访问这些设备的寄存器了。在设备驱动初始化、write(),read(),ioctl()函数中进行。
3. 访问完成之后,应对ioremap()申请的虚拟地址进行释放,并释放release_mem_region()申请的IO内存资源。在设备驱动模块卸载或release()函数中进行。
读文网小编介绍了物理地址虚拟地址映射的相关知识,希望你喜欢。
浏览量:2
下载量:0
时间:
通过路由器管理网络,是很方便的,但是必须设置好,否则管理起来也很累的。那么tplink如何绑定固定ip和物理地址?读文网小编整理了tplink如何绑定固定ip和物理地址的相关方法,有需要的可以收藏一下。
需要有路由器的设置权限,有了权限解除绑定或者加大上网上限流量即可。设置步骤如下:
①首先要知道自己的客户端(可以是电脑、手机等设备)设备的MAC地址(唯一)。开始→运行→输入:CMD 点击确定(或按回车键),打开命令提示符窗口。
②然后再在命令提示符窗口中输入:ipconfig /all →(按回车键执行命令)
③在弹出的讯息中,找到相应的设备(有线还是无线)的物理地址(12位数字)这就是网卡的MAC地址(唯一)。
④然后,再在浏览器的地址栏输入登录路由器的IP地址(通常在路由器的背面有IP地址),进入设置界面。
⑤通常默认的登陆用户名和密码(路由器背面有提示)都是admin→确定。
⑥进入路由器的设置界面→IP和MAC绑定。
⑦点击启用→保存,之后创建的规则才会生效(看红色文字的说明)。
⑧开启绑定MAC功能之后,再点击 增加单个条目。
⑨按照之前获得的设备MAC地址,填入路由器绑定的MAC地址之中→保存即可。
⑩如有提示:MAC地址字符串长度不够!,说明填写出错,两位数字之间要有一个减号(可以参考命令提示符的显示填写)。
⑪绑定成功自动跳转。勿忘点击一下网页,成功打开网页,说明绑定成功,否则说明MAC地址没有填写正确等错误,重新填写、设置。
看过“ tplink如何绑定固定ip和物理地址 ”
浏览量:0
下载量:0
时间:
读文网小编整理了虚拟地址空间映射到物理地址空间的相关资料。供大家参考!
诸如 Notepad.exe 和 MyApp.exe 的进程在用户模式下运行。核心操作系统组件和多个驱动程序在更有特权的内核模式下运行。有关处理器模式的详细信息,请参阅用户模式和内核模式。每个用户模式进程都有其各自的专用虚拟地址空间,但在内核模式下运行的所有代码都共享称为“系统空间”的单个虚拟地址空间。当前用户模式进程的虚拟地址空间称为“用户空间”。
在 32 位 Windows 中,可用的虚拟地址空间共计为 2^32 字节(4 GB)。通常较下的 2 GB 用于用户空间,较上的 2 GB 用于系统空间。
在 32 位 Windows 中,你可以指定(在启动时)超过 2 GB 用于用户空间。结果是系统空间可用的虚拟地址更少。可以将用户空间的大小增至 3 GB,在这种情形下系统空间仅有 1 GB。若要增大用户空间的大小,请使用 BCDEdit /set increaseuserva。
在 64 位 Windows 中,虚拟地址空间的理论大小为 2^64 字节(16 百亿亿字节),但实际上仅使用 16 百亿亿字节范围的一小部分。范围从 0x000'00000000 至 0x7FF'FFFFFFFF 的 8 TB 用于用户空间,范围从 0xFFFF0800'00000000 至 0xFFFFFFFF'FFFFFFFF 的 248 TB 的部分用于系统空间。
用户模式下运行的代码可以访问用户空间,但不能访问系统空间。此限制可防止用户模式代码读或更改受保护的操作系统数据结构。内核模式下运行的代码既可以访问用户空间,也可以访问系统空间。即,在内核模式下运行的代码可以访问系统空间和当前用户模式进程的虚拟地址空间。
在内核模式下运行的驱动程序必须在直接从用户空间地址中读取或写入这些地址时非常小心。此方案说明了原因。
用户模式程序发起从设备读取某些数据的请求。程序提供缓冲区的起始地址以接收数据。
在内核模式下运行的设备驱动程序例程启动读取操作并将控制权返回到其调用程序。
然后,设备中断了当前运行的任何线程以显示读取操作完成。 中断由在此任意线程上运行的内核模式驱动程序例程进行处理,该例程属于任意进程。
此时,驱动程序不得将数据写入用户模式程序在步骤 1 中提供的开始地址。此地址位于发起请求的进程的虚拟地址空间,该进程可能很大程度上不同于当前进程。
虚拟地址(Virtual Address Space)
Win32通过一个两层的表结构来实现地址映射,因为每个进程都拥有私有的4G的虚拟内存空间,相应的,每个进程都有自己的层次表结构来实现其地址映射。
第一层称为页目录,实际就是一个内存页,Win32的内存页有4KB大小,这个内存页以4个字节分为1024项,每一项称为“页目录项”(PDE);
第二层称为页表,这一层共有1024个页表,页表结构与页目录相似,每个页表也都是一个内存页,这个内存页以4KB的大小被分为1024项,页表的每一项被称为页表项(PTE),易知共有1024×1024个页表项。每一个页表项对应一个物理内存中的某一个“内存页”,即共有1024×1024个物理内存页,每个物理内存页为4KB,这样就可以索引到4G大小的虚拟物理内存。
如下图所示(注下图中的页目录项的大小应该是4个字节,而不是4kB):
Win32提供了4GB大小的虚拟地址空间。因此每个虚拟地址都是一个32位的整数值,也就是我们平时所说的指针,即指针的大小为4B。它由三部分组成,如下图:
这三个部分的第一部分,即前10位为页目录下标,用来寻址页目录项,页目录项刚好1024个。找到页目录项后,找对页目录项对应的的页表。第二部分则是用来在页表内寻址,用来找到页表项,共有1024个页表项,通过页表项找到物理内存页。第三部分用来在物理内存页中找到对应的字节,一个页的大小是4KB,12位刚好可以满足寻址要求。
具体的例子:
假设一个线程正在访问一个指针(Win32的指针指的就是虚拟地址)指向的数据,此指针指为0x2A8E317F,下图表示了这一个过程:
0x2A8E317F的二进制写法为0010101010_0011100011_000101111111,为了方便我们把它分为三个部分。
首先按照0010101010寻址,找到页目录项。因为一个页目录项为4KB,那么先将0010101010左移两位,001010101000(0x2A8),用此下标找到页目录项,然后根据此页目录项定位到下一层的某个页表。
然后按照0011100011寻址,在上一步找到页表中寻找页表项。寻址方法与上述方法类似。找到页表项后,就可以找到对应的物理内存页。
最后按照000101111111寻址,寻找页内偏移。
上面的假设的是此数据已在物理内存中,其实判断访问的数据是否在内存中也是在地址映射过程中完成的。Win32系统总是假设数据已在物理内存中,并进行地址映射。页表项中有一位标志位,用来标识包含此数据的页是否在物理内存中,如果在的话,就直接做地址映射,否则,抛出缺页中断,此时页表项也可标识包含此数据的页是否在调页文件中(外存),如果不在则访问违例,程序将会退出,如果在,页表项会查出此数据页在哪个调页文件中,然后将此数据页调入物理内存,再继续进行地址映射。为了实现每个进程拥有私有4G的虚拟地址空间,也就是说每个进程都拥有自己的页目录和页表结构,对不同进程而言,即使是相同的指针(虚拟地址)被不同的进程映射到的物理地址也是不同的,这也意味着在进程之间传递指针是没有意义的。
看过“虚拟地址空间映射到物理地址空间 ”
浏览量:2
下载量:0
时间:
最近不少朋友问到关于IP地址和物理地址有什么区别这样的问题,那么IP地址和物理地址有什么区别呢?读文网小编整理了物理地址的相关资料,下面大家跟着读文网小编一起去了解一下吧。
对于数量不多的几台机器,我们可以这样获取MAC地址:在Windows 98/Me中,依次单击“开始”→“运行” →输入“winipcfg”→回车。即可看到MAC地址。
在Windows 2000/XP中,依次单击“开始”→“运行”→输入“CMD”→回车→输入“ipconfig /all”→回车。即可看到MAC地址
看过“ IP地址和物理地址有什么区别”
浏览量:3
下载量:0
时间:
有时候我们在上网的时候需要把自己的mac地址和ip地址帮顶起来,可是不少朋友对于怎么将自己ip与物理地址的绑定方法不甚了解,下面跟着读文网小编一起来了解一下吧。
在开始菜单中,点击运行。或者你可以按下组合键win+r,打开运行
在对话框中输入cmd,打开命令
输入arp -a,然后按下回车键
接着你看到如下的信息,就录下下图中internet地址和物理地址
arp -s ip地址 物理地址。其中ip地址和物理地址就是你上面记录下来的两个地址。这样就实现了绑定。
6如果你要解除绑定,你可以输入:arp -d ip地址 物理地址
看过“ 如何绑定ip与物理地址 ”
浏览量:3
下载量:0
时间:
MAC地址也叫物理地址、硬件地址或链路地址,由网络设备制造商生产时写在硬件内部。这个地址与网络无关,也即无论将带有这个地址的硬件(如网卡、集线器、路由器等)接入到网络的何处,它都有相同的MAC地址,MAC地址一般不可改变,不能由用户自己设定。大家知道怎么查看电脑上的mac地址吗?小编为大家分享了查看电脑ip地址和MAC物理地址的方法,下面大家跟着读文网小编一起来了解一下吧。
点击右下角的电脑小标志进入本地连接状态
2 点击“支持”,选择详细信息,即可查看本机的IP地址和Mac地址码
浏览量:4
下载量:0
时间:
为了保证CPU执行指令时可正确访问存储单元,需将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址,这一过程称为地址映射。那么物理地址映射是什么呢?下面大家跟着读文网小编一起来了解一下吧。
一般情况下,Linux系统中,进程的4GB内存空间被划分成为两个部分------用户空间和内核空间,大小分别为0~3G,3~4G。
用户进程通常情况下,只能访问用户空间的虚拟地址,不能访问到内核空间。
每个进程的用户空间都是完全独立、互不相干的,用户进程各自有不同的页表。而内核空间是由内核负责映射,它并不会跟着进程改变,是固定的。内核空间地址有自己对应的页表,内核的虚拟空间独立于其他程序。
3~4G之间的内核空间中,从低地址到高地址依次为:物理内存映射区—隔离带—vmalloc虚拟内存分配区—隔离带—高端内存映射区—专用页面映射区—保留区。
【内核空间内存动态申请】
主要包括三个函数:kmalloc(), __get_free_pages, vmalloc。
kmalloc(), __get_free_pages申请的内存位于物理地址映射区,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因此存在较简单的转换关系。而vmalloc申请的内存位于vmalloc虚拟内存分配区(这些区都是以线性地址为度量),它在虚拟内存空间给出一块连续的内存区,实质上,这片连续的虚拟内存在物理内存中并不一定连续,而vmalloc申请的虚拟内存和物理内存之间也没有简单的换算关系。
因为vmalloc申请的在虚拟内存空间连续的内存区在物理内存中并不一定连续,可以想象为了完成vmalloc,新的页表需要被建立,因此,知识调用vmalloc来分配少量内存是不妥的。
一般来讲,kmalloc用来分配小于128K的内存,而更大的内存块需要用vmalloc来实现。
【虚拟地址与物理地址关系】
对于内核物理内存映射区的虚拟内存(用kmalloc(), __get_free_pages申请的),使用virt_to_phys()和phys_to_virt()来实现物理地址和内核虚拟地址之间的互相转换。它实际上,仅仅做了3G的地址移位。
上述方法适用于常规内存(内核物理内存映射区),高端内存的虚拟地址与物理地址之间不存在如此简单的换算关系。因为它涉及到了分离物理页的页表控制机制。
【ioremap】
在ARM中,设备的寄存器或者存储块的这部分空间属于内存空间的一部分,我们称之为IO内存。
在内核中访问IO内存之前,我们只有IO内存的物理地址,这样是无法通过软件直接访问的,需要首先用ioremap()函数将设备所处的物理地址映射到内核虚拟地址空间(3GB~4GB)。然后,才能根据映射所得到的内核虚拟地址范围,通过访问指令访问这些IO内存资源。
在将I/O内存资源的物理地址映射成核心虚地址后,理论上讲我们就可以象读写RAM那样直接读写I/O内存资源了。为了保证驱动程序的跨平台的可移植性,我们应该使用Linux中特定的函数来访问I/O内存资源,而不应该通过指向核心虚地址的指针来访问。
【mmap】
用mmap映射一个设备,意味着使用户空间的一段地址关联到设备内存上,这使得只要程序在分配的地址范围内进行读取或者写入,实际上就是对设备的访问。这种数据传输是直接的,不需要用到内核空间作为数据转移的中间站。
remap_page_range函数的功能是构造用于映射一段物理地址的新页表,实现了内核空间与用户空间的映射。
在内核驱动程序的初始化阶段,通过ioremap()将物理地址映射到内核虚拟空间;在驱动程序的mmap系统调用中,使用remap_page_range()将该块ROM映射到用户虚拟空间。这样内核空间和用户空间都能访问这段被映射后的虚拟地址。
Ioremap:
进程空间ç内核空间çIO内存
其中,后面两个指的是同一段物理内存区域,只是一个为虚拟地址,一个为物理地址。进程空间和内核空间对应着不同的物理地址,它们之间的数据传递,是实际的数据的拷贝。
Mmap:
进程空间çIO内存
其中,进程空间mmap得到的那段虚拟地址跟IO内存对应着同一段物理地址。这个过程没有额外的数据中转,读写都直接针对硬件的物理地址进行。
一般来讲,小数据量的传输用ioremap()就足够了,
【IO内存的一般访问方法】
1. 首先是调用request_mem_region()申请资源,即告诉内核,本驱动正在使用这段物理内存,其他驱动不得访问它们。在设备驱动模块加载或open()函数中进行。
2. 接着讲寄存器地址通过ioremap()映射到内核空间虚拟地址,之后就可以通过Linux设备访问编程接口访问这些设备的寄存器了。在设备驱动初始化、write(),read(),ioctl()函数中进行。
3. 访问完成之后,应对ioremap()申请的虚拟地址进行释放,并释放release_mem_region()申请的IO内存资源。在设备驱动模块卸载或release()函数中进行。
看过“ 物理地址映射是什么 ”
浏览量:2
下载量:0
时间:
IP地址与物理地址怎么转换?对于这个问题,相信网管们都会说很简单,不过我们小白朋友不知道啊,那么IP地址与物理地址怎么转换呢?今天读文网小编与大家分享下IP地址与物理地址转换的解决方法,有兴趣的朋友不妨了解下。
为什么要将IP段地址转化成数字地址?
根据TCP/IP协议规定,IP地址是由32位二进制数组成,而且在INTERNET范围内是唯一的。例如,某台联在因特网上的计算机的IP地址为:
11010010 01001001 10001100 00000010
很明显,这些数字对于人来说不太好记忆。人们为了方便记忆,就将组成计算机的IP地址的32位二进制分成四段,每段8位,中间用小数点隔开,然后将每八位二进制转换成十进制数,这样上述计算机的IP地址就变成了:118.123.15.102。
由于在同一个区域里,IP段都是很相近的,如果拿IP段(118.123.15.102)直接进行比较,在操作上很是麻烦,而且数据的存储也不易实现,所以才会把IP转换成数字地址,再来确定IP段的物理地址。
理解了IP的概念之后,诸如IP(118.123.15.102)怎样转换成数字地址呢?
IP本是32为二进制,为了方便记忆才转化成了四段十进制,所以只要把IP还原成二进制,再转换成十进制就可以得到IP的数字地址。
.NET C# IP与数字地址相互转化:
//IP转换成数字地址
public static uint IPToInt(string ipAddress)
{
string disjunctiveStr = ".,: ";
char[] delimiter = disjunctiveStr.ToCharArray();
string[] startIP = null;
for (int i = 1; i <= 5; i++)
{
startIP = ipAddress.Split(delimiter, i);
}
string a1 = startIP[0].ToString();
string a2 = startIP[1].ToString();
string a3 = startIP[2].ToString();
string a4 = startIP[3].ToString();
uint U1 = uint.Parse(a1);
uint U2 = uint.Parse(a2);
uint U3 = uint.Parse(a3);
uint U4 = uint.Parse(a4);
uint U = U1 << 24;
U += U2 << 16;
U += U3 << 8;
U += U4;
return U;
}
//数字地址转换成IP
public static string IntToIP(uint ipAddress)
{
long ui1 = ipAddress & 0xFF000000;
ui1 = ui1 >> 24;
long ui2 = ipAddress & 0x00FF0000;
ui2 = ui2 >> 16;
long ui3 = ipAddress & 0x0000FF00;
ui3 = ui3 >> 8;
long ui4 = ipAddress & 0x000000FF;
string IPstr = "";
IPstr = System.Convert.ToString(ui1) + "."
+ System.Convert.ToString(ui2) + "."
+ System.Convert.ToString(ui3)
+ "." + System.Convert.ToString(ui4);
return IPstr;
}
转换成数字地址以后是不是查询起来很是方便,只要介于某个IP段,就可以找出具体的物理地址了。当然,前提是有个巨大的IP库。手头上还有一个IP库,大概有36W+的记录。
IP段转换成真实的物理地址可以用在什么地方?
用途有很多啦,
1、比如流量统计啦,
2、I/M聊天工具里的地理位置显示啦,网页上的地理位置显示啦,
3、门户网站有诸多城市区分的,会根据访问者IP来判断访客应该去访问哪个城市的网站板块,
4、有的天气预报网站,默认的就是访客所在的城市。
看过“IP地址与物理地址怎么转换”
浏览量:3
下载量:0
时间:
每个进程都是独立的虚拟地址空间,两个独立进程的相同地址互不干扰,但是在物理上对每个进程可能也就分了一部分空间给了某个进程,所以中间就要用到映射,那么虚拟地址与物理地址怎么映射呢?今天读文网小编与大家分享下虚拟地址与物理地址映射的具体操作步骤,有需要的朋友不妨了解下。
虚拟地址与物理地址映射过程
这里只谈分页管理的机制,也是目前最重要的内存管理机制。
最初的设计想法:
结构图如下:
页的尺寸是4KB,虚拟地址的前20位用于指定一个物理页,后12位用于访问页内偏移。
页表项的结构:
各个位的含义:
P--位0是存在(Present)标志,用于指明表项对地址转换是否有效。P=1表示有效;P=0表示无效。在页转换过程中,如果说涉及的页目录或页表的表项无效,则会导致一个异常。如果P=0,那么除表示表项无效外,其余位可供程序自由使用,如图4-18b所示。例如,操作系统可以使用这些位来保存已存储在磁盘上的页面的序号。
R/W--位1是读/写(Read/Write)标志。如果等于1,表示页面可以被读、写或执行。如果为0,表示页面只读或可执行。当处理器运行在超级用户特权级(级别0、1或2)时,则R/W位不起作用。页目录项中的R/W位对其所映射的所有页面起作用。
U/S--位2是用户/超级用户(User/Supervisor)标志。如果为1,那么运行在任何特权级上的程序都可以访问该页面。如果为0,那么页面只能被运行在超级用户特权级(0、1或2)上的程序访问。页目录项中的U/S位对其所映射的所有页面起作用。
A--位5是已访问(Accessed)标志。当处理器访问页表项映射的页面时,页表表项的这个标志就会被置为1。当处理器访问页目录表项映射的任何页面时,页目录表项的这个标志就会被置为1。处理器只负责设置该标志,操作系统可通过定期地复位该标志来统计页面的使用情况。
D--位6是页面已被修改(Dirty)标志。当处理器对一个页面执行写操作时,就会设置对应页表表项的D标志。处理器并不会修改页目录项中的D标志。
AVL--该字段保留专供程序使用。处理器不会修改这几位,以后的升级处理器也不会。
由于页表占用内存空间太大(1M个元素*4B大小=4MB,也可以这么看:每个进程的虚拟地址空间=4G,页面大小=4K,所以共有1M个页,需要1M个页表项,又因为每个页表项=4B,所以页表大小=4M),为了减少内存占用量,因此设计了层次化的分页结构:页目录表+页表。
层次化的设计想法:
因为4GB的虚拟内存共有1M=220=1048576个4K大小的页面。
我们将这些页面分成210=1024份,即从页表1到页表1024,由页目录表管理;
每一份(每一页表)有210=1024个页,由每一个页表管理,页在页表中是随机的,哪个页位于哪个页表中是没有规律的;
结构图如下:
每个任务都有这样的层次化的分页结构,即每个任务都有自己的页目录表和页表。
从硬件角度来分析:
在处理器中有个控制寄存器CR3,存放着当前任务页目录的物理地址,故又叫做页目录基址寄存器(Page Directory Base Register,PDBR),每个任务都存放了自己的页目录物理地址,当任务切换时,处理器切换到新任务开始执行,更新CR3寄存器的内容,以指向新任务的页目录位置;
相应的,页目录又指向了一个个的页表,每个页表又根据任务的页表项指向了相应的页。其中注意的是,页目录和页表也是普通的页,混迹于全部的物理页中,它们和普通页的不同之处仅仅在于功能不一样,当任务撤销之后, 它们和任务所占用的普通页一样会被回收, 并分配给其他任务(如下图所示)。
下面内容转自《分页机制》,写的很清楚。
地址变换的具体过程
对于Intel处理器来说, 有关分页, 最简单和最基本的机制就是这些; CR3寄存器给出了页目录的物理地址; 页目录给出了所有页表的物理地址, 而每个页表给出了它所包含的页的物理地址. 好了, 该清楚的都清楚了, 唯一还不明白的, 应该是如何用这种层次性的分页结构把线性地址转换成物理地址? 这里举个例子, 某任务加载后, 在4GB虚拟地址空间创建了一个段, 起始地址为0x00800000, 段界限为0x5000, 字节粒度. 当前任务执行时, 段寄存器DS指向该段. 又假设执行了下面一条指令
mov edx, [0x1050]
此时, 段部件会输出线性地址0x00801050. 在没有开启分页机制时, 这就是要访问的物理地址. 但现在开启了分页机制, 所以这是一个下虚拟地址, 要经过页部件转换, 才能得到物理地址.
如下图所示, 处理器的页部件专门负责线性地址到物理地址的转换工作. 它首先将段部件送来的32位线性地址分为3段, 分别是高10位, 中间10位, 低12位. 高10位是页目录的索引, 中间10位是页表的索引, 低12位则作为页内偏移量来用.
当前任务页目录的物理地址在处理器的CR3寄存器中, 假设它的内容为0x00005000. 段管理部件输出的线性地址是0x00801050, 其二进制的形式如图中给出. 高10位是十六进制的0x002, 它是页目录表内的索引,处理器将它乘以4(因为每个目录项4字节), 作为偏移量访问页目录. 最终处理器从物理地址00005008处取得页表的物理地址0x08001000.
线性地址的中间10位为0x001, 处理器用它作为页表索引取得页的物理地址. 将该值乘以4, 作为偏移量访问页表. 最终, 处理器又从物理地址08001004处取得页的物理地址, 这就是我们一直努力寻找的那个页.
页的物理地址是0x0000c000, 而线性地址的低12位是数据所在的页内偏移量. 故处理器将它们相加, 得到物理地址0x0000C050, 这就是线性地址0x00801050所对应的物理地址, 要访问的数据就在这里.
注意, 这种变换不是无缘无故的, 而是事先安排好的. 当任务加载时, 操作系统先创建虚拟的段, 并根据段地址的高20位决定它要用到哪些页目录项和页表项. 然后, 寻找空闲的页, 将原本应该写入段中的数据写到一个或者多个页中, 并将页的物理地址填写到相对应的页表项中. 只有这样做了, 当程序运行的时候, 才能以相反的顺序进行地址变换, 并找到正确的数据.
页目录项, 页表项, CR3和打开分页
页目录项和页表项
页目录和页表中分别存放为页目录项和页表项, 它们的格式如下:
可以看出, 在页目录和页表中, 只保存了页表或者页物理地址的高20位. 原因很简单, 页表或者页的物理地址, 都要求必须是4KB对齐的, 以便于放在一个页内, 故其低12位全是0. 在这种情况下, 可以只关心其高20位, 低12位安排其他用途.
P 是存在位, 为1时, 表示页表或者页位于内存中. 否则, 表示页表或者页不在内存中, 必须先予以创建, 或者从磁盘调入内存后方可使用.
RW 是读/写位. 为0时表示这样的页只能读取, 为1时可读可写
US 是用户/管理位. 为1时, 允许所有特权级别的程序访问; 为0时, 只允许特权级别为0, 1和2的程序访问.
PWT(Page-level Write-Through) 是页级通写位, 和高速缓存有关. "通写"是处理器高速缓存的一种工作方式, 这一位用来间接决定是否采用此种方式来改善页面的访问效率.
PCD(Page-level Cache Disable)是页级高速缓存禁止位, 用来间接决定该表项所指向的那个页是否使用高速缓存策略.
A 是访问位. 该位由处理器固件设置, 用来指示此表项所指向的页是否被访问过.
D(Dirty) 是脏位. 该位由处理器固件设置, 用来指示此表项所指向的页是否写过数据
PAT(Page Attribute Table) 页属性表支持位. 此位涉及更复杂的分页系统, 和页高速缓存有关, 可以不予理会, 在普通的4KB分页机制中, 处理器建议将其置0.
G 是全局位. 用来指示该表项所指向的页是否为全局性质的. 如果页是全局的, 那么, 它将在高速缓存中一直保存(也就意味着地址转换速度会很快). 因为页高速缓存容量有限, 只能存放频繁使用的那些表项. 而且, 当因任务切换等原因改变CR3寄存器的内容时, 整个页高速缓存的内容都会被刷新.
AVL位卑处理器忽略, 软件可以使用.
CR3(PDBR)和开分页机制
控制寄存器CR3, 也就是页目录表基地址寄存器PDBR, 该寄存器如上图所示.
由于页目录表必须位于一个自然页内(4KB对齐), 故其物理地址的低12位是全0. 低12位除了PCD和PWT外, 都没有使用. 这两位用于控制页目录的高速缓存特性, 参见上面解释.
控制寄存器CR0的最高位PG位, 用于开启分页或者关闭页功能. 当该位清0时, 页功能关闭, 从段部件来的线性地址就是物理地址. 当它置位时, 页功能开启. 只能在保护模式下才能开启分页功能, 当PE位清0时(实模式), 设置PG位将导致处理器产生一个异常中断.
不存在的页表:
使用二级表结构,并没有解决需要使用4MB内存来存放页表的问题。实际上,我们把问题搞得有些复杂了。因为我们需要另增一个页面来存放目录表。然而,二级表结构允许页表被分散在内存各个页面中,而不需要保存在连续的4MB内存块中。另外,并不需要为不存在的或线性地址空间未使用部分分配二级页表。虽然目录表页面必须总是存在于物理内存中,但是二级页表可以在需要时再分配。这使得页表结构的大小对应于实际使用的线性地址空间大小。
页目录表中每个表项也有一个存在(present)属性,类似于页表中的表项。页目录表项中的存在属性指明对应的二级页表是否存在。如果目录表项指明对应的二级页表存在,那么通过访问二级表,表查找过程第2步将同如上描述继续下去。如果存在位表明对应的二级表不存在,那么处理器就会产生一个异常来通知操作系统。页目录表项中的存在属性使得操作系统可以根据实际使用的线性地址范围来分配二级页表页面。
目录表项中的存在位还可以用于在虚拟内存中存放二级页表。这意味着在任何时候只有部分二级页表需要存放在物理内存中,而其余的可保存在磁盘上。处于物理内存中页表对应的页目录项将被标注为存在,以表明可用它们进行分页转换。处于磁盘上的页表对应的页目录项将被标注为不存在。由于二级页表不存在而引发的异常会通知操作系统把缺少的页表从磁盘上加载进物理内存。把页表存储在虚拟内存中减少了保存分页转换表所需要的物理内存量。
总结:给定虚拟地址,怎么找到它对应的物理地址?分两步!
第一步从虚拟地址到线性地址,第二步从线性地址从物理地址。
第一步从段描述符表描述的段基址加上段偏移生成线性地址。
IA32中线性地址高10位为页目录索引,通过此找到页表,线性地址中间10位为页表项索引,通过前面找到的页表加上这个索引,找到页表项。页表项指示着页框号,页框号加上线性地址低12位(页内偏移)就生成了物理地址。
看过“虚拟地址与物理地址怎么映射”
浏览量:3
下载量:0
时间:
在确保访问的数据已在物理内存中后,还需要先将虚拟地址转换为物理地址,即"地址映射",那么虚拟地址映射到物理地址怎么做呢?今天读文网小编与大家分享下虚拟地址映射到物理地的具体操作步骤,有需要的朋友不妨了解下。
Win32通过一个两层的表结构来实现地址映射,因为每个进程都拥有私有的4G的虚拟内存空间,相应的,每个进程都有自己的层次表结构来实现其地址映射。
第一层称为页目录,实际就是一个内存页,Win32的内存页有4KB大小,这个内存页以4个字节分为1024项,每一项称为“页目录项”(PDE);
第二层称为页表,这一层共有1024个页表,页表结构与页目录相似,每个页表也都是一个内存页,这个内存页以4KB的大小被分为1024项,页表的每一项被称为页表项(PTE),易知共有1024×1024个页表项。每一个页表项对应一个物理内存中的某一个“内存页”,即共有1024×1024个物理内存页,每个物理内存页为4KB,这样就可以索引到4G大小的虚拟物理内存。
如下图所示(注下图中的页目录项的大小应该是4个字节,而不是4kB):
Win32提供了4GB大小的虚拟地址空间。因此每个虚拟地址都是一个32位的整数值,也就是我们平时所说的指针,即指针的大小为4B。它由三部分组成,如下图:
这三个部分的第一部分,即前10位为页目录下标,用来寻址页目录项,页目录项刚好1024个。找到页目录项后,找对页目录项对应的的页表。第二部分则是用来在页表内寻址,用来找到页表项,共有1024个页表项,通过页表项找到物理内存页。第三部分用来在物理内存页中找到对应的字节,一个页的大小是4KB,12位刚好可以满足寻址要求。
具体的例子:
假设一个线程正在访问一个指针(Win32的指针指的就是虚拟地址)指向的数据,此指针指为0x2A8E317F,下图表示了这一个过程:
0x2A8E317F的二进制写法为0010101010_0011100011_000101111111,为了方便我们把它分为三个部分。
首先按照0010101010寻址,找到页目录项。因为一个页目录项为4KB,那么先将0010101010左移两位,001010101000(0x2A8),用此下标找到页目录项,然后根据此页目录项定位到下一层的某个页表。
然后按照0011100011寻址,在上一步找到页表中寻找页表项。寻址方法与上述方法类似。找到页表项后,就可以找到对应的物理内存页。
最后按照000101111111寻址,寻找页内偏移。
上面的假设的是此数据已在物理内存中,其实判断访问的数据是否在内存中也是在地址映射过程中完成的。Win32系统总是假设数据已在物理内存中,并进行地址映射。页表项中有一位标志位,用来标识包含此数据的页是否在物理内存中,如果在的话,就直接做地址映射,否则,抛出缺页中断,此时页表项也可标识包含此数据的页是否在调页文件中(外存),如果不在则访问违例,程序将会退出,如果在,页表项会查出此数据页在哪个调页文件中,然后将此数据页调入物理内存,再继续进行地址映射。为了实现每个进程拥有私有4G的虚拟地址空间,也就是说每个进程都拥有自己的页目录和页表结构,对不同进程而言,即使是相同的指针(虚拟地址)被不同的进程映射到的物理地址也是不同的,这也意味着在进程之间传递指针是没有意义的。
浏览量:2
下载量:0
时间:
虚拟地址)被不同的进程映射到的物理地址是不同的,那么大家知道虚拟地址如何映射到物理地址吗?下面跟着读文网小编来一起了解下虚拟地址映射到物理地址吧。
虚拟地址映射到物理地址方法
这里只谈分页管理的机制,也是目前最重要的内存管理机制。
最初的设计想法:
结构图如下:
页的尺寸是4KB,虚拟地址的前20位用于指定一个物理页,后12位用于访问页内偏移。
页表项的结构:
各个位的含义:
P--位0是存在(Present)标志,用于指明表项对地址转换是否有效。P=1表示有效;P=0表示无效。在页转换过程中,如果说涉及的页目录或页表的表项无效,则会导致一个异常。如果P=0,那么除表示表项无效外,其余位可供程序自由使用,如图4-18b所示。例如,操作系统可以使用这些位来保存已存储在磁盘上的页面的序号。
R/W--位1是读/写(Read/Write)标志。如果等于1,表示页面可以被读、写或执行。如果为0,表示页面只读或可执行。当处理器运行在超级用户特权级(级别0、1或2)时,则R/W位不起作用。页目录项中的R/W位对其所映射的所有页面起作用。
U/S--位2是用户/超级用户(User/Supervisor)标志。如果为1,那么运行在任何特权级上的程序都可以访问该页面。如果为0,那么页面只能被运行在超级用户特权级(0、1或2)上的程序访问。页目录项中的U/S位对其所映射的所有页面起作用。
A--位5是已访问(Accessed)标志。当处理器访问页表项映射的页面时,页表表项的这个标志就会被置为1。当处理器访问页目录表项映射的任何页面时,页目录表项的这个标志就会被置为1。处理器只负责设置该标志,操作系统可通过定期地复位该标志来统计页面的使用情况。
D--位6是页面已被修改(Dirty)标志。当处理器对一个页面执行写操作时,就会设置对应页表表项的D标志。处理器并不会修改页目录项中的D标志。
AVL--该字段保留专供程序使用。处理器不会修改这几位,以后的升级处理器也不会。
由于页表占用内存空间太大(1M个元素*4B大小=4MB,也可以这么看:每个进程的虚拟地址空间=4G,页面大小=4K,所以共有1M个页,需要1M个页表项,又因为每个页表项=4B,所以页表大小=4M),为了减少内存占用量,因此设计了层次化的分页结构:页目录表+页表。
层次化的设计想法:
因为4GB的虚拟内存共有1M=220=1048576个4K大小的页面。
我们将这些页面分成210=1024份,即从页表1到页表1024,由页目录表管理;
每一份(每一页表)有210=1024个页,由每一个页表管理,页在页表中是随机的,哪个页位于哪个页表中是没有规律的;
结构图如下:
每个任务都有这样的层次化的分页结构,即每个任务都有自己的页目录表和页表。
从硬件角度来分析:
在处理器中有个控制寄存器CR3,存放着当前任务页目录的物理地址,故又叫做页目录基址寄存器(Page Directory Base Register,PDBR),每个任务都存放了自己的页目录物理地址,当任务切换时,处理器切换到新任务开始执行,更新CR3寄存器的内容,以指向新任务的页目录位置;
相应的,页目录又指向了一个个的页表,每个页表又根据任务的页表项指向了相应的页。其中注意的是,页目录和页表也是普通的页,混迹于全部的物理页中,它们和普通页的不同之处仅仅在于功能不一样,当任务撤销之后, 它们和任务所占用的普通页一样会被回收, 并分配给其他任务(如下图所示)。
下面内容转自《分页机制》,写的很清楚。
地址变换的具体过程
对于Intel处理器来说, 有关分页, 最简单和最基本的机制就是这些; CR3寄存器给出了页目录的物理地址; 页目录给出了所有页表的物理地址, 而每个页表给出了它所包含的页的物理地址. 好了, 该清楚的都清楚了, 唯一还不明白的, 应该是如何用这种层次性的分页结构把线性地址转换成物理地址? 这里举个例子, 某任务加载后, 在4GB虚拟地址空间创建了一个段, 起始地址为0x00800000, 段界限为0x5000, 字节粒度. 当前任务执行时, 段寄存器DS指向该段. 又假设执行了下面一条指令
mov edx, [0x1050]
此时, 段部件会输出线性地址0x00801050. 在没有开启分页机制时, 这就是要访问的物理地址. 但现在开启了分页机制, 所以这是一个下虚拟地址, 要经过页部件转换, 才能得到物理地址.
如下图所示, 处理器的页部件专门负责线性地址到物理地址的转换工作. 它首先将段部件送来的32位线性地址分为3段, 分别是高10位, 中间10位, 低12位. 高10位是页目录的索引, 中间10位是页表的索引, 低12位则作为页内偏移量来用.
当前任务页目录的物理地址在处理器的CR3寄存器中, 假设它的内容为0x00005000. 段管理部件输出的线性地址是0x00801050, 其二进制的形式如图中给出. 高10位是十六进制的0x002, 它是页目录表内的索引,处理器将它乘以4(因为每个目录项4字节), 作为偏移量访问页目录. 最终处理器从物理地址00005008处取得页表的物理地址0x08001000.
线性地址的中间10位为0x001, 处理器用它作为页表索引取得页的物理地址. 将该值乘以4, 作为偏移量访问页表. 最终, 处理器又从物理地址08001004处取得页的物理地址, 这就是我们一直努力寻找的那个页.
页的物理地址是0x0000c000, 而线性地址的低12位是数据所在的页内偏移量. 故处理器将它们相加, 得到物理地址0x0000C050, 这就是线性地址0x00801050所对应的物理地址, 要访问的数据就在这里.
注意, 这种变换不是无缘无故的, 而是事先安排好的. 当任务加载时, 操作系统先创建虚拟的段, 并根据段地址的高20位决定它要用到哪些页目录项和页表项. 然后, 寻找空闲的页, 将原本应该写入段中的数据写到一个或者多个页中, 并将页的物理地址填写到相对应的页表项中. 只有这样做了, 当程序运行的时候, 才能以相反的顺序进行地址变换, 并找到正确的数据.
页目录项, 页表项, CR3和打开分页
页目录项和页表项
页目录和页表中分别存放为页目录项和页表项, 它们的格式如下:
可以看出, 在页目录和页表中, 只保存了页表或者页物理地址的高20位. 原因很简单, 页表或者页的物理地址, 都要求必须是4KB对齐的, 以便于放在一个页内, 故其低12位全是0. 在这种情况下, 可以只关心其高20位, 低12位安排其他用途.
P 是存在位, 为1时, 表示页表或者页位于内存中. 否则, 表示页表或者页不在内存中, 必须先予以创建, 或者从磁盘调入内存后方可使用.
RW 是读/写位. 为0时表示这样的页只能读取, 为1时可读可写
US 是用户/管理位. 为1时, 允许所有特权级别的程序访问; 为0时, 只允许特权级别为0, 1和2的程序访问.
PWT(Page-level Write-Through) 是页级通写位, 和高速缓存有关. "通写"是处理器高速缓存的一种工作方式, 这一位用来间接决定是否采用此种方式来改善页面的访问效率.
PCD(Page-level Cache Disable)是页级高速缓存禁止位, 用来间接决定该表项所指向的那个页是否使用高速缓存策略.
A 是访问位. 该位由处理器固件设置, 用来指示此表项所指向的页是否被访问过.
D(Dirty) 是脏位. 该位由处理器固件设置, 用来指示此表项所指向的页是否写过数据
看过“虚拟地址如何映射到物理地址”
浏览量:3
下载量:0
时间:
虚拟地址是Windows程序时运行在386保护模式下,这样程序访问存储器所使用的逻辑地址称为虚拟地址,大家知道虚拟地址怎样映射到物理地址吗?接下来大家跟着读文网小编一起来了解一下虚拟地址映射到物理地址的解决方法吧。
一般情况下,Linux系统中,进程的4GB内存空间被划分成为两个部分------用户空间和内核空间,大小分别为0~3G,3~4G。
用户进程通常情况下,只能访问用户空间的虚拟地址,不能访问到内核空间。
每个进程的用户空间都是完全独立、互不相干的,用户进程各自有不同的页表。而内核空间是由内核负责映射,它并不会跟着进程改变,是固定的。内核空间地址有自己对应的页表,内核的虚拟空间独立于其他程序。
3~4G之间的内核空间中,从低地址到高地址依次为:物理内存映射区—隔离带—vmalloc虚拟内存分配区—隔离带—高端内存映射区—专用页面映射区—保留区。
【内核空间内存动态申请】
主要包括三个函数:kmalloc(), __get_free_pages, vmalloc。
kmalloc(), __get_free_pages申请的内存位于物理地址映射区,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因此存在较简单的转换关系。而vmalloc申请的内存位于vmalloc虚拟内存分配区(这些区都是以线性地址为度量),它在虚拟内存空间给出一块连续的内存区,实质上,这片连续的虚拟内存在物理内存中并不一定连续,而vmalloc申请的虚拟内存和物理内存之间也没有简单的换算关系。
因为vmalloc申请的在虚拟内存空间连续的内存区在物理内存中并不一定连续,可以想象为了完成vmalloc,新的页表需要被建立,因此,知识调用vmalloc来分配少量内存是不妥的。
一般来讲,kmalloc用来分配小于128K的内存,而更大的内存块需要用vmalloc来实现。
【虚拟地址与物理地址关系】
对于内核物理内存映射区的虚拟内存(用kmalloc(), __get_free_pages申请的),使用virt_to_phys()和phys_to_virt()来实现物理地址和内核虚拟地址之间的互相转换。它实际上,仅仅做了3G的地址移位。
上述方法适用于常规内存(内核物理内存映射区),高端内存的虚拟地址与物理地址之间不存在如此简单的换算关系。因为它涉及到了分离物理页的页表控制机制。
【ioremap】
在ARM中,设备的寄存器或者存储块的这部分空间属于内存空间的一部分,我们称之为IO内存。
在内核中访问IO内存之前,我们只有IO内存的物理地址,这样是无法通过软件直接访问的,需要首先用ioremap()函数将设备所处的物理地址映射到内核虚拟地址空间(3GB~4GB)。然后,才能根据映射所得到的内核虚拟地址范围,通过访问指令访问这些IO内存资源。
在将I/O内存资源的物理地址映射成核心虚地址后,理论上讲我们就可以象读写RAM那样直接读写I/O内存资源了。为了保证驱动程序的跨平台的可移植性,我们应该使用Linux中特定的函数来访问I/O内存资源,而不应该通过指向核心虚地址的指针来访问。
【mmap】
用mmap映射一个设备,意味着使用户空间的一段地址关联到设备内存上,这使得只要程序在分配的地址范围内进行读取或者写入,实际上就是对设备的访问。这种数据传输是直接的,不需要用到内核空间作为数据转移的中间站。
remap_page_range函数的功能是构造用于映射一段物理地址的新页表,实现了内核空间与用户空间的映射。
在内核驱动程序的初始化阶段,通过ioremap()将物理地址映射到内核虚拟空间;在驱动程序的mmap系统调用中,使用remap_page_range()将该块ROM映射到用户虚拟空间。这样内核空间和用户空间都能访问这段被映射后的虚拟地址。
Ioremap:
进程空间ç内核空间çIO内存
其中,后面两个指的是同一段物理内存区域,只是一个为虚拟地址,一个为物理地址。进程空间和内核空间对应着不同的物理地址,它们之间的数据传递,是实际的数据的拷贝。
Mmap:
进程空间çIO内存
其中,进程空间mmap得到的那段虚拟地址跟IO内存对应着同一段物理地址。这个过程没有额外的数据中转,读写都直接针对硬件的物理地址进行。
一般来讲,小数据量的传输用ioremap()就足够了,
【IO内存的一般访问方法】
1. 首先是调用request_mem_region()申请资源,即告诉内核,本驱动正在使用这段物理内存,其他驱动不得访问它们。在设备驱动模块加载或open()函数中进行。
2. 接着讲寄存器地址通过ioremap()映射到内核空间虚拟地址,之后就可以通过Linux设备访问编程接口访问这些设备的寄存器了。在设备驱动初始化、write(),read(),ioctl()函数中进行。
3. 访问完成之后,应对ioremap()申请的虚拟地址进行释放,并释放release_mem_region()申请的IO内存资源。在设备驱动模块卸载或release()函数中进行。
看过“虚拟地址怎样映射到物理地址”
浏览量:3
下载量:0
时间:
路由器作为网际互联设备,是连接内部可信网络和外部非信任网络的枢纽节点,路由器系统国际互联网的主要组成部分。那么你知道路由器ip端口怎么映射吗?下面是读文网小编整理的一些关于路由器ip端口映射的相关资料,供你参考。
打开浏览器,在浏览器地址栏中输入网关地址回车之后即可打开连接到路由器的登录界面,输入路由器登录用户名和密码确定之后即可登录
在路由器管理界面左侧找到转发规则下面的【虚拟服务器】,即可出现右侧的相关设置。
在虚拟服务器这里,找到【增加新的条目】并单击。
单击【虚拟服务器】按扭后,弹出如下图所示的界面,在下图的服务端口号这里填写自己电脑的需要映射的端口,IP地址填写自己电脑的IP地址,其他的都选默认然后保存即可。
路由器成功添加完80端口和3389端口效果图。
看过文章“路由器ip端口怎么映射”
浏览量:2
下载量:0
时间: