0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

淺析Linux系統(tǒng)中的內(nèi)存管理

冬至配餃子 ? 來(lái)源:廣廣的隨筆 ? 作者:廣廣的隨筆 ? 2022-08-17 16:27 ? 次閱讀

當(dāng)使用Inter 80x86微處理器時(shí),必須區(qū)分三種地址:

邏輯地址:有段基址和段偏移量組成。

線性地址:32位無(wú)符號(hào)整數(shù)。

物理地址

CPU通過(guò)分段單元將邏輯地址轉(zhuǎn)換為線性地址,再通過(guò)分頁(yè)單元將線性地址轉(zhuǎn)化為物理地址

硬件的分段單元

從80386CPU開(kāi)始,Intel微處理器能執(zhí)行兩種不同的地址轉(zhuǎn)換模式,分別稱為實(shí)模式(為了與早期OS兼容)和保護(hù)模式,這里重點(diǎn)放在保護(hù)模式上。

寄存器

一個(gè)邏輯地址由兩部分組成,一個(gè)段標(biāo)識(shí)符(16位)和一個(gè)相對(duì)地址的偏移量(32位),段寄存器是用來(lái)存放段選則符的,包括cs,ss,ds,es,fs,gs。

cs:代碼段寄存器,用于存放程序指令的段。

ss:棧段寄存器,指向當(dāng)前存放程序棧的段;什么是程序??臻g,即主要用來(lái) 存放函數(shù)和數(shù)組等。

ds:數(shù)據(jù)段寄存器,指向存放靜態(tài)數(shù)據(jù)(永久性不變的數(shù)據(jù))或者外部數(shù)據(jù)的段。

其它三個(gè)寄存器做一般用途,可以用來(lái)訪問(wèn)任意段。

cs寄存器還有一個(gè)兩位域,用來(lái)指明cpu的特權(quán)級(jí),linux中只有0和3級(jí),分別為內(nèi)核態(tài)和用戶態(tài)。

段描述符

占8字節(jié),段描述符被放在全局描述符表(GDT)或者局部描述符表(LDT)。

系統(tǒng)通常只定義一個(gè)GDT(其地址被存放在GDTR寄存器中),每個(gè)進(jìn)程可以有自己的LDT(其地址被存放在LDTR寄存器中)。

其中,系統(tǒng)段存儲(chǔ)內(nèi)核數(shù)據(jù)結(jié)構(gòu),任務(wù)狀態(tài)段用于保存處理器寄存器的內(nèi)容。

poYBAGL8pW-AGAWRAAHG9TXbiqo817.png

段選擇符

為了加速邏輯地址到線性地址的轉(zhuǎn)換,Intel處理器提供一種附加的非編程的寄存器(不能被程序員設(shè)置),這樣在訪問(wèn)段寄存器中段選擇符時(shí),就不能(不需要)訪問(wèn)GDT或LDT了。

poYBAGL8pZCADVOQAAB7_2jDXOg703.png

段單元

邏輯地址轉(zhuǎn)化為線性地址總覽:

poYBAGL8pZWAKmXeAACQTXbd8y8728.png

Linux中的段

Linux更喜歡分頁(yè)的方式,當(dāng)所有的進(jìn)程使用相同的段寄存器值時(shí),內(nèi)存管理變得更簡(jiǎn)單,它們能共享相同的線性地址。而且許多RISC處理器不支持段功能,Linux不好做移植。

硬件的分頁(yè)單元

分頁(yè)單元認(rèn)為所有的RAM被分成固定長(zhǎng)度的頁(yè)框,每一個(gè)頁(yè)框包含一頁(yè)。在Intel處理器中,通過(guò)設(shè)置CR0寄存器的PG標(biāo)志啟動(dòng)分頁(yè)。當(dāng)PG=0時(shí),線性地址就被解釋成物理地址。

常規(guī)分頁(yè)

從i80386起,Intel處理器的分頁(yè)單元處理4KB的頁(yè)。32位線性地址被分成三個(gè)域:目錄(10),頁(yè)表(10),偏移量(12)。

正在使用的頁(yè)目錄表的物理地址存放在處理器的CR3寄存器中。

pYYBAGL8pa2AEsipAAB19_aIcCI268.png

這里要說(shuō)明下,在頁(yè)目錄和頁(yè)表表項(xiàng)中由Page Size標(biāo)志為1,頁(yè)目錄項(xiàng)指的是4MB的頁(yè)框。如果Present為0,分頁(yè)單元就把這個(gè)線性地址存放在處理器的CR2寄存器中,并產(chǎn)生14號(hào)缺頁(yè)異常。

擴(kuò)展分頁(yè)

從奔騰處理器開(kāi)始,Intel80x86微處理器引進(jìn)了擴(kuò)展分頁(yè),它允許頁(yè)框大小為4KB或4MB(頁(yè)目錄10位,偏移量22位)。

pYYBAGL8pcCADBJEAABvfjdl1u0649.png

之后就是引入cache和TLB(計(jì)算機(jī)組成原理內(nèi)容),就不詳細(xì)說(shuō)了。

Linux的分頁(yè)

Linux采用三級(jí)分頁(yè),頁(yè)全局目錄(10),頁(yè)中間目錄(10),頁(yè)表(10),偏移量(13)。

poYBAGL8pdOAQmGMAACqMsGtvIM563.png

保留的頁(yè)框

內(nèi)核代碼和數(shù)據(jù)結(jié)構(gòu)存放在一組保留的頁(yè)框中,這些頁(yè)框所含的頁(yè)從不動(dòng)態(tài)分配或者交換到內(nèi)存中。

作為一條常規(guī),Linux內(nèi)核被安裝在RAM物理地址0x00100000開(kāi)始的地方,為什么從這個(gè)地方開(kāi)始?

因?yàn)轫?yè)框0由BIOS使用,存放硬件配置。

物理地址0x000a0000到0x000fffff被BIO程序使用同時(shí)映射ISA上的顯存。

前1MB的其它頁(yè)框可能被保留用作特定的計(jì)算機(jī)模式。

為了避免把內(nèi)核裝入一組不連續(xù)的頁(yè)框,Linux更愿跳過(guò)第1MB的RAM。(內(nèi)核小于1MB _text---_etext)

pYYBAGL8peaAbwPJAAB8xS_WqQA758.png



審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5253

    瀏覽量

    119212
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10702

    瀏覽量

    209422
  • 微處理器
    +關(guān)注

    關(guān)注

    11

    文章

    2221

    瀏覽量

    81986
  • Linux系統(tǒng)
    +關(guān)注

    關(guān)注

    4

    文章

    587

    瀏覽量

    27183
  • LINUX內(nèi)核
    +關(guān)注

    關(guān)注

    1

    文章

    315

    瀏覽量

    21558
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux內(nèi)存管理是什么,Linux內(nèi)存管理詳解

    Linux內(nèi)存管理 Linux內(nèi)存管理是一個(gè)非常復(fù)雜的過(guò)程,主要分成兩個(gè)大的部分:內(nèi)核的
    的頭像 發(fā)表于 05-11 17:54 ?5832次閱讀
    <b class='flag-5'>Linux</b>的<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>是什么,<b class='flag-5'>Linux</b>的<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>詳解

    走進(jìn)Linux內(nèi)存系統(tǒng)探尋內(nèi)存管理的機(jī)制和奧秘

    Linux 內(nèi)存是后臺(tái)開(kāi)發(fā)人員,需要深入了解的計(jì)算機(jī)資源。合理的使用內(nèi)存,有助于提升機(jī)器的性能和穩(wěn)定性。本文主要介紹Linux 內(nèi)存組織結(jié)構(gòu)
    的頭像 發(fā)表于 01-05 09:47 ?1519次閱讀

    關(guān)于Linux內(nèi)存管理的詳細(xì)介紹

    Linux內(nèi)存管理是指對(duì)系統(tǒng)內(nèi)存的分配、釋放、映射、管理、交換、壓縮等一系列操作的
    發(fā)表于 03-06 09:28 ?1020次閱讀

    Linux內(nèi)核的內(nèi)存管理詳解

    內(nèi)存管理的主要工作就是對(duì)物理內(nèi)存進(jìn)行組織,然后對(duì)物理內(nèi)存的分配和回收。但是Linux引入了虛擬地址的概念。
    發(fā)表于 08-31 14:46 ?624次閱讀
    <b class='flag-5'>Linux</b>內(nèi)核的<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>詳解

    嵌入式Linux內(nèi)存管理是什么

    點(diǎn)擊 嵌入式 Linux 內(nèi)存管理
    發(fā)表于 11-05 07:01

    淺析SoC中斷與Linux內(nèi)存管理

    什么是SoC中斷?Linux內(nèi)存管理包括哪些?linux的進(jìn)程調(diào)度時(shí)機(jī)有哪些?
    發(fā)表于 11-30 06:18

    linux內(nèi)存管理機(jī)制淺析

    本內(nèi)容介紹了arm linux內(nèi)存管理機(jī)制,詳細(xì)說(shuō)明了linux內(nèi)核內(nèi)存管理,
    發(fā)表于 12-19 14:09 ?73次下載
    <b class='flag-5'>linux</b><b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>機(jī)制<b class='flag-5'>淺析</b>

    linux內(nèi)存管理

    linux內(nèi)存管理
    發(fā)表于 10-24 11:12 ?3次下載
    <b class='flag-5'>linux</b><b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>

    基于Linux內(nèi)存管理與Android內(nèi)存分配機(jī)制

    Android采取了一種有別于Linux的進(jìn)程管理策略,有別于Linux的在進(jìn)程活動(dòng)停止后就結(jié)束該進(jìn)程,Android把這些進(jìn)程都保留在內(nèi)存
    的頭像 發(fā)表于 03-30 14:52 ?6135次閱讀

    你知道linux內(nèi)存管理基礎(chǔ)及方法?

    linux內(nèi)存管理采取的分頁(yè)存取機(jī)制,會(huì)將內(nèi)存不經(jīng)常使用的數(shù)據(jù)塊交換到虛擬內(nèi)存
    發(fā)表于 04-28 17:12 ?1087次閱讀

    嵌入式 Linux 內(nèi)存管理

    點(diǎn)擊 嵌入式 Linux 內(nèi)存管理
    發(fā)表于 11-02 10:36 ?12次下載
    嵌入式 <b class='flag-5'>Linux</b> <b class='flag-5'>中</b>的<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>

    Linux內(nèi)存管理體系介紹

    內(nèi)存是計(jì)算機(jī)最重要的資源之一,內(nèi)存管理是操作系統(tǒng)最重要的任務(wù)之一。內(nèi)存管理并不是簡(jiǎn)單地
    的頭像 發(fā)表于 08-08 09:28 ?1481次閱讀

    Linux內(nèi)存管理的詳細(xì)介紹分享

    內(nèi)存管理是計(jì)算機(jī)系統(tǒng)負(fù)責(zé)管理系統(tǒng)內(nèi)存資源的一種機(jī)制
    的頭像 發(fā)表于 05-29 14:09 ?1587次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>的詳細(xì)介紹分享

    Linux內(nèi)存管理系統(tǒng)開(kāi)發(fā)必知的3個(gè)結(jié)構(gòu)概念

    Linux內(nèi)存管理系統(tǒng)使用節(jié)點(diǎn)(node)、區(qū)域(zone)和頁(yè)(page)三級(jí)結(jié)構(gòu)描述物理內(nèi)存
    的頭像 發(fā)表于 08-28 09:34 ?758次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>中</b><b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>子<b class='flag-5'>系統(tǒng)</b>開(kāi)發(fā)必知的3個(gè)結(jié)構(gòu)概念

    Linux 內(nèi)存管理總結(jié)

    一、Linux內(nèi)存管理概述 Linux內(nèi)存管理是指對(duì)系統(tǒng)
    的頭像 發(fā)表于 11-10 14:58 ?435次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>總結(jié)