'CPU是如何訪問內存的?'

中央處理器 Linux 硬件 文章 數據結構 軟件 技術 底層軟件架構 2019-07-29
"
本文原創作者:原理君 公眾號:技術原理君

在之前的《Linux內存管理》文章中,我們大致講解了Linux內存管理的體系架構和映射過程。當然內存管理是一個複雜的模塊。它涉及到硬件的交互和複雜的軟件算法。本片文章我們就來講解下硬件原理和分頁管理。

CPU如果訪問內存?

答案很簡單,通過內存管理單元(MMU),我們先看一張很簡單的CPU訪問內存的流程圖:


"
本文原創作者:原理君 公眾號:技術原理君

在之前的《Linux內存管理》文章中,我們大致講解了Linux內存管理的體系架構和映射過程。當然內存管理是一個複雜的模塊。它涉及到硬件的交互和複雜的軟件算法。本片文章我們就來講解下硬件原理和分頁管理。

CPU如果訪問內存?

答案很簡單,通過內存管理單元(MMU),我們先看一張很簡單的CPU訪問內存的流程圖:


CPU是如何訪問內存的?


TLB:轉換lookaside 緩存,有了它可以讓虛擬地址到物理地址轉換速度大增。

從上圖中我們可以清楚的知道了,CPU,DDR,MMU它們三者之間的關係。CPU在MMU開啟的情況下,訪問的都是虛擬地址。首先通過MMU將虛擬地址轉換為物理地址,然後再通過總線上去訪問內存(我們都知道內存是掛在總線上的)。

那MMU是怎麼將虛擬地址轉換為物理地址呢?當然之前的文章也講過了,是通過頁表的方式。MMU從頁表中查出虛擬地址對應的物理地址是什麼,然後就去訪問物理內存了。

所以搞懂了上面的問題,也就解決了標題的問題:《CPU如何訪問內存的?》

頁表是什麼?頁表就是一種特殊的數據結構,它保存的是邏輯頁和物理頁幀的映射關係,而且每一個進程都各自擁有自己的頁表。

虛擬地址在我們看來是一個整體,其實不然,它是可以拆分的。可以分為:

  1. p(頁號),它可以存儲頁表的索引;
  2. d(偏移),可以在頁內進行地址偏移

我們假設頁大小為4KB,而且頁表只有一級,也就是一級頁表。那虛擬地址的拆分後的樣子是這樣的:


"
本文原創作者:原理君 公眾號:技術原理君

在之前的《Linux內存管理》文章中,我們大致講解了Linux內存管理的體系架構和映射過程。當然內存管理是一個複雜的模塊。它涉及到硬件的交互和複雜的軟件算法。本片文章我們就來講解下硬件原理和分頁管理。

CPU如果訪問內存?

答案很簡單,通過內存管理單元(MMU),我們先看一張很簡單的CPU訪問內存的流程圖:


CPU是如何訪問內存的?


TLB:轉換lookaside 緩存,有了它可以讓虛擬地址到物理地址轉換速度大增。

從上圖中我們可以清楚的知道了,CPU,DDR,MMU它們三者之間的關係。CPU在MMU開啟的情況下,訪問的都是虛擬地址。首先通過MMU將虛擬地址轉換為物理地址,然後再通過總線上去訪問內存(我們都知道內存是掛在總線上的)。

那MMU是怎麼將虛擬地址轉換為物理地址呢?當然之前的文章也講過了,是通過頁表的方式。MMU從頁表中查出虛擬地址對應的物理地址是什麼,然後就去訪問物理內存了。

所以搞懂了上面的問題,也就解決了標題的問題:《CPU如何訪問內存的?》

頁表是什麼?頁表就是一種特殊的數據結構,它保存的是邏輯頁和物理頁幀的映射關係,而且每一個進程都各自擁有自己的頁表。

虛擬地址在我們看來是一個整體,其實不然,它是可以拆分的。可以分為:

  1. p(頁號),它可以存儲頁表的索引;
  2. d(偏移),可以在頁內進行地址偏移

我們假設頁大小為4KB,而且頁表只有一級,也就是一級頁表。那虛擬地址的拆分後的樣子是這樣的:


CPU是如何訪問內存的?


下面我們來看下CPU,虛擬地址,頁表和物理地址之間的關係。看下圖:


"
本文原創作者:原理君 公眾號:技術原理君

在之前的《Linux內存管理》文章中,我們大致講解了Linux內存管理的體系架構和映射過程。當然內存管理是一個複雜的模塊。它涉及到硬件的交互和複雜的軟件算法。本片文章我們就來講解下硬件原理和分頁管理。

CPU如果訪問內存?

答案很簡單,通過內存管理單元(MMU),我們先看一張很簡單的CPU訪問內存的流程圖:


CPU是如何訪問內存的?


TLB:轉換lookaside 緩存,有了它可以讓虛擬地址到物理地址轉換速度大增。

從上圖中我們可以清楚的知道了,CPU,DDR,MMU它們三者之間的關係。CPU在MMU開啟的情況下,訪問的都是虛擬地址。首先通過MMU將虛擬地址轉換為物理地址,然後再通過總線上去訪問內存(我們都知道內存是掛在總線上的)。

那MMU是怎麼將虛擬地址轉換為物理地址呢?當然之前的文章也講過了,是通過頁表的方式。MMU從頁表中查出虛擬地址對應的物理地址是什麼,然後就去訪問物理內存了。

所以搞懂了上面的問題,也就解決了標題的問題:《CPU如何訪問內存的?》

頁表是什麼?頁表就是一種特殊的數據結構,它保存的是邏輯頁和物理頁幀的映射關係,而且每一個進程都各自擁有自己的頁表。

虛擬地址在我們看來是一個整體,其實不然,它是可以拆分的。可以分為:

  1. p(頁號),它可以存儲頁表的索引;
  2. d(偏移),可以在頁內進行地址偏移

我們假設頁大小為4KB,而且頁表只有一級,也就是一級頁表。那虛擬地址的拆分後的樣子是這樣的:


CPU是如何訪問內存的?


下面我們來看下CPU,虛擬地址,頁表和物理地址之間的關係。看下圖:


CPU是如何訪問內存的?


很簡單的吧,應該看懂了吧。我們可以發現如果採用一級頁表的話,每個進程需要維護一個4MB大小的頁表(我們可以算下,如果是32位平臺,地址空間大小為4GB,頁面大小為4KB,每個頁表項佔用4字節,所以4GB/4KB*4=4MB)。

因為每個進程都有自己的頁表,所以在多進程的情況下,內存消耗簡直驚人。所以一級頁表是不合理的。那有沒有優化的辦法呢?答案是有的,就是利用多級頁表,可以節省內存。

二級頁表就是將頁表再次分頁。再次舉例,將邏輯地址分為10位頁碼p1+10位頁碼p2+12位頁偏移。我們直接看圖吧。


"
本文原創作者:原理君 公眾號:技術原理君

在之前的《Linux內存管理》文章中,我們大致講解了Linux內存管理的體系架構和映射過程。當然內存管理是一個複雜的模塊。它涉及到硬件的交互和複雜的軟件算法。本片文章我們就來講解下硬件原理和分頁管理。

CPU如果訪問內存?

答案很簡單,通過內存管理單元(MMU),我們先看一張很簡單的CPU訪問內存的流程圖:


CPU是如何訪問內存的?


TLB:轉換lookaside 緩存,有了它可以讓虛擬地址到物理地址轉換速度大增。

從上圖中我們可以清楚的知道了,CPU,DDR,MMU它們三者之間的關係。CPU在MMU開啟的情況下,訪問的都是虛擬地址。首先通過MMU將虛擬地址轉換為物理地址,然後再通過總線上去訪問內存(我們都知道內存是掛在總線上的)。

那MMU是怎麼將虛擬地址轉換為物理地址呢?當然之前的文章也講過了,是通過頁表的方式。MMU從頁表中查出虛擬地址對應的物理地址是什麼,然後就去訪問物理內存了。

所以搞懂了上面的問題,也就解決了標題的問題:《CPU如何訪問內存的?》

頁表是什麼?頁表就是一種特殊的數據結構,它保存的是邏輯頁和物理頁幀的映射關係,而且每一個進程都各自擁有自己的頁表。

虛擬地址在我們看來是一個整體,其實不然,它是可以拆分的。可以分為:

  1. p(頁號),它可以存儲頁表的索引;
  2. d(偏移),可以在頁內進行地址偏移

我們假設頁大小為4KB,而且頁表只有一級,也就是一級頁表。那虛擬地址的拆分後的樣子是這樣的:


CPU是如何訪問內存的?


下面我們來看下CPU,虛擬地址,頁表和物理地址之間的關係。看下圖:


CPU是如何訪問內存的?


很簡單的吧,應該看懂了吧。我們可以發現如果採用一級頁表的話,每個進程需要維護一個4MB大小的頁表(我們可以算下,如果是32位平臺,地址空間大小為4GB,頁面大小為4KB,每個頁表項佔用4字節,所以4GB/4KB*4=4MB)。

因為每個進程都有自己的頁表,所以在多進程的情況下,內存消耗簡直驚人。所以一級頁表是不合理的。那有沒有優化的辦法呢?答案是有的,就是利用多級頁表,可以節省內存。

二級頁表就是將頁表再次分頁。再次舉例,將邏輯地址分為10位頁碼p1+10位頁碼p2+12位頁偏移。我們直接看圖吧。


CPU是如何訪問內存的?


訪問過程如下圖:


"
本文原創作者:原理君 公眾號:技術原理君

在之前的《Linux內存管理》文章中,我們大致講解了Linux內存管理的體系架構和映射過程。當然內存管理是一個複雜的模塊。它涉及到硬件的交互和複雜的軟件算法。本片文章我們就來講解下硬件原理和分頁管理。

CPU如果訪問內存?

答案很簡單,通過內存管理單元(MMU),我們先看一張很簡單的CPU訪問內存的流程圖:


CPU是如何訪問內存的?


TLB:轉換lookaside 緩存,有了它可以讓虛擬地址到物理地址轉換速度大增。

從上圖中我們可以清楚的知道了,CPU,DDR,MMU它們三者之間的關係。CPU在MMU開啟的情況下,訪問的都是虛擬地址。首先通過MMU將虛擬地址轉換為物理地址,然後再通過總線上去訪問內存(我們都知道內存是掛在總線上的)。

那MMU是怎麼將虛擬地址轉換為物理地址呢?當然之前的文章也講過了,是通過頁表的方式。MMU從頁表中查出虛擬地址對應的物理地址是什麼,然後就去訪問物理內存了。

所以搞懂了上面的問題,也就解決了標題的問題:《CPU如何訪問內存的?》

頁表是什麼?頁表就是一種特殊的數據結構,它保存的是邏輯頁和物理頁幀的映射關係,而且每一個進程都各自擁有自己的頁表。

虛擬地址在我們看來是一個整體,其實不然,它是可以拆分的。可以分為:

  1. p(頁號),它可以存儲頁表的索引;
  2. d(偏移),可以在頁內進行地址偏移

我們假設頁大小為4KB,而且頁表只有一級,也就是一級頁表。那虛擬地址的拆分後的樣子是這樣的:


CPU是如何訪問內存的?


下面我們來看下CPU,虛擬地址,頁表和物理地址之間的關係。看下圖:


CPU是如何訪問內存的?


很簡單的吧,應該看懂了吧。我們可以發現如果採用一級頁表的話,每個進程需要維護一個4MB大小的頁表(我們可以算下,如果是32位平臺,地址空間大小為4GB,頁面大小為4KB,每個頁表項佔用4字節,所以4GB/4KB*4=4MB)。

因為每個進程都有自己的頁表,所以在多進程的情況下,內存消耗簡直驚人。所以一級頁表是不合理的。那有沒有優化的辦法呢?答案是有的,就是利用多級頁表,可以節省內存。

二級頁表就是將頁表再次分頁。再次舉例,將邏輯地址分為10位頁碼p1+10位頁碼p2+12位頁偏移。我們直接看圖吧。


CPU是如何訪問內存的?


訪問過程如下圖:


CPU是如何訪問內存的?


總結

CPU訪問內存的原理,只是從原理上點到為止。如想深入,後期文章我會出文章!敬請期待!

"

相關推薦

推薦中...