您好,登錄后才能下訂單哦!
小編給大家分享一下Utility之內存尺寸的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
雖然現在64位處理器越來越多,而且VxWorks也從6.9開始提供64位處理器的支持,但是目前VxWorks更多的應用場景還是32位的。那么VxWorks在32位處理器上最多可以使用多少內存呢?
32位系統的尋址范圍是232 = 4G,但至少得給外設預留部分空間,因此可使用的內存范圍肯定要小于4GB了。做個實驗:X86的設備上,插一個4GB的內存條
使用LOCAL_MEM_AUTOSIZE模式
啟動VxWorks,內存尺寸顯示為3071MB
看一下內存的Top點在哪,可由函數sysPhysMemTop()獲得,是3GB=3072MB
少的那一個MB去哪了?原來X86的內存是從0x100000開始算的
那這3071MB都可以隨便使用嗎?當然不是
內存的大致布局如下
挨個看一下
在LOCAL_MEM_LOCAL_ADRS和RAM_LOW_ADRS之間的區域,VxWorks系統存儲了一些特定的數據
例如Boot line,在LOCAL_MEM_LOCAL_ADRS+ BOOT_LINE_OFFSET
從RAM_LOW_ADRS開始,存放的就是VxWorks系統鏡像。編譯時,鏡像尾部會加入一個全局變量end,因此可以通過end來計算鏡像的尺寸
其實這個尺寸在編譯時就確定了,只不過因為對齊的關系,略有偏差
從內存頂部往下看,有兩塊預留區域。上面一塊預留給EDR機制,其尺寸默認是24KB (PM_RESERVED_MEM = 6*VM_PAGE_SIZE)
下面一塊是用戶保留區,其尺寸是USER_RESERVED_MEM
這個區域的起始位置,可以由函數sysMemTop()獲得
可以看到與sysPhysMemTop()值相同,那是因為在當前鏡像里這倆保留區域默認都沒有使能,因此尺寸還都是0
而end與sysMemTop()之間的區域,又可以分為三塊
從end開始,存放WDB內存池,占用的空間WDB_POOL_SIZE默認是(sysMemTop()-end)/16
WDB之后,就是系統內存池,其尺寸KERNEL_HEAP_SIZE默認是(sysMemTop()-FREE_MEM_START_ADRS)/3*2 = WDB_POOL_SIZE*10
最后剩下的一塊,是預留給RTP或共享庫或共享數據區的,當它們加載時,再進行動態映射。其尺寸,就是(sysMemTop()-end)再減去WDB內存池和系統內存池,因此默認等于WDB_POOL_SIZE*5
那系統內存池的最大尺寸到底可以是多少?那就把另外幾個可選區域都去掉:WDB內存池、RTP、用戶保留區、EDR區域。系統內存池就是(sysPhysMemTop()-end):3GB減去RAM_LOW_ADRS之前的幾個MB,再減去系統鏡像的幾個MB
以上是“Utility之內存尺寸的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。