在嵌入式系統中物理記憶體的實際大小是由bootloader傳遞給核心的,bootloader傳遞給核心的記憶體大小值是由開發人員根據記憶體的實際大小配置的,有改動就需要重新編譯,而且並不是所有的物理記憶體核心都能用,有相當一部分記憶體會留給私有模組(像camera、gpu等),這些記憶體核心自身訪問不到。
uboot相關的linux記憶體配置:
(e)early_mem
該函式用於處理
bootargs
中的"mem=size@start".
引數如果沒有定義mem起始位址, 使用phys_offset ,這個引數是由具體的開發板定義的,在611中,在arch\unicore\mach-sep0611\include\mach\memory.h中定義的。
#definephys_offset ul(0x40000000)
通過unicore_add_memory(start, size);函式將一段連續的記憶體空間新增到struct meminfo meminfo中去。對於ramdisk的處理也比較簡單,在此不詳解了。
(f)paging_init(\arch\unicore-linux\mm\mmu.c)這個函式比較大,下面分布介紹(關於記憶體的啟動部分,推薦去看乙個網友的部落格
(1)sanity_check_meminfo用於檢測記憶體的虛擬位址(線性對映)是否超過了vmalloc_min的位址(如果記憶體太大,可能會這樣)。如果記憶體太大的話,那麼就重新計算記憶體的可用大小。顯然這時候一部分記憶體就不可以使用了或者一分為二(一部分給系統正常使用,一部分劃給highmem)。核心為vmalloc和initrd保留了128m的空間,那麼核心可使用的最大空間只有1g-128m=896m。
linux釋放記憶體與檢視記憶體情況
linux釋放記憶體的命令 sync echo 1 proc sys vm drop caches drop caches的值可以是0 3之間的數字,代表不同的含義 0 不釋放 系統預設值 1 釋放頁快取 2 釋放dentries和inodes 3 釋放所有快取 free m 檢視記憶體使用情況 注...
linux 記憶體屏障相關
linux系統,編譯器或處理器會對 進行優化,會導致同一cpu 執行緒上執行的 的執行先後順序發生改變,會導致某些前後強依賴關係的 執行時發生oops。解決辦法 增加記憶體屏障。這個可以確保記憶體屏障前的 先於記憶體屏障後的 執行到 同乙個cpu 執行緒上 所以核心中對於需要確保時序的 要加記憶體屏...
Linux 記憶體使用情況
linux系統如何檢視使用記憶體情況 root r2 free total used free shared buffers cached mem 215608 142680 72928 0 19736 86956 buffers cache 35988 179620 swap 1052248 0 ...