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相关推荐

  1. 成功解决解决VM软件安装Linux的Ubuntu过程,打开时 Operating System not found

    成功解决解决VM软件安装Linux的Ubuntu过程,打开时 Operating System not found 目录 解决问题 解决思路 解决方法 解决问题 安装Ubuntu16.04虚拟机,打开 ...

  2. Linux安装Oracle报Checking operating system version must be redhat-3, SuSE-9, redhat-4, UnitedLin

    在Linux系统中安装oralce的过程中,如果Linux发行版本不是oracle的推荐版本,可能会报如下错误,导致runInstaller无法完成: Checking operating syste ...

  3. Linux 1: Cloud computing operating system management | Linux

    Linux 系列 Linux 1: 云计算操作系统管理 Cloud computing operating system management | Linux Linux 2: 云计算网络应用管理 C ...

  4. linux ros是什么?(Robot Operating System)

    Robot Operating System 参考文章:ROS学习入门(抛砖引玉篇)

  5. unix/Linux BSD以及System V---认知

    一,BSD 和 System V Unix操作系统在操作风格上主要分为System V和BSD(目前一般采用BSD的第4个版本SVR4),前者的代表的操作系统有Solaris操作系统,在Solaris ...

  6. linux进程间通信:system V 信号量 生产者和消费者模型编程案例

    生产者和消费者模型: 有若干个缓冲区,生产者不断向里填数据,消费者不断从中取数据 两者不冲突的前提: 缓冲区有若干个,且是固定大小,生产者和消费者各有若干个 生产者向缓冲区中填数据前需要判断缓冲区是否 ...

  7. 成功解决解决VM软件安装Linux的Ubuntu过程,开启Linux出现Oprating System not found错误

    Linux:解决VM软件安装Linux的Ubuntu过程中,开启Linux出现Oprating System not found错误 导读 最讨厌网上回答的啰嗦和不清晰!本人最讨厌啰嗦,直接上来,图文 ...

  8. Linux系统调用表(system call table)

    <Linux系统调用表> <linux系统调用表(system call table)> <线上环境 Linux 系统调用追踪> <Linux系统调用权威指南 ...

  9. 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 ...

  10. [Operating.System.Concepts(9th,2012.12)].Abraham.Silberschatz.文字版(恐龙书——操作系统概念 原书第九版)课后习题 参考答案

    目录 Chap01 导论 Chap02 OS结构 Chap03 进程 Chap04 线程 Chap05 同步(Synchronization) Chap06 CPU调度 Chap07 死锁 Chap0 ...

最新文章

  1. 固定div的位置——不随窗口大小改变为改变位置
  2. 茶觉 | “治愈”的白牡丹
  3. 2017校赛 问题 D: 我知道了,你知道了吗?【递归】
  4. 关于MSSQL存储过程中使用游标的一个小例子(学习)
  5. 计算机单词修改是否正确,计算机组装必懂的53个单词及装机步骤51条.doc
  6. Python四:HoughCircles()霍夫变换
  7. 计算机网络-IP数据报计算(IP数据报分片)一个数据报部分长度为3400字节(使用固定首部)。现在经过一个网络传输,该网络的MTU为800字节:
  8. 今日力推: Android 厨客APP / Android 趣刻App
  9. Linux宝库上线,有木有get到你?
  10. 面试字节、阿里等大厂后,总结了今年的 Java 面试必问的微服务面试题(含答案)
  11. 微信小程序轮播图禁止滚动
  12. 利用pandas进行简单数据分析——医院销售数据分析案例
  13. 龙贝格积分——matlab实现
  14. 《犯罪心理学》读书笔记(part2)--犯罪心理学发展史
  15. MYSQL从简单查询到高级查询(一)
  16. httpclient.execute长时间停滞问题
  17. 一朵花的组成结构图_请问一朵完整的花由哪几部分组成
  18. 计算机在档案管理中的作用,计算机技术在档案管理应用中的必要性
  19. 如何用PS制作电子邮票
  20. java玫瑰花代码_用java画布画玫瑰花

热门文章

  1. SAP Spartacus category navigation页面鼠标进入事件的处理
  2. Angular rxjs fromEvent使用的一个例子
  3. Angular 依赖注入的一个常见错误 NullInjectorError, No provider for XXX
  4. jsp文件的请求是如何被服务器的JSP容器转换成静态网页的
  5. 记一次SAP开发工程师给微软Azure报incident的体验
  6. 为SAP Analytics Cloud的story创建持久化页面
  7. Jerry答网友提问:SAP CRM WebClient UI里的EXT,STRUCT等含义
  8. when is completed field filled in the backend
  9. where is list binding done for Opportunity S2 view default 20 returns
  10. COM_TEXT_TIMESTAMP_SET