物理内存
Linux为了有效使用机器中的物理内存,在系统初始化阶段内存被划分成几个功能区域:

< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGJyPgo8L3A+CjxwPsbk1tCjrExpbnV4xNq6y7PM0PLVvL7d1NrO78DtxNq05rXEv6rKvLK/t9ajrL3Tz8LAtMrHuanTssXMtci/6cnosbjKudPDtcQ8c3Ryb25nPrjfy9m7urPlx/g8L3N0cm9uZz6yv7fWo6jG5NbQ0qq/27P9z9S/qMTatOa6zVJPTSBCSU9Ty/nVvNPDtcTE2rTmtdjWt7e2zqejqTwvcD4KPHA+tbHSu7j2vfizzNDo0qq2wcihv+nJ6LG41tC1xMr9vt3KsaOsz7XNs7vhytfPyLDRyv2+3bbBtb2438vZu7qz5cf41tCho7Wx09DK/b7d0OjSqtC0tb2/6cnosbjJz8ilyrGjrM+1zbPSssrHz8i9q8r9vt23xbW9uN/L2bu6s+XH+NbQo6zIu7rz08m/6cnosbjH/bavs8zQ8tC0tb3P4NOmtcTJ6LG4yc+hozwvcD4KPHA+xNq05rXE1+6687K/t9bKx7/JuanL+dPQs8zQ8svmyrHJ6sfrus3KudPDtcTW98TatObH+KGjxNq6y9TayrnTw9b3xNq05sf4yrGjrMrXz8jSqs/yxNq6y8TatOa53MDtxKO/6czhs/bJ6sfro6yyotTayerH67PJuaa687e9xNzKudPDoaM8L3A+CjxwPiA8L3A+CjxwPtTaSW50ZWwgODAzODa8sNLUuvO1xDxzdHJvbmc+Q1BV1tDM4bmpwcs8L3N0cm9uZz7BvdbWxNq05rncwO2jqLXY1rex5Lu7o6nPtc2zo7rE2rTmPHU+t9a2zs+1zbM8L3U+us08dT631tKzz7XNszwvdT6ho8bk1tC31tKzudzA7c+1zbPKx7/J0aHU8bXEo6zTyc+1zbOzzNDy1LHNqLn9seCzzMC0yLe2qMrHt/GyydPDoaNMaW51eM2syrGyydPDwcu31rbOus231tKzu/rWxqGjPC9wPgo8cD4gPC9wPgo8cD48YnI+CjwvcD4KPHA+PGJyPgo8L3A+CjxoMT7E2rTmtdjWt7/VvOS4xcTuPC9oMT4KPHA+PGJyPgo8L3A+CjxwPtTaTGludXjE2rrL1tCjrNTavfjQ0LXY1rfTs8nkstnX98qxo6zO0sPH0qq31sflM9bWtdjWt7XEuMXE7qO6PHN0cm9uZz69+LPMtcQ8L3N0cm9uZz7Q6cTio6jC37yto6m12Na3oaI8c3Ryb25nPkNQVbXEPC9zdHJvbmc+z9/Q1LXY1rehojxzdHJvbmc+yrW8yrXEPC9zdHJvbmc+zu/A7bXY1rehozwvcD4KPGgyPjxicj4KPC9oMj4KPGgyPtDpxOK12Na3PC9oMj4KPHA+PGJyPgo8L3A+CjxwPtDpxOK12Na3ysfWuDxzdHJvbmc+08mzzNDysvrJ+rXEPC9zdHJvbmc+08k8dT62ztGh1PHX07rNts7E2sar0sa12Na3PC91PsG9sr+31tfps8m1xLXY1rehozwvcD4KPHA+o6jS8s6q1eLBvbK/t9bX6bPJtcS12Na3sqLDu9PQ1rG909PDwLS3w87Kzu/A7cTatOajrLb4ysfQ6NKqzai5/bfWts612Na3seS7u7v61sa78tOzyeS687LFttTTprW9zu/A7cTatOa12Na3yc+jrLnKsbuzxs6q0OnE4rXY1reho6OpPC9wPgo8cD48c3Ryb25nPtDpxOK12Na3v9W85Dwvc3Ryb25nPtPJPHN0cm9uZz5HRFQ8L3N0cm9uZz7Ts8nktcTIq77WtdjWt7/VvOS6zdPJPHN0cm9uZz5MRFQ8L3N0cm9uZz7Ts8nktcS+1rK/tdjWt7/VvOTX6bPJoaM8L3A+CjxwPqG+udjT2kdEVLrNTERUo6zH69LGsr0tPENQVbXEyrXEo8q90+uxo7ukxKPKvT6hvzwvcD4KPHA+IDwvcD4KPHA+SW50ZWwgODB4ODYgQ1BVv8nS1Mv30v0xNjM4NLj20aHU8bf7oaPI9MO/uPa2zrXEs6S2yLa8yKHX7rTzJiMyMDU0MDs0R0KjrNTy1+6089DpxOK12Na3v9W85Le2zqfKxzE2Mzg0KjRHQj02NFRCPC9wPgo8cD4gPC9wPgpDUFW1xMTatOa53MDtuPizzNDy1LHM4bmpwcvV4tH50ru49rPpz/O1xMTatObEo9DNo7o8YnI+CjxwPjxpbWcgc3JjPQ=="https://www.cppentry.com/upload_files/article/76/1_blxyv__.jpg" alt="\">
即程序员(无论是汇编的还是高级语言的)可以把内存分布看做是如上图所示,可以认为内存中只有自己的程序,自己独占CPU。
这是硬件和操作系统一起提供给程序员的简单抽象。
(底层的实现:地址变换、任务切换等对程序员是透明的)
逻辑地址是指由程序产生的与段相关的偏移地址部汾 http://www.2cto.com/kf/yidong/wp/" target="_blank" class="keylink">WPC91PqGj1NpJbnRlbLGju6TEo8q9z8K8tMrH1rizzNDy1rTQ0LT6wus8dT62zs/es6TE2rXExqvSxrXY1rc8L3U+oaM8L3A+CjxwPtOm08OzzNDy1LG99tDo0+vC37yttdjWt7Tyvbu1wKOstvi31rbOus231tKzu/rWxrbUy/vAtMu1zerIq824w/e1xKGjo6jTybzT1NjG98C0yejWw7fWts6jqTwvcD4KPHA+TGludXggMC4xMrj4w7+49r34s8y2vLuut9bBy8jdwb/OqjY0TUK1xNDpxOLE2rTmv9W85KGj0vK0y7P2z9a1xMLfvK212Na3t7bOp8rHMHgwMDAwMDAwtb0weDQwMDAwMDCho6OovLTJ6NbD0ru49kxEVMv5udzPvbXEt7bOp86qNjRNQqOpPC9wPgo8cD6jqM/W1Nq1xLLZ1/fPtc2zuPi9+LPMu662qLXE0OnE4sTatObKxzRHQqOstbHIu9Kyv8nS1Lj8tuCho6OpPC9wPgo8cD7T0NCp18rBz7K7x/i31sLfvK212Na3us3Q6cTitdjWt7XEuMXE7qOszbOzxsLfvK212Na3oaM8L3A+CjxwPiA8L3A+CjxoMj7P39DUtdjWtzwvaDI+CjxwPjxicj4KPC9wPgo8cD7P39DUtdjWt8rH0OnE4rXY1re1vc7vwO212Na3seS7u9auvOS1xNbQvOSy46Osysc8dT5DUFW/ydGw1re1xMTatOa/1bzk1tC1xLXY1rc8L3U+oaM8L3A+CjxwPrPM0PK0+sLru+Gy+sn6wt+8rbXY1rejqLvy1d/LtcrHts7W0LXExqvSxrXY1rejqaOsvNPJz8/g06a2zrXEu/m12Na3vs3J+rPJwcvSu7j2z9/Q1LXY1reho6Oo0ru49rbO1+6089PQNEe1xNDpxOK12Na3v9W85KOs1Nq809TYxvew0bPM0PK809TYyrGjrLrcyN3S19Gh1PHSu7j2v9XP0LXEts6jrMzuusNHRFS6zUxEVKOpPC9wPgo8cD7I57n7xvTTw8HLt9bSs7v61sajrMTHw7TP39DUtdjWt7/J0tTU2b6tseS7u7L6yfrSu7j2zu/A7bXY1reho8j0w7vT0Mb008O31tKzu/rWxqOsxMfDtM/f0NS12Na31rG9077NysfO78DttdjWt6GjPC9wPgo8cD5JbnRlbCA4MDM4NrXEz9/Q1LXY1re/1bzkyN3Bv86qNEdCoaM8L3A+CjxwPiA8L3A+CjxoMj7O78DttdjWtzwvaDI+CjxwPjxicj4KPC9wPgo8cD7O78DttdjWt8rH1riz9s/W1No8dT5DUFXN4rK/tdjWt9fcz9/Jz7XEPC91PtGw1rfO78DtxNq05rXEtdjWt9DFusWjrMrHtdjWt7Hku7u1xNfu1tW94bn7tdjWt6GjPC9wPgo8cD4gPC9wPgo8cD48YnI+CjwvcD4KPGgxPsTatOa31rbOu/rWxjwvaDE+CjxwPjxzdHJvbmc+PGJyPgo8L3N0cm9uZz48L3A+CjxwPjxzdHJvbmc+1NrKtcSjyr3Pwjwvc3Ryb25nPqOs0bDWt9K7uPbE2rTmtdjWt9b30qrKx8q508O2zrv51re6zcar0sYmIzIwNTQwO6Osts67+da3sbu05rfF1Nq2zrzEtObG99bQo6jI52Rzo6mjrLKix9K2zrXEs6S2yLG7ucy2qM6qNjRLQqGjts7E2sar0sa12Na3tOa3xdTayM7S4tK7uPa/ydPD09rRsNa3tcS8xLTmxvfW0KOoyOdzaaOpoaM8L3A+CjxpbWcgc3JjPQ=="https://www.cppentry.com/upload_files/article/76/1_2anpg__.jpg" alt="\">
在保护模式下,段寄存器中存放的不再是被寻址段的基地址,而是一个段描述符表中某一描述符项在表中的索引值。索引值指定的段描述符项中含有需要寻址的内存段的基地址、段的长度值、段的访问特权级等信息。(这样通过段描述符访问段中的信息,可检查安全性,则就是所谓的保护模式)
这样,在保护模式下寻址一个内存地址就需要比实模式下多一个环节,即需要使用段描述符表。
注意,如果你不在一个段描述符中定义一个内存线性地址空间区域,那么该地址区域就完全不能被寻址,CPU将拒绝访问该地址区域。

保存描述符项的描述符表有3种类型,每种用于不同目的。
IDT中断描述符表(Interrupt Descriptor Table),该表保存了定义中断或异常处理过程的段描述符。IDT表直接替代了8086系统中的中断向量表。(使得在跳转到中断程序时也进行权限检查。)
GDT全局描述符表(Globle Descriptor Table),该表可被所有程序用于引用访问一个内存段。
LDT局部描述符表(Local Descriptor Table),通常每个任务使用一个LDT表。每个LDT表为对应任务提供了更多的可用描述符项,因为也为每个任务提供了可寻址内存空间的范围。
这些表可以保存在线性地址空间的任何地方。为了让CPU能定位GDT表、IDT表和当前的LDT表,需要为CPU分别设置GDTR、IDTR和LDTR三个特殊寄存器。

可以看出,每个任务的局部描述符表LDT本身也是由GDT中描述符定义的一个内存段,在该段中存放着对应任务的代码段和数据段描述符,因此LDT段很短。同样,每个任务的任务状态段TSS也是由GDT中描述符定义的一个内存段。(TSS用于在任务切换时CPU自动保存或恢复相关任务的当前执行上下文)
内存分页管理
内存分页管理机制的基本原理是将CPU整个线性地址内存区域划分成4KB为1页的内存页面。程序申请使用内存时,系统就以内存页为单位进行分配。
为了在80x86保护模式下使用分页机制,需要把控制寄存器CR0的最高位置位。
系统,其CPU可以提供多达4GB的线性地址空间。
操作系统的内存管理(以下为一家之言,仅供参考)
有两套对内存管理的方式:
一、以Linux 0.12 内核为例(点我)
二、以Linux 2.x 内核为例(点我)