主要產品系列 |
操作系統的內存管理功能用于向操作系統提供一致的地址映射功能和內存頁面的申請、釋放操作。在嵌入式實時系統中,內存管理根據不同的系統,有不同的策略,對于有些系統支持的虛擬內存管理機制,對于另外一些系統,可能只有flat式的簡單內存管理機制。
大體上來說,嵌入式系統所用到的內存管理機制主要有以下兩種:
虛擬內存管理機制:
有一些嵌入式處理器提供了MMU,在MMU具備內存地址映射和尋址功能,它使操作系統的內存管理更加方便。如果存在MMU ,操作系統會使用它完成從虛擬地址到物理地址的轉換, 所有的應用程序只需要使用虛擬地址尋址數據。 這種使用虛擬地址尋址整個系統的主存和輔存的方式在現代操作系統中被稱為虛擬內存。MMU 便是實現虛擬內存的必要條件。
虛擬內存的管理方法使系統既可以運行體積比物理內存還要大的應用程序,也可以實現“按需調頁”策略,既滿足了程序的運行速度,又節約了物理內存空間。
在Linux系統中,虛擬內存機制的實現為我們提供了一個典型的例子:在不同的體系結構下, 使用了三級或者兩級頁式管理,利用MMU 完成從虛擬地址到物理地址之間的轉換;谔摂M內存管理的內存最大好處是:由于不同進程有自己單獨的進程空間,十分有效的提高了系統可靠性和安全性。
非虛擬內存管理機制
在實時性要求比較高的情況下,很多嵌入式系統并不需要虛擬內存機制:因為虛擬內存機制會導致不確定性的 I/O阻塞時間, 使得程序運行時間不可預期,這是實時嵌入式系統的致命缺陷;另外,從嵌入式處理器的成本考慮,大多采用不裝配MMU 的嵌入式微處理器。所以大多嵌入式系統采用的是實存儲器管理策略。因而對于內存的訪問是直接的,它對地址的訪問不需要經過MMU,而是直接送到地址線上輸出,所有程序中訪問的地址都是實際的物理地址;而且,大多數嵌入式操作系統對內存空間沒有保護,各個進程實際上共享一個運行空間。一個進程在執行前,系統必須為它分配足夠的連續地址空間,然后全部載入主存儲器的連續空間。
由此可見,嵌入式系統的開發人員不得不參與系統的內存管理。從編譯內核開始,開發人員必須告訴系統這塊開發板到底擁有多少內存;在開發應用程序時,必須考慮內存的分配情況并關注應用程序需要運行空間的大小。另外,由于采用實存儲器管理策略,用戶程序同內核以及其它用戶程序在一個地址空間,程序開發時要保證不侵犯其它程序的地址空間,以使得程序不至于破壞系統的正常工作,或導致其它程序的運行異常;因而,嵌入式系統的開發人員對軟件中的一些內存操作要格外小心。
UCOS就是使用非虛擬內存管理的一個例子,在UCOS中,所有的任務共享所有的物理內存,任務之間沒有內存保護機制,這樣能夠提高系統的相應時間,但是任務內存操作不當,會引起系統崩潰。
對于內存在整個嵌入式運行過程中,以3種方式存在:
A、Linux系統的內存管理機制
Linux內存管理機制中,X86體系結構是利用虛擬內存管理的典型,在i386CPU上,首先要進行段式映射,Linux 沒有用到段式管理,它的做法是把GDT中段描述符段的大小定義為4GB, 也就是說只分了一段, 從而使段式映射沒有起作用。在頁式映射中,對于嵌入式i386芯片來說,實際上是兩層映射, 跳過中間的PMD層次。對于程序來說,并非所有虛存都映射都到物理空間了,而是動態映射, 如果程序運行時內核發現虛擬頁面沒有映射或映射的是磁盤頁面, 會作相應的缺頁處理——分配內存頁面并建立映射,然后恢復程序運行。
在程序運行的過程中, 涉及到的內存操作主要有內存分配、內存使用、內存回收、內存頁面換出、頁面換入。內存分配會在管理區的空閑區進行, 通過Buddy 算法在管理區的free_area 中獲得需要的內存塊。如果內存不足, 則會啟動Kswapd這個守護進程騰出部分物理內存。除了被調用, Kswapd 進程還會定時啟動。Kswapd 的工作分兩部分:
Linux系統 虛擬內存機制的屏蔽
由于虛擬內存在時間上的不可預期性,對于實時性要求很高的系統,必須屏蔽虛擬內存機制。在uCLinux中就利用了這種技術一保證系統的實時性,下面是屏蔽虛擬內存機制的思路:
為了滿足在工業控制中一些任務的實時性要求,必須屏蔽內核的虛擬內存管理機制以增強Linux的實時性。當要更改內核的某項機制時,一般不必大規模的改寫代碼,可采用條件編譯的方法。思路是用#ifdef或 #ifndef屏蔽現有語句,在#else宏編譯語句中包括自己編寫的代碼。實現虛擬內存的機制有:地址映射機制、內存分配和回收機制,緩存和刷新機制、請頁機制、交換機制、內存共享機制,將實現這些機制的數據結構和函數屏蔽或修改,還要修改與之相關的文件。需要改動的文件主要
在 /include/linux、/mm、/drivers/char、/fs、/ipc/kernel、/init目錄下。主要的改動如下:與虛存有關的主要的數據結構是vm_area_struct,將進程的mm_struct結構中的vm_area_struct去掉,vm_area_struct利用了vm_ops來抽象出對虛擬內存的處理方法,屏蔽與虛擬內存操作有關的函數。內存映射主要由do_mmap()實現,改寫此函數的代碼。取消交換操作,屏蔽用于交換的結構和函數聲明,以及實現交換的代碼。取消內核守護進程kswapd。
B、UCOS的內存管理:
UCOS的內存管理與大多數嵌入式系統一樣,是flat內存,但在此flat內存的基礎上進行了優化,使在動態內存分配的時候,減少了內存粹片,提高了系統性能。
UCOS的具體方法是:把連續的大塊內存進行分區,每個分區包含整數個大小相同的內存塊,在一個系統中有多個不同內存大小的分區。這樣,應用程序根據不同的需求,從不同大小的內存分區中分配相應大小的內存。對于不用的內存,又重新釋放回原來的分區。通過這樣的內存管理算法,解決了內存粹片的問題,提高了系統性能。UCOS具體的實現可以參看源碼。主要由以下幾個函數實現:
內存管理是嵌入式系統的一個重要方面,虛擬內存管理機制在為進程安全提供很好保證的同時,也為開發人員提供了一個管理內存的方法,使開發人員更多的關注其他的方面。但是它也帶來了時間不確定性的缺陷。根據不同的系統需求,我們可以選取相應的內存管理策略。在現在大多數的實時系統中,非虛擬內存管理機制用得比較多,這樣保證了系統的實時性,但是增加了開發的難度,任務內存操作不當,可能引起系統崩潰。
由于虛擬內存管理的請求換頁機制在很大程度上影響了系統的實時性能,現在有些開發人員提出了一個折衷方案,即不用虛擬內存管理的請求換頁機制,只考慮進程保護、內存映射、共享虛擬內存等功能,這樣既能提高系統的實時性,又能提高系統的安全性,具體請參考文獻4。
相關閱讀:uc/os操作系統簡介
聲明:本站部分內容根據互聯網資料整理而成,若侵犯您的權益,請聯系我們,我們會盡快處理。