当前位置:  技术问答>linux和unix

读过内核进来~~访问虚拟内存的方法!

    来源: 互联网  发布时间:2016-04-29

    本文导语:  缺页的情况: 1.计算得到的目录表项为0的话。说明该页表不在内存中,便产生一个缺页中断分配一个物理页4KB(存放页表)并且把分配的物理地 址赋值给该目录表项。于是可以进一步访问所在的页表了。 2.页表的物理...

缺页的情况:
1.计算得到的目录表项为0的话。说明该页表不在内存中,便产生一个缺页中断分配一个物理页4KB(存放页表)并且把分配的物理地
址赋值给该目录表项。于是可以进一步访问所在的页表了。
2.页表的物理地址找到了,但是计算出来的所在页表项的值为0。说明该页不在内存中。便产生一个缺页中断分配一个物理页4KB(存
放数据)并且把分配的物理地址赋值给该页表项。于是可以进一步访问所在的页了。
3.不会再中断了,根据页表项算出的物理地址 加上 偏移量就是该线性地址的物理地址了。

问题:
1.页表项里有什么内容?
2.页表项的值为0,说明该页不在内存中,那就要从虚拟内存中找,是用什么方法这么快速找到?是基于硬件还是软件算法实现的?(页表项里好像没有指向在虚拟内存上的帧吧?)

|
1. 每个页表项(页目录项)由4个字节(32bits)构成!
   bit31-bit12: 下一级表的物理地址,低12位固定为0,因为页总是page对齐的;
   bit11-bit9: 
   ...
  自己google看看,或者查看内核源代码!

2.页表项的值为0,应该是该内存地址在物理上还不存在,需要新分配一个页。另外有一种情况是:该项不为0,但是页表项的present字段为0,说明该页表项对应的页不在内存中,被操作系统交换出去了。这是需要用缺页请求将其换入;一个页不在内存中,不是指他的虚拟内存,而是指虚拟内存所关联的物理内存不在内存中!所以,你说的“页表项的值为0,说明该页不在内存中,那就要从虚拟内存中找”这句话貌似是有些问题的, 实际上是: 虚拟内存永远都是有的,一般不会说虚拟内存不够或者没有,而是说物理内存没有,这时侯需要从系统空闲物理内存中分配一个页,然后将虚拟内存到物理内存建立起来! 然后通过虚拟内存访问OK了。这个过程中,是软件和硬件结合完成的!


good luck!


|
这个问题很多书有讲。

页表项的内容硬件相关。大体包括权限,是否已映射等。象arm平台有
大页小页的概念,也需要相应的标志位。

页表映射的页如果在交换空间,则页表项里会有地址信息(没记错的话是复用页表的地址段), 
不需要进行查找操作。

如果是分配新的物理帧,则也有高效的分配算法(通常从 free_page_list获取,不够会释放出一些内存先)

    
 
 

您可能感兴趣的文章:

  • 现有linux内核中共享内存机制如何移植到linux0.11内核中
  • 内核不能使用虚拟内存?
  • 内核最大可用内存是多少,怎样扩大可用内存?
  • 请问重新编译LINUX内核是否能将没有用的外设的驱动程序删除并减少内核占有内存的资源?请好心人仕指教!
  • 内核内存泄露检测
  • [求助]如何设置uclinux内核中的内存
  • linux内核分配内存,及管理?
  • 请问高手们,有没有一款工具可以测试内核内存泄露的?
  • 内核启动内存问题
  • 内核操作用户空间内存
  • 内核里内存拷贝用什么函数?
  • linux下如何实现内核态和用户空间进程共享内存?
  • linux内核 怎么能增加虚拟内存?
  • 如何在内核中分配一个带有VM_EXEC权限的内存页面?
  • 驱动中如何将用户空间内存映射到内核空间使用?
  • 如何在内核中获取当前进程的内存使用及CPU占用率
  • 如何写个吃内存的demo,让内核直接分配大块物理页面?
  • 有人做过内核空间和用户空间的内存映射吗 内核空间和用户空间交换数据用内存映射的方法,结果做的驱动可以工作,但经常会引起死机
  • 在内核里如何访问这段内存?
  • linux内核加载到哪个内存区间了?
  • 昆明Linux内核爱好者进来
  • 关于进程号pid的一个困惑,熟悉内核代码的请进来!!
  • Linux内核网络问题,各位大牛一定要进来看一下
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux内核中影响tcp三次握手的一些协议配置
  • Fedora Core 2自带的内核升级程序下载下来内核后,要不要再编译一遍内核?
  • TCP协议四次断连过程介绍及Linux内核协议栈中相关设置项
  • 进程内核栈和操作系统内核栈的关系
  • CentOS 6内核升级:下载编译启用新内核版本详细过程
  • Linux中内核线程不访问内核态地址空间?
  • Linux进程的内核栈和用户栈概念,相互关系及切换过程
  • 2.6内核下编译2.4内核
  • linux内核中的likely宏和unlikely宏介绍及用法
  • 谁能提供kgdb内核补丁内核模块的下载
  • CentOS 6.5 下载地址及如何升级内核(kernel)版本到 3.10.28
  • 编译新内核后怎么进入原来内核
  • Linux下c/c++开发之程序崩溃(Segment fault)时内核转储文件(core dump)生成设置方法
  • 请问linux中如何判断内核是否已经启动。(在内核中写程序)
  • docker使用的技术之Container内核原理介绍
  • 内核模块跟内核版本不匹配????????
  • Linux中内核线程不访问内核态地址空间? iis7站长之家
  • linux为什么要升级内核?升级内核有何作用?
  • 内核升级后,如何在新的内核中加载显卡驱动?
  • 内核源码和结果make过的内核源码有什么区别
  • 不重新编译内核能修改内核函数吗?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3