91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Linux內存管理和尋址的概念是什么

發布時間:2021-12-07 14:07:05 來源:億速云 閱讀:135 作者:iii 欄目:開發技術

本篇內容主要講解“Linux內存管理和尋址的概念是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Linux內存管理和尋址的概念是什么”吧!

    1.概念

    內存管理模式

    段式:內存分為了多段,每段都是連續的內存,不同的段對應不用的用途。每個段的大小都不是統一的,會導致內存碎片和內存交換效率低的問題。

    頁式:內存劃分為多個內存頁進行管理,如在 Linux 系統中,每一頁的大小為 4KB。由于分了頁后,就不會產生細小的內存碎片。但是仍然也存在內存碎片問題。

    段頁式:段式和頁式結合。

    地址類型劃分

    邏輯地址:程序所使用的地址,通常是沒被段式內存管理映射的地址,稱為邏輯地址

    線性地址:通過段式內存管理映射的地址,稱為線性地址,也叫虛擬地址

    虛擬地址:通過段式內存管理映射的地址,稱為線性地址,也叫虛擬地址

    物理地址:物理內存地址

    說明:

    Inetel處理器中,邏輯地址是「段式內存管理」轉換前的地址,線性地址則是「頁式內存管理」轉換前的地址。

    段式內存管理映射而成的地址不再是“物理地址”了,Intel 就稱之為“線性地址”(也稱虛擬地址)。于是,段式內存管理先將邏輯地址映射成線性地址,然后再由頁式內存管理將線性地址映射成物理地址。

    linux內存主要是頁式內存管理,同時也有涉及段式機制。當前Linux內核所采取的辦法是使段式映射的過程實際上不起什么作用。

    Intel最早處理器80286是純段式管理,80386段式和頁式均存在。

    Linux內存管理和尋址的概念是什么

    2.頁式管理

    x86架構32位cpu

    二級頁表選址方式,一個內存頁4KB大小,一級頁目錄表1024項,二級頁表1024項,一個頁表項4字節。一級頁目錄表項全部分配,二級頁表在需要的時候創建。(局部性原理)。

    虛擬地址32位

    10+10+12,分別索引1級頁表號,2級頁表項,記錄物理基地址的偏移地址。使用PAE機制之后32bit系統支持最大的內存是64GB(地址是32+4=36位)。

    線性地址尋址物理地址步驟

    先根據10位尋址1級頁表號,1級頁表號中記錄了2級頁表的地址

    找到2級頁表地址后,接著根據虛擬地址的另10位尋找2級頁表中表項的位置

    找到2級頁表的表項之后,表項中記錄了該虛擬地址映射物理地址的起始地址,表項的大小是4字節32bit

    根據找到的物理地址的起始地址結合虛擬地址的后12位作為偏移計算出最終的物理地址

    Linux內存管理和尋址的概念是什么

    x86架構 64位cpu

    存在更多級頁表

    全局頁目錄項 PGD(Page Global Directory上層頁目錄項 PUD(Page Upper Directory)中間頁目錄項 PMD(Page Middle Directory)頁表項 PTE(Page Table Entry)

    線性地址尋址物理地址步驟

    線性地址為48bit,最大物理地址為52bit,實際物理內存地址總線寬度是40bit,也就是支持1TB物理內存x86_64有四級頁表,原理同x86系統,也是一層層的尋址CR3寄存器保存最高層一級表的起始物理地址,因此尋址首先就是要獲取到CR3寄存器中的值每個PTE表項的大小是8個字節也就是64bit

    Linux內存管理和尋址的概念是什么

    TLB

    在 CPU 芯片中,加入了一個專門存放程序最常訪問的頁表項的 Cache,這個 Cache 就是 TL(Translation Lookaside Buffer) 。通常稱為頁表緩存、轉址旁路緩存、快表等。那么在CPU的內存管理單元MMU尋址時,會先查 TLB,如果沒找到,才會繼續查常規的頁表。

    專有名詞

    PDT:頁目錄表,多級頁表一級頁表,32bit系統有1024個頁目錄
    PTT:頁表項表,多級頁表二級頁表,32bit系統有每個頁目錄下有1024個頁表項,每個表項4個字節
    PDE:頁表的基址,是PDT中一項
    PTE:是頁的基址,是PTT中一項
    GDT:全局描述符表,邏輯地址轉為線性地址用到
    LDT:局部描述符表,邏輯地址轉為線性地址用到

    Linux內存管理和尋址的概念是什么

    3.地址劃分

    32系統
    內核1G: 0xC0 00 00 01 - 0xFF FF FF FF
    用戶3G: 0x00 00 00 00 - 0xC0 00 00 00
    0xC0 00 00 00 == 3G

    64位系統:
    內核128T: 0xFF FF 80 00 00 00 00 00 - 0xFF FF FF FF FF FF FF FF (高位)
    0xFF FF 7F FF FF FF FF FF - 0xFF FF FF FF FF FF FF FF(自己計算)

    用戶128T: 0x00 00 00 00 00 00 00 00 - 0x00 00 7F FF FF FF FF FF (低位)
    0x00 00 80 00 00 00 00 00 - 0x00 00 80 00 00 00 00 00 (自己計算)

    0x00 00 7F FF FF FF FF FF == 127T
         疑問:64位系統128T是分界線是127T?

    訪問權限
    進程在用戶態時,只能訪問用戶空間內存
    只有進入內核態后,才可以訪問內核空間的內存

    PAE機制

    CPU位寬指的是一個時鐘周期內CPU能處理的二進制位數,普通場景中32位系統CPU的地址總線可以是32位,但是引入了PAE機制之后,16位CPU的地址總線位寬可以是20位(物理內存1M),32位CPU的地址總線可以是36位(物理內存64GB),64位CPU的地址總線位寬可以是40位(物理內存1TB)。因此我們不能簡單的說32位系統只支持最大4GB的內存條。

    4. 調試

    程序寄存器

    cs:是代碼段寄存器
    ds:是數據段寄存器
    ss:是堆棧段寄存器
    es:是擴展段寄存器
    fs:是標志段寄存器  32位之后才有
    gs:是全局段寄存器 32位之后才有

    示例一個內核宕機的日志:

    RIP: 0010:[]  [] xxxxxxxxxx+0x69/0x70
    RSP: 0018:ffff886241737d98  EFLAGS: 00010246
    RAX: ffff880034814d40 RBX: ffff881fc6248740 RCX: 0000000000000200
    RDX: 0000000000000000 RSI: 0000000000000286 RDI: ffff881fc6381858
    RBP: ffff886241737d98 R08: ffff886241734000 R09: 0000000000000000
    R10: ffff880034814d40 R11: 0000000000000200 R12: ffff881fc62487a0
    R13: 0000000000000000 R14: 00007fff86cb6260 R15: ffff881fc6381858
    FS:  00007f78b59b8720(0000) GS:ffff885ffe3c0000(0000) knlGS:0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 00007f690a057180 CR3: 0000006208985000 CR4: 00000000003627e0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400

    查看程序寄存器

    使用GDB隨意調試一個linux 32位上的ELF32的可執行文件,使用info r命令查看一下寄存器情況:

    Linux內存管理和尋址的概念是什么

    段寄存器有0x23和0x2b兩種情況:

    十六進制:0023
    二進制:0000000000100 0 11 - 段序號:4 - 表類型:GDT - 特權級:Ring3
    十六進制:002B
    二進制:0000000000101 0 11 - 段序號:5 - 表類型:GDT - 特權級:Ring3

    段序號:從第四位開始  表類型:第三位  特權級:第1、2位

    Linux下沒有找到可以直接用什么命令或者工具查看GDT的方式,于是去源代碼中尋找答案:

    Linux內存管理和尋址的概念是什么

    看到了嗎,這兩項所描述的段和Windows一樣,基地址為0,大小為4GB。

    Windows和Linux都選擇了通過這種方式架空了CPU的分段內存管理機制。

    但需要說明一下的時,雖然兩個操作系統都是這種情況,但并不意味著段機制徹底沒用到,CPU的任務管理TSS還是需要用到,這一點大家知道就行了,在linux64位系統下分段機制不被待見,但是操作系統仍然會保持先分段再分頁的尋址方式。

    到此,相信大家對“Linux內存管理和尋址的概念是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    沂源县| 陇南市| 榆中县| 林州市| 邵阳市| 襄汾县| 海丰县| 收藏| 志丹县| 基隆市| 宝坻区| 佛山市| 天长市| 石渠县| 寻乌县| 桐乡市| 阿尔山市| 丽水市| 巨鹿县| 建宁县| 靖边县| 庆城县| 浦东新区| 汝阳县| 绍兴市| 洪江市| 景德镇市| 渑池县| 临夏县| 陵川县| 互助| 工布江达县| 马公市| 山阴县| 昌都县| 闻喜县| 成都市| 惠东县| 托克逊县| 桂平市| 体育|