<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## 硬件中的分頁: 32位的線性地址被分成3個域: 高10位:頁目錄表 中間10位:頁表 低12位:頁表內偏移 使用二級頁表模式的目的在于減少每個進程頁表所需RAM數量。如果是一級頁表,則需高達220個表項,而二級模式只為進程實際使用的那些虛擬內存區請求頁表。 頁目錄項和頁表項有同樣的結構,均包含了一些屬性字段。 評:段頁屬性字段的設置很有意義,分段、分頁這種將內存結構化、組織化的方式,同時可以增加對某一段或頁的屬性描述信息,對于內存管理來說很有意義,這種組織內存的方法思路,正如行政區域的劃分。 ### 物理地址擴展(PAE)分頁機制: 這一部分在我的另一篇博文中有提到:[http://blog.csdn.net/crazyingbird/article/details/7175559](http://blog.csdn.net/crazyingbird/article/details/7175559) ### 硬件高速緩存: 為了縮小CPU和RAM之間的速度不匹配,引入了硬件調整緩沖內存。 多處理器系統的每一個處理器都有一個單獨的硬件高速緩存,它們需要額外的硬件電路,用于保持不同CPU之間的高速緩存內容的同步。只要一個CPU修改了它的硬件高速緩存,它就必須檢查同樣的數據是否包含在其它的硬件高速緩存中,如果是,它必須通知其它CPU用適當的值對其更新,這種活動叫做高速緩存偵聽。這些活動由硬件處理,內核無需關心。 Linux對于所有的頁框都啟用高速緩存,對于寫操作總是采用加回寫策略。 ### 轉換后援緩沖器: 記錄上一次線性地址轉換得到的相應的物理地址,以便以后對同一線性地址的引用可以快速地得到轉換。 在多處理器系統中,每個CPU都有自己的TLB,稱為該CPU的本地TLB,與硬件高速緩存相反,TLB中的對應項不必同步,這是因為運行在現有CPU上的進程可以使同一線性地址與不同物理地址發生聯系。 ## Linux中的分頁: 在2.6.10版本及之前,Linux采用三級分頁模型,從2.6.11版本開始,采用四級分頁模型: * 頁全局目錄(Page?Global?Directory) * 頁上級目錄(Page?Upper?Directory) * 頁中間目錄(Page?Middle?Directory) * 頁表(Page?Table) 對于沒有啟用物理地址擴展的32位系統,Linux取消了頁上級目錄和頁中間目錄,僅使用了兩級頁表。 啟用了物理地址擴展的32位系統,Linux取消了上級目錄,使用三級頁表。 對于64位系統,Linux根據硬件對線性地址位的劃分來決定采用三級或者四級頁表。 ### 物理內存布局: Linux內核安裝在RAM中從物理地址0x00100000開始的地方,也就是從第二個MB開始。 頁框0由BIOS使用,存放加電自檢期間檢查到的系統硬件。 物理地址從0x000a0000到0x000fffff的范圍通常留給BIOS全程,并且映射ISA圖形卡上的內部內在。 第一個MB內的其它頁框可能由特定計算機模型保留。 在啟動過程的早期階段,內核詢問BIOS并了解物理內存的大小,隨后,內核建立物理地址映射。 內核可能不會見到BIOS報告的所有物理內存:如果未啟用PAE支持來編譯,即使有更大的物理內存可供使用,內核也只能尋址4GB大小的RAM。 ### 進程頁表: 進程的線性地址空間分成兩部分: 從0x00000000到0xbfffffff的線性地址,無論進程運行在用戶態還是內核態都可以尋址; 從0xc0000000到0xffffffff的線性地址,只有內核態的進程才能尋址; 當進程運行在用戶態時,它產生的線性地址小于0xc0000000;當進程運行在內核態時,它執行內核代碼,所產生的地址大于等于0xc0000000。但某些情況下,內核為了檢索或存放數據必須訪問用戶態線性地址空間。 ### 內核頁表: 內核維持著一組自己使用的頁表,駐留在所謂的主內核頁全局目錄中,系統初始化后,這組頁表還從未被任何進程或者任何內核線程直接使用;確切的說,主內核頁全局目錄的最高目錄項部分作為參考模型,為系統中每個普通進程對應的頁全局目錄提供參考模型。 那么,內核如何初始化自己的頁表呢?內核映像剛剛被裝入內存后,CPU仍然運行于實模式,所以分頁功能沒有被啟用。 第一階段,內核創建一個有限的地址空間,包括內核的代碼段和數據段、初始頁表和用于存放動態數據結構的共128KB大小的空間。這個最小限度的地址空間僅夠將內核裝入RAM和對其它初始化的核心數據結構。 第二階段,內核充分利用剩余的RAM并適當建立分頁表。 由內核頁表所提供的最終映射必須把從0xc0000000,即第四個GB開始的線性地址轉化為從0開始的物理地址。 ### 固定映射的線性地址: 固定映射的線性地址基本上是一種類似于0xffffc000這樣的常量線性地址,其對應的物理地址不必等于線性地址減去0xc000000,而是可以以任意方式建立。因此,每個固定映射的線性地址都映射一個物理內存的頁框。內核使用固定映射的線性地址來代替指針變量。 每個固定映射的線性地址都存在線性地址第四個GB的末端。 ### 處理硬件高速緩存: 為了使高速緩存的命中率達到最優化,內核在下列決策中考慮體系結構: 一個數據結構中最常使用的字段放在該數據結構內的低偏移部分,以便它們能夠處于高速緩存的同一行中。 注:聚集存儲的數據結構大小可能大于行的大小。 當為一大組數據結構分配空間時,內核試圖把它們都存放在內存中,以便所有高速緩存行按同一方式使用。
                  <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>

                              哎呀哎呀视频在线观看