linux0.12之内存管理(1)-整体框架思路
来源:互联网 发布:什么是双色球密码算法 编辑:程序博客网 时间:2024/06/06 06:34
内存管理一直是本人比较佩服linus的地方。为此先看linux0.11版本,又看了0.12版本,基本思路一样,差异性会单独列出来。
本篇博客只是梳理一下大体思路,具体函数分析,放在后面的博客。
一、 从实模式到保护模式谈起
1、简单讲实模式,是16位寻址的访问方式,保护模式是32位的访问方式。在linux0.12的启动代码中bootsect和setup是工作在实模式下,之后的所有代码都运行在保护模式之下。
不管哪种模式,访问内存都是一种映射的思想,所以实模式和保护模式就是映射算法的差别(我的看法)。
实模式下如何让pc指针进行访问内存,
段<<4+偏移地址
段寄存器比如ds,对应的偏移量为si,寻址标识为ds:si,
段是一个16位的寄存器,所以左移4位,所以在实模式下最大寻址为1M内存大小,为了寻址更大内存,很明显这种映射算法就不能满足了。
2、为了解决这个问题,x86硬件也提出了解决方案。
提出了32位的线性地址的概念,这样就可最大寻址4G的内存空间,看看如何实现的。
先看看此时段寄存器此时的结构
低三位暂不考虑,就是一些标志位,高13位为索引为。
X86拥有一个GDT表,这个表就是用来生成线性地址的,这个表每个cpu只有一个,其中由很多表项组成,每个表项为2个32bit组成。表项结构如下:
刚刚的段寄存器的高13位就是用来寻址在GDT表中,哪一个表项。
GDT表项中的段基址组成32位的线性地址。
还有一个问题就是段寄存器给出的只是GDT表项的偏移地址,而GDT的基地址是由一个专门寄存器(GDTR)控制的。
所以基本框图如下
大体了解实模式和保护模式的寻址方式,x86还给出了寄存器CR0用于标志什么时候进入实模式什么时候进入保护模式。
线性地址到真实的内存还有一定距离,也就是物理地址。
X86也提出一套机制,就是将物理内存分页,将线性地址映射到物理内存上。采用两级分页,
具体实现框图为
上面两种映射方式就是常常将的分段映射和分页映射。
具体如何实现,下一篇分析源码
- linux0.12之内存管理(1)-整体框架思路
- Linux0.12内核之内存管理(2)
- Linux0.12内核之内存管理(3)
- linux0.11之内存管理
- linux0.12之内存管理(2)-再理解分段分页
- 框架管理基础之内存映射
- Linux 之内存管理(1)
- 操作系统之内存管理1
- Memcached源码分析之内存管理(1)
- new delete与malloc free之内存管理(1)
- 深入Linux内核架构之内存管理(1)
- linux-0.12内核之内存管理(1)
- Boost之内存管理学习(一)
- Boost之内存管理学习(二)
- OC之内存管理(笔记)
- 操作系统之内存管理(一)
- 操作系统之内存管理(未完成)
- IOS开发之内存管理(2)
- Notification(通知栏)
- 各种排序算法之比较
- 运行效率啊-2分钟与475毫秒的对比
- 架构师知识体系(3)--系统架构管理实践
- Python学习笔记 - 列表生成式listComprehensions
- linux0.12之内存管理(1)-整体框架思路
- 使用Jsoup 抓取页面的数据
- HDOJ 2005 第几天?(水)
- 谈谈对AOP的认识三——优化AOP,进一步解耦
- J2EE之EJB
- CString/string 区别及其转化
- J2SE总结
- WordPress主题 最新大前端DUX1.2主题官方版 取消加密 完美使用 首次分享
- 黑马day10 批处理Statement&PrepareStatement处理方式对比