📄 3.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">
<META NAME="GENERATOR" CONTENT="《良友》v2.1, 作者:安富国,http://winking.126.com">
<TITLE>内存</TITLE>
</HEAD>
<BODY style="font-family: 宋体; font-size: 9pt">
<CENTER><TABLE CELLSPACING=10 CELLPADDING=10 WIDTH="60%" BGCOLOR="#FFB693" >
<TR>
<TD ALIGN=CENTER><FONT SIZE=+2><!--标题由此开始-->内存</TD>
</TR>
</TABLE></CENTER>
<p><h3>目 录</h3>
<!--目录由此开始--><A NAME="Content" ID="Content"></A>
<OL><LI><A HREF="#I376">内存</A></LI>
<OL><LI><A HREF="#I377">内存管理子系统导读from aka</A></LI>
<LI><A HREF="#I378">用户态</A></LI>
<LI><A HREF="#I379">内核页目录的初始化</A></LI>
<LI><A HREF="#I380">内核线程页目录的借用</A></LI>
<LI><A HREF="#I381">用户进程内核页目录的建立</A></LI>
<LI><A HREF="#I382">内核页目录的同步</A></LI>
<LI><A HREF="#I383">mlock代码分析</A></LI>
<LI><A HREF="#I384">memory.c</A></LI>
<OL><LI><A HREF="#I385">copy_page</A></LI>
<LI><A HREF="#I386">clear_page_tables</A></LI>
<LI><A HREF="#I387">oom</A></LI>
<LI><A HREF="#I388">free_page_tables</A></LI>
<LI><A HREF="#I389">new_page_tables</A></LI>
<LI><A HREF="#I390">copy_one_pte</A></LI>
<LI><A HREF="#I391">copy_pte_range</A></LI>
<LI><A HREF="#I392">copy_pmd_range</A></LI>
<LI><A HREF="#I393">copy_page_range</A></LI>
<LI><A HREF="#I394">free_pte</A></LI>
<LI><A HREF="#I395">forget_pte</A></LI>
<LI><A HREF="#I396">zap_pte_range</A></LI>
<LI><A HREF="#I397">zap_pmd_range</A></LI>
<LI><A HREF="#I398">zap_page_range</A></LI>
<LI><A HREF="#I399">zeromap_pte_range等</A></LI>
<LI><A HREF="#I400">remap_pte_range等</A></LI>
<LI><A HREF="#I401">put_dirty_page</A></LI>
<LI><A HREF="#I402">handle_mm_fault</A></LI>
</OL><LI><A HREF="#I403">mmap.c</A></LI>
<LI><A HREF="#I404">伙伴(buddy)算法</A></LI>
<LI><A HREF="#I405">页目录处理的宏</A></LI>
<LI><A HREF="#I406">MM作者的文章</A></LI></OL></OL>
<hr><br><A NAME="I376" ID="I376"></A><center><b><font size=+2>内存</font></b></center><br>
内存管理系统是操作系统中最为重要的部分,因为系统的物理内存总是少于系统所需要的内存数量。虚拟内存就是为了克服这个矛盾而采用的策略。系统的虚拟内存通过在各个进程之间共享内存而使系统看起来有多于实际内存的内存容量。<p>
虚拟内存可以提供以下的功能:<p>
*广阔的地址空间。<br>
系统的虚拟内存可以比系统的实际内存大很多倍。<p>
*进程的保护。<br>
系统中的每一个进程都有自己的虚拟地址空间。这些虚拟地址空间是完全分开的,这样一个进程的运行不会影响其他进程。并且,硬件上的虚拟内存机制是被保护的,内存不能被写入,这样可以防止迷失的应用程序覆盖代码的数据。<p>
*内存映射。<br>
内存映射用来把文件映射到进程的地址空间。在内存映射中,文件的内容直接连接到进程的虚拟地址空间。<p>
*公平的物理内存分配。<br>
内存管理系统允许系统中每一个运行的进程都可以公平地得到系统的物理内存。<p>
*共享虚拟内存。<br>
虽然虚拟内存允许进程拥有自己单独的虚拟地址空间,但有时可能会希望进程共享内存。<p>
linux仅仅使用四个段<p>
两个代表 (code 和 data/stack)是内核空间从[0xC000 0000] (3 GB)到[0xFFFF FFFF] (4 GB)<br>
两个代表 (code 和 data/stack)是用户空间从[0] (0 GB) 到 [0xBFFF FFFF] (3 GB)<p>
__<br>
4 GB--->| | |<br>
| Kernel | | 内核空间 (Code + Data/Stack)<br>
| | __|<br>
3 GB--->|----------------| __<br>
| | |<br>
| | |<br>
2 GB--->| | |<br>
| Tasks | | 用户空间 (Code + Data/Stack)<br>
| | |<br>
1 GB--->| | |<br>
| | |<br>
|________________| __|<br>
0x00000000<br>
内核/用户 线性地址<p>
<br>
linux可以使用3层页表映射,例如在高级的I64服务器上,但是i386体系结构下只有2层有实际意义:<p>
------------------------------------------------------------------<br>
线性地址<br>
------------------------------------------------------------------<br>
\___/ \___/ \_____/<p>
PD 偏移 PF 偏移 Frame 偏移<br>
[10 bits] [10 bits] [12 bits]<br>
| | |<br>
| | ----------- |<br>
| | | Value |----------|---------<br>
| | | | |---------| /|\ | |<br>
| | | | | | | | |<br>
| | | | | | | Frame 偏移 |<br>
| | | | | | \|/ |<br>
| | | | |---------|<------ |<br>
| | | | | | | |<br>
| | | | | | | x 4096 |<br>
| | | PF 偏移 |_________|------- |<br>
| | | /|\ | | |<br>
PD 偏移 |_________|----- | | | _________|<br>
/|\ | | | | | | |<br>
| | | | \|/ | | \|/<br>
_____ | | | ------>|_________| 物理地址<br>
| | \|/ | | x 4096 | |<br>
| CR3 |-------->| | | |<br>
|_____| | ....... | | ....... |<br>
| | | |<p>
页目录表 页表<p>
Linux i386 分页<p>
注意内核(仅仅内核)线性空间就等于内核物理空间,所以如下:<p>
________________ _____<br>
| 其他内核数据 |___ | | |<br>
|----------------| | |__| |<br>
| 内核 |\ |____| 实际的其他 |<br>
3 GB --->|----------------| \ | 内核数据 |<br>
| |\ \ | |<br>
| __|_\_\____|__ Real |<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -