• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Linux内核系列—6.操作系统开发之内存分页机制,linux分页

Linux内核系列—6.操作系统开发之内存分页机制,linux分页

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了linux内核 文件操作,linux内核,linux内核完全剖析,linux内核源码下载,linux内核下载等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Linux内核系列—6.操作系统开发之内存分页机制,linux分页


a.概述

页尺寸是4KB,页表每个表项占4字节,CR3寄存器给出了页目录的物理基地址;页目录给出了所有页表的物理地址,而每个页表给出了它所包含的页的物理地址。

处理器的页部件专门负责线性地址到物理地址的转换工作。它首先将段部件送来的32位线性地址截成3段,分别是高10位、中间的10位和低12位。高10位是页目录的索引,中间10位是页表的索引,低12位则作为页内偏移来用。

假如某个任务加载后,操作系统根据它的实际情况在其4GB虚拟地址空间里创建了一个段,段的起始地址为0x00800000,段界限值为0x5000,字节粒度。当该任务执行时,段寄存器DS指向该段。又假设执行了下面一条指令:

mov edx,[0x1050]

此时,段部件会输出线性地址0x00801050。在没有开启分页机制时,这就是要访问的物理内存地址,但现在开启了分页机制,这是一个虚拟地址,要经过页部件的转换才能得到物理地址。

当前任务页目录的物理地址在处理器的CR3寄存器中,假设它的内容为0x00005000.段管理部件输出的线性地址是0x00801050,其二进制的形式为0000 0000 1000 0000 0001 0000 0101 0000.高10位为0000000010,也就是十六进制的0x002,它是页目录表内的索引,处理器将它乘以4(因为每个目录项为4字节),作为偏移量访问页目录。最终,处理器从物理地址00005008处取得页表的物理地址0x08001000.

页目录表的表项简称PDE,页表的表项简称PTE。分页机制是否生效的开关位于cr0的最高位PG位。如果PG=1,则分页机制生效。

b.源码

PageDirBase		equ	200000h	; 页目录开始地址: 2M
PageTblBase		equ	201000h	; 页表开始地址: 2M+4K

LABEL_DESC_PAGE_DIR: Descriptor PageDirBase, 4095, DA_DRW;Page Directory
LABEL_DESC_PAGE_TBL: Descriptor PageTblBase, 1023, DA_DRW|DA_LIMIT_4K;Page Tables

SelectorPageDir		equ	LABEL_DESC_PAGE_DIR	- LABEL_GDT
SelectorPageTbl		equ	LABEL_DESC_PAGE_TBL	- LABEL_GDT

; 启动分页机制 --------------------------------------------------------------
SetupPaging:
    ...

PageDirBase和PageTblBase指定了页目录表和页表在内存中的位置。页目录表位于地址2MB处,有1024个表项,占用4KB空间。

PDE(左)和PTE(右)格式如下:

cr3的结构如下图,cr3又叫PDBR,它的高20位将是页目录表首地址的高20位,页目录表首地址的低12位会是零,也就是说,页目录表会是4KB对齐的。类似的,PDE中的页表基址以及PTE中的页基址也是用高20位来表示4KB对齐的页表和页。

运行结果如下:

 

一个码农的日常 

【源码】

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Linux内核系列—11.操作系统开发之ELF格式,linuxelf
  • Linux内核系列—7.操作系统开发之中断和异常,linux内核
  • Linux内核系列—6.操作系统开发之内存分页机制,linux分页
  • Linux内核系列—4.操作系统开发之LDT,linuxldt
  • Linux内核系列—操作系统开发之保护模式的优势,linux内核
  • Linux内核系列—操作系统开发之进入32位保护模式,linux保护模式
  • Linux内核系列—操作系统开发之HelloWorld,linuxhelloworld

相关文章

  • 2017-05-26改变Activity启动时的默认动画,activity默认动画
  • 2017-05-26Android Log,androidlog
  • 2017-05-26Android属性动画
  • 2017-05-26Android开发学习之路--Content Provider之初体验
  • 2017-05-26Android 微信第三方登录(个人笔记),android第三方
  • 2017-05-26moveTaskToback退后台的用法及作用,movetasktoback后台
  • 2017-05-26安卓开发中内存问题分析(一)工具篇
  • 2017-05-26小明学习Linux运维实战演练
  • 2017-05-26redis集群部署以及一些坑
  • 2017-05-26Andoid自定义View系统学习参考,andoidview

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 如何「偷」Android 的内存?,「偷」android
    • Android数据存储之SQLite
    • 记一次流量异常处理
    • Android与H5互调(通过实例来了解Hybrid App),androidhybrid
    • Android Studio中的EditText控件使用详解
    • [android] 手机卫士手势滑动切换屏幕,android手势
    • ContentProvider中央档案馆,以及获取联系人电话的示例,contentprovider
    • Android动画解析(一)—— Frame Animation(帧动画)
    • android 公司app升级UI总结分析
    • WeakReference在Handler中的应用,weakhandler

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有