<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [TOC] ## 只有 32Kb 內存,如果抽象出64Kb內幕才能讓進程使用 1. 將內存分成很多小塊,進程可以使用離散的小塊 2. 解決進程輪流使用內存( Swapping小塊) ## 虛擬地址空間(頁表) - 程序運行在虛擬地址空間,遇到內存地址就映射到物理空間。 `(page,offset) = (frame,offset)` ![](https://img.kancloud.cn/fc/d5/fcd5ca3aeea5896f35db18a9c30c9976_800x513.png) 1. 頁表:使用數據結構,為虛擬內存地址,offset=4表示在頁框中的第4塊 2. 頁框,表示真實內存地址 3. 每塊內存的大小為4k **頁表項** 頁表的每一項叫做頁表項 ![](https://img.kancloud.cn/00/de/00de4e141ad12f4786027ec2cb3c9e40_400x102.png) 1. 高速緩存禁止位:允不允許L1、L2、L3等高速緩存緩存頁框 2 訪問位:有沒有被讀過 3. 修改位:有沒有被寫過( dirty ) 4. 保護位:可不可以寫入 4. 「在不在」位:對應的 Frame目前在不在內存中 - 表示frame在不在真實的內存中 - 如果不在,會進行[缺頁中斷,]調度程序在去把真實的內存拿出來 ## 舉例 ![](https://img.kancloud.cn/73/8b/738b0939d34cd7471a0e01a9cf7bc22c_800x691.png) 指令: ``` MOV R0 10000 ``` 將內存地址10000的值拷貝到寄存器R0 答: 找虛擬內存的地址 ``` 10000/(4*1024)=2 // 表示在頁表的第3塊,標識從0來時 10000 -2*(4*1024)-1808 // 在第三塊的 1808 地址 ``` ![](https://img.kancloud.cn/0c/e5/0ce5eedb22206911e33d98845ac8f826_250x128.png) 虛擬地址: 00010 表示第三塊, 11100010000 表示1808 物理地址: 000110 表示第六塊,11100010000 表示1808 問題:每次查找地址都要計算兩次 使用內存管理單元( Memory Management Unit),用硬件計算 ## 內存管理單元( Memory Management Unit) - MMU位于CPU內部,可以通過硬件電路完成內存映射 ![](https://img.kancloud.cn/38/a5/38a53580ffd5cd9801c1351eec67b574_400x248.png) 處理過程 ``` addr -> mmu(addr) ->newAddr 既 (page,x) -> mmu(page,x) -> (frame,x) ``` ### 如果工作 - 系統讓MMU 把內存頁表加載進來 - 虛擬地址通過MMU后被映射成物理地址 - 0-1代表的是存在/不存在,如果虛擬地址頁號指向一個**不存在 frame**,那么會觸發操作系統的**缺頁中斷** ![](https://img.kancloud.cn/35/9f/359f9dd3fb73081ba4a5e17419818c15_948x934.png) ### MMU中的頁表是怎么來的? - 操作系統告訴MMU頁表在內存中的位置→MMU加載頁表→MMU會自己利用頁表進行地址轉換 - CPU對MMU對頁表中條目數量大小有限制,有的會有幾個M,也可以更大 - 操作系統內核中有負責MMU管理模塊 ## 缺頁中斷 ![](https://img.kancloud.cn/e7/76/e7763c2208b60a82ab1e3c0d622f9b44_800x543.png) 1. 進程觸發缺頁中斷 2. 內核空間中有專門處理中斷的程序調用用戶空間的頁面調度 3. 頁面調度從磁盤中獲取相關信息返回給中斷處理程序 4. 中斷處理程序再映射到 MMU 處理程序 ## 多級頁表 ![](https://img.kancloud.cn/cc/24/cc2473070d27b7b849ec23ba25055a7e_367x400.png) - MMU先用PT1在頂級頁表中查詢2級頁表在內存中位置 - MMU利用PT2在二級頁表中查詢 frame的值 - MMU根據 frame的值將虛擬地址映射到物理地址 多級頁表能省空間嗎? - 如果只有1級,比如4G/4kb的情況需要1M的頁表條目 - 如果2級頂級頁表需要1k條目每個二級頁表需要1k條目,一共需要1k個二級頁表(這是不是說明多級頁表并沒有節省空間?) - 多級頁表是個跳躍結構,因為進程不會把所有的4G內存都占滿,于是節省了空間。 ### 塊表 (加速MMU讀寫) 塊表,小型硬件設備——也叫轉換檢測緩沖區( Translation Lookaside Buffer),可以加速MMU的讀寫 塊表內部 | 有效 | Page | 修改位 | 保護位 | Frame | | --- | ---| --- | --- | ---| | 1 | 100 | 1 | RW | 66 | | 1 | 150 | 1 | R | 44 | 第一次MMU 后,會把值存入塊表內部,后期調用如果命中,則實現加速
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看