paging in linux,Linux Operating System
8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
Paging in Linux
由於x86在32bit下有兩層的page table(PAE沒開情況下),而在64bit下有更多層,因此linux為了要在兩種處理器底下都能跑選擇了較高層的paging level。在2.6.10版本linux paging level有三層,從2.6.11版本之後增加到了四層page table。
如果四層都會用到的話,依照virtual address轉換到physical address的順序依序為:Page Global Directory、Page Upper Directory、Page Middle Directory、Page Table。如下圖所示:
會用到這四層主要是x86_64的處理器需要用到,那對於32bit PAE沒有開啟情況以及Pentium這些只有兩層就夠的該如何處理呢?Linux這邊直接將中間兩層的大小設為0,也就是Page Upper Directory跟Page Middle Directory這兩層table消失,讓Page Global Directory直接指向第四層的page table,如下圖:
而在32bit下PAE開啟的話有三層page table,此時對應到的linux四層table如下:
每個process都有屬於他的Page Global Directory以及page tables,當process switch發生時會將執行到一半的process的cr3暫存器的值存到descriptor中,然後再從GDT中找出將要執行的process的descriptor存到cr3,如此便能正確的指到page table。
Memory Addressing
接下來要講linux kernel的初始化,而實體記憶體當中有些位置是被保留的,就算是kernel也不能放在那些保留的位置中,這些被保留的位置放置了BIOS以及一些I/O Port,如下圖所配置:
在主機板上的BIOS程式所放置的實體記憶體位置為0xF0000到0xFFFFF,而一些其他的硬體設備像是graphics cards的BIOS放置的位置則是在0xc0000到0xc7fff之間。而一些device的IO share memory則是會放置在0xa0000到0xfffff之間,這些程式是在OS起來之前所需要的,也就是剛開機時所執行的程式,雖然OS起來後就不會用到BIOS,但是下一次開機還是會用到,因此這些程式無論如何都不能被動到,不然你下次都開不了電腦了….而這些code都在0xfffff之前,也就是佔用了實體記憶體中的前16MB,因此這16MB的空間都不能動到,linux kernel會從16MB後開始放置kernel的東西。
How Kernel Initializes Its Own page tables
kernel在初始page table會有兩個階段,在phase one時會初始化kernel code data segment,以及page table跟動態資料結構。kernel code+data總共有7MB,而在剛開機時是靠bootmen allocator來配置記憶體,bootmen allocator所佔的記憶體空間為1MB,所以phase one當中會有24MB的virtual address需要mapping:
24MB的virtual address需要有6個entry來mapping到physical address,由於在paging機制開啟之前virtual address等於physical address,而在phase one當中會遭遇到從沒有paging到paging開啟這段過程,因此為了讓physical address一致,這邊會希望在phase one時mapping後的address會跟沒有paging時直接轉換的address相等。下圖為physical address layout:
而在phase one中會呼叫到一些位置在0xc0000000之後的code,而我們希望mapping到physical時也會再前24MB的地方,因此我們的paging table有些特別,它會讓0x00000000與0xc0000000指到同一塊physical address:
相當於在0xc0000000之後的virtual address只要減去0xc0000000就會變成physical address。那要如何做到呢?在linux kernel中Page Global Directory會存在initial_page_table,而第二層的Page Tables會存在 _brk_base,配合剛所講的24MB會需要6個entry,因此設定entry 0~5以及768 ~ 773以外的entry為0,而entry0跟entry 768所指向的_brk_base會是同一個entry,故相當於768 entry以後的address都會減掉0xc0000000的offset了:
接下來看整個initial page table過程,首先在paging機制還沒開啟前,virtual address等於physical address,linux kernel程式都會在0x00000000到0x00800000:
在這個startup_32()中會把paging叫起來,它將initial_page_table load到cr3暫存器當中,接著將cr0的PG flag enable,因此paging開始在處理器上運行,此時virtual address轉換到physical address時會經過paging unit:
而在initial過程中它乎叫了i386_start_kernel()程式,這是C程式,放置的位置是在0xc0000000之後,因此可以看到我們剛剛所設計的page table用意在此:
paging in linux,Linux Operating System相关推荐
- 成功解决解决VM软件安装Linux的Ubuntu过程,打开时 Operating System not found
成功解决解决VM软件安装Linux的Ubuntu过程,打开时 Operating System not found 目录 解决问题 解决思路 解决方法 解决问题 安装Ubuntu16.04虚拟机,打开 ...
- Linux安装Oracle报Checking operating system version must be redhat-3, SuSE-9, redhat-4, UnitedLin
在Linux系统中安装oralce的过程中,如果Linux发行版本不是oracle的推荐版本,可能会报如下错误,导致runInstaller无法完成: Checking operating syste ...
- Linux 1: Cloud computing operating system management | Linux
Linux 系列 Linux 1: 云计算操作系统管理 Cloud computing operating system management | Linux Linux 2: 云计算网络应用管理 C ...
- linux ros是什么?(Robot Operating System)
Robot Operating System 参考文章:ROS学习入门(抛砖引玉篇)
- unix/Linux BSD以及System V---认知
一,BSD 和 System V Unix操作系统在操作风格上主要分为System V和BSD(目前一般采用BSD的第4个版本SVR4),前者的代表的操作系统有Solaris操作系统,在Solaris ...
- linux进程间通信:system V 信号量 生产者和消费者模型编程案例
生产者和消费者模型: 有若干个缓冲区,生产者不断向里填数据,消费者不断从中取数据 两者不冲突的前提: 缓冲区有若干个,且是固定大小,生产者和消费者各有若干个 生产者向缓冲区中填数据前需要判断缓冲区是否 ...
- 成功解决解决VM软件安装Linux的Ubuntu过程,开启Linux出现Oprating System not found错误
Linux:解决VM软件安装Linux的Ubuntu过程中,开启Linux出现Oprating System not found错误 导读 最讨厌网上回答的啰嗦和不清晰!本人最讨厌啰嗦,直接上来,图文 ...
- Linux系统调用表(system call table)
<Linux系统调用表> <linux系统调用表(system call table)> <线上环境 Linux 系统调用追踪> <Linux系统调用权威指南 ...
- java环境安装 linux,Linux Java环境配置安装
一.安装JDK 安装包名为:jdk-1_5_0_18-linux-i586.rpm.bin 安装步骤: 1. 以root身份登录Linux操作系统 2. 将jdk-1_5_0_18-linux-i58 ...
- [Operating.System.Concepts(9th,2012.12)].Abraham.Silberschatz.文字版(恐龙书——操作系统概念 原书第九版)课后习题 参考答案
目录 Chap01 导论 Chap02 OS结构 Chap03 进程 Chap04 线程 Chap05 同步(Synchronization) Chap06 CPU调度 Chap07 死锁 Chap0 ...
最新文章
- 固定div的位置——不随窗口大小改变为改变位置
- 茶觉 | “治愈”的白牡丹
- 2017校赛 问题 D: 我知道了,你知道了吗?【递归】
- 关于MSSQL存储过程中使用游标的一个小例子(学习)
- 计算机单词修改是否正确,计算机组装必懂的53个单词及装机步骤51条.doc
- Python四:HoughCircles()霍夫变换
- 计算机网络-IP数据报计算(IP数据报分片)一个数据报部分长度为3400字节(使用固定首部)。现在经过一个网络传输,该网络的MTU为800字节:
- 今日力推: Android 厨客APP / Android 趣刻App
- Linux宝库上线,有木有get到你?
- 面试字节、阿里等大厂后,总结了今年的 Java 面试必问的微服务面试题(含答案)
- 微信小程序轮播图禁止滚动
- 利用pandas进行简单数据分析——医院销售数据分析案例
- 龙贝格积分——matlab实现
- 《犯罪心理学》读书笔记(part2)--犯罪心理学发展史
- MYSQL从简单查询到高级查询(一)
- httpclient.execute长时间停滞问题
- 一朵花的组成结构图_请问一朵完整的花由哪几部分组成
- 计算机在档案管理中的作用,计算机技术在档案管理应用中的必要性
- 如何用PS制作电子邮票
- java玫瑰花代码_用java画布画玫瑰花
热门文章
- SAP Spartacus category navigation页面鼠标进入事件的处理
- Angular rxjs fromEvent使用的一个例子
- Angular 依赖注入的一个常见错误 NullInjectorError, No provider for XXX
- jsp文件的请求是如何被服务器的JSP容器转换成静态网页的
- 记一次SAP开发工程师给微软Azure报incident的体验
- 为SAP Analytics Cloud的story创建持久化页面
- Jerry答网友提问:SAP CRM WebClient UI里的EXT,STRUCT等含义
- when is completed field filled in the backend
- where is list binding done for Opportunity S2 view default 20 returns
- COM_TEXT_TIMESTAMP_SET