2015-10-31 30 views
1

當談到內核編程時,我有點不知所措,並且想知道是否有人能夠指引我以正確的方向開始在內核設置中實施內存管理。我目前正在研究一個玩具內核,並且正在對這個主題進行大量的研究,但是我對內存管理的主題有點困惑。它有很多不同的方面,如分頁和虛擬內存映射。是否有一個特定的順序,我應該實現的東西或任何的和不是? 我不是在尋找任何代碼或任何東西,我只需要指出正確的方向。任何幫助,將不勝感激。內核內存管理:我從哪裏開始?

+0

學習分頁:http://github.com/cirosantilli/x86-bare-metal-examples /blob/d1f11492c2d2828c9c713d75b6f173da955aafc3/paging.S –

回答

2

有多個方面,你應該分別考慮:

  • 管理可用的物理內存。
  • 管理內核及其數據結構所需的內存。
  • 管理每個進程的虛擬內存(空間)。
  • 管理任何進程所需的內存,即mallocfree

爲了能夠管理任何其他內存需求,您需要知道實際有多少物理內存以及它的哪些部分可供您使用。 假設您的內核由多引導兼容的引導加載程序加載,您將在引導加載程序中發現multiboot header中的這些信息(如果我沒有記錯,您會通過x86的eax)。 標題包含描述使用哪些存儲區域以及哪些可以自由使用的結構。

您還需要以某種方式存儲此信息,並跟蹤分配和釋放的內存。一個簡單的方法是維護一個位圖,其中位N指示是否使用從N * S(N + 1) * S - 1的(固定大小S)內存區域。當然,您可能想要在內核進步時使用更復雜的方法,如多級位圖或空閒列表,但上面的一個簡單位圖可以讓您開始。

此內存管理器通常只提供「大」大小的內存塊,通常爲4KB的倍數。這對於您習慣於從應用程序編程中習慣的mallocfree風格的動態內存分配來說當然是沒有用的。

由於動態內存分配將大大簡化內核的高級功能的實現(多任務,進程間通信......),您通常會爲內核編寫內存管理器。它提供了任意大小的內存塊的分配手段(kalloc)和釋放(kfree)。該內存來自使用上面的物理內存管理器分配的池。

以上所有內容都發生在內核中。您可能還想提供應用程序來執行動態內存分配。實現這一點與上述物理內存管理在概念上非常相似:

進程只能看到自己的虛擬地址空間。它的某些部分對於進程是不可用的(例如內核內存映射到的區域),但其中大部分將是「可以使用」(即,實際上沒有物理內存與其關聯)。至少內核需要提供應用程序來分配和釋放其內存地址空間的單個頁面。在對物理內存管理器的調用中分配頁面結果(底層,應用程序不可見),以及從請求頁面到這個新分配的內存的映射。

注意,儘管許多內核都提供其進程更復雜的訪問其自己的地址空間或直接在內核中執行以下任務。

能夠像以前一樣分配和釋放頁面(主要是4KB)不會幫助進行動態內存管理,但是和以前一樣,這通常由其他一些內存管理器處理,這些內存管理器正在使用這些大內存塊來提供較小大塊的應用程序。一個突出的例子是Doug Lea's allocator。像這些內存管理器通常被實現爲鏈接到每個應用程序的庫(最可能是標準庫的一部分)。

+0

謝謝,這有很大的幫助。 –