吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux如何優化部分內存

麥辣雞腿堡 ? 來源:嵌入式Linux充電站 ? 作者:Vincent ? 2023-10-08 10:59 ? 次閱讀

我們也可以修改RISC-V Linux的內核源碼,解除2M對齊的限制。我們只需要在setup_vm()函數中,將原來的 二級頁表改為三級頁表 ,這樣kernel入口地址只需要4K對齊,因此就能將kernel往前挪,從而利用前面的內存。

修改代碼

路徑:arch/riscv/mm/init.c

注釋原來的2M對齊檢查:

圖片

對kernel的前2M頁表映射由二級頁表改為三級頁表:

//新增一個PTE
pte_t trampoline_pte[PTRS_PER_PTE] __page_aligned_bss;

create_pgd_mapping(trampoline_pg_dir,PAGE_OFFSET,
                   (uintptr_t)trampoline_pmd,PGDIR_SIZE,PAGE_TABLE);
create_pmd_mapping(trampoline_pmd,PAGE_OFFSET,
                   (uintptr_t)trampoline_pte,PMD_SIZE,PAGE_TABLE);

end_va = PAGE_OFFSET + PMD_SIZE;
for (va = PAGE_OFFSET; va < end_va; va += PAGE_SIZE)
{
    create_pte_mapping(trampoline_pte,PAGE_OFFSET,
                   load_pa + (va - PAGE_OFFSET),
                       PAGE_SIZE,PAGE_KERNEL_EXEC);
}

圖片

對整個kernel的頁表映射由二級頁表改為三級頁表:

假設kernel大小為4M+

//定義三個PTE
pte_t load_sz_pte[PTRS_PER_PTE] __page_aligned_bss;
pte_t load_sz_pte1[PTRS_PER_PTE] __page_aligned_bss;
pte_t load_sz_pte2[PTRS_PER_PTE] __page_aligned_bss;

//=======0-2M======
create_pgd_mapping(early_pg_dir,PAGE_OFFSET,
                   (uintptr_t)early_pmd,PGDIR_SIZE,PAGE_TABLE);
create_pmd_mapping(early_pmd,PAGE_OFFSET,
                   (uintptr_t)load_sz_pte,PMD_SIZE,PAGE_TABLE);

end_va = PAGE_OFFSET + PMD_SIZE;
for (va = PAGE_OFFSET; va < end_va; va += PAGE_SIZE)
{
    create_pte_mapping(load_sz_pte,PAGE_OFFSET,
                   load_pa + (va - PAGE_OFFSET),
                       PAGE_SIZE,PAGE_KERNEL_EXEC);
}

//=======2-4M==========
create_pgd_mapping(early_pg_dir,PAGE_OFFSET + PMD_SIZE,
                   (uintptr_t)early_pmd,PGDIR_SIZE,PAGE_TABLE);
create_pmd_mapping(early_pmd,PAGE_OFFSET,
                   (uintptr_t)load_sz_pte1,PMD_SIZE,PAGE_TABLE);

end_va = PAGE_OFFSET + (PMD_SIZE * 2);
for (va = PAGE_OFFSET + PMD_SIZE; va < end_va; va += PAGE_SIZE)
{
    create_pte_mapping(load_sz_pte1,va,
                   load_pa + (va - PAGE_OFFSET),
                       PAGE_SIZE,PAGE_KERNEL_EXEC);
}

//=======4-6M==========
create_pgd_mapping(early_pg_dir,PAGE_OFFSET + (PMD_SIZE*2),
                   (uintptr_t)early_pmd,PGDIR_SIZE,PAGE_TABLE);
create_pmd_mapping(early_pmd,PAGE_OFFSET,
                   (uintptr_t)load_sz_pte2,PMD_SIZE,PAGE_TABLE);

end_va = PAGE_OFFSET + (PMD_SIZE * 3);
for (va = PAGE_OFFSET + (PMD_SIZE*2); va < end_va; va += PAGE_SIZE)
{
    create_pte_mapping(load_sz_pte2,va,
                   load_pa + (va - PAGE_OFFSET),
                       PAGE_SIZE,PAGE_KERNEL_EXEC);
}

圖片

圖片

通過以上的代碼修改,就能將Kernel入口地址往前挪1.5M,只給opensbi預留512KB,這樣RISC-V Linux啟動之后,可用物理內存就會增加。

圖片

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內核
    +關注

    關注

    3

    文章

    1382

    瀏覽量

    40427
  • Linux
    +關注

    關注

    87

    文章

    11345

    瀏覽量

    210402
  • 內存
    +關注

    關注

    8

    文章

    3055

    瀏覽量

    74332
收藏 人收藏

    評論

    相關推薦

    Linux內存管理是什么,Linux內存管理詳解

    Linux內存管理 Linux內存管理是一個非常復雜的過程,主要分成兩個大的部分:內核的內存
    的頭像 發表于 05-11 17:54 ?6158次閱讀
    <b class='flag-5'>Linux</b>的<b class='flag-5'>內存</b>管理是什么,<b class='flag-5'>Linux</b>的<b class='flag-5'>內存</b>管理詳解

    linux內存相關知識科普

    linux 內存組織結構和頁面布局,內存碎片產生原因和優化算法。
    發表于 08-08 10:57 ?406次閱讀

    走進Linux內存系統探尋內存管理的機制和奧秘

    Linux 內存是后臺開發人員,需要深入了解的計算機資源。合理的使用內存,有助于提升機器的性能和穩定性。本文主要介紹Linux 內存組織結構
    的頭像 發表于 01-05 09:47 ?1691次閱讀

    Linux內存相關知識科普

    Linux 內存是后臺開發人員,需要深入了解的計算機資源。合理的使用內存,有助于提升機器的性能和穩定性。本文主要介紹**Linu****x 內存組織結構和頁面布局,
    發表于 07-25 14:43 ?758次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內存</b>相關知識科普

    單片機定義變量字符的那部分內存已經滿了,怎么才能繼續定義新的字符?

    我用的比較老的4580芯片,需要定義的字符很多,用于OLED顯示屏幕顯示,但是定義字符的那部分內存已經滿了,無法再加入新的字符,請問有什么好的解決辦法嗎?請不要告訴我換芯片,因為電路板是根據這個芯片制作的,有沒有什么好的容易的解決辦法?跪求
    發表于 03-06 17:15

    怎樣在Linux內核中預留一部分內存空間作特殊用途呢

    有時我們需要在 Linux 內核中預留一部分內存空間用作特殊用途(給安全模塊使用,給其它處理器使用,或是給特定的驅動程序使用等),在 Device Tree 中有提供兩種方法對預留內存進行配置
    發表于 12-29 07:16

    一文解析Linux系統保留內存的初始化流程

    1、Linux系統保留內存的初始化流程在啟動過程中會打印出如下信息,這些信息為linux呈現出系統下的保留內存空間。本文只介紹基本的保留內存
    發表于 06-30 16:27

    Linux內存初始化

    之前有幾篇博客詳細介紹了Xen的內存初始化,確實感覺這部分內容蠻復雜的。這兩天在看Linux內核啟動中內存的初始化,也是看的云里霧里的,想嘗試下邊看邊寫,在寫博客的過程中慢慢思考,最后
    發表于 10-12 11:16 ?0次下載

    關于內存優化知識你知道多少呢?

    為了優化應用內存,你應該知道是什么消耗了你應用的大部分內存,答案就是Texture(紋理)!它幾乎占據了90%的應用內存。那么我們應該盡力去減小我們應用的紋理
    發表于 08-31 10:36 ?3051次閱讀

    你知道linux的cache memory?

    當你讀寫文件的時候,Linux內核為了提高讀寫性能與速度,會將文件在內存中進行緩存,這部分內存就是Cache Memory(緩存內存)。即使你的程序運行結束后,Cache Memory
    發表于 04-26 15:49 ?1258次閱讀

    怎么區分內存條的單面和雙面

    什么是單面和雙面內存?它們有些什么樣的特性與區別呢?你們知道怎么區分內存條單面和雙面嗎?下面小編帶來怎么區分內存條單面和雙面的內容,歡迎閱讀!
    發表于 05-28 09:51 ?9090次閱讀

    一文解析Linux內存系統

    Linux 內存是后臺開發人員,需要深入了解的計算機資源。合理的使用內存,有助于提升機器的性能和穩定性。本文主要介紹Linux 內存組織結構
    的頭像 發表于 09-01 10:46 ?2482次閱讀
    一文解析<b class='flag-5'>Linux</b><b class='flag-5'>內存</b>系統

    嵌入式linux+io+優化,嵌入式Linux系統內存優化使用方法研究

    優化進而確保響應運行。并且經過實踐證明,嵌入式系統內存優化使用,能夠提升系統空間5%內存,確保系統順利運行。【關鍵詞】 嵌入式 Linux
    發表于 11-01 16:31 ?10次下載
    嵌入式<b class='flag-5'>linux</b>+io+<b class='flag-5'>優化</b>,嵌入式<b class='flag-5'>Linux</b>系統<b class='flag-5'>內存</b><b class='flag-5'>優化</b>使用方法研究

    Linux驅動模塊.ko內存精簡優化過程

    Linux 驅動模塊可以獨立的編譯成 .ko 文件,雖然大小一般只有幾 MB,但對總內存只有幾十 MB 的小型 Linux 系統來說,常常也是一個非常值得優化的點。本文以一個實際例子,
    發表于 09-25 09:23 ?1599次閱讀

    linux內存性能優化介紹

    【1】內存映射 Linux 內核給每個進程都提供了一個獨立且連續的虛擬地址空間,以便進程可以方便地訪問虛擬內存;虛擬地址空間的內部又被分為內核空間和用戶空間兩部分,不同字長的處理器,地
    的頭像 發表于 11-10 15:23 ?752次閱讀
    <b class='flag-5'>linux</b><b class='flag-5'>內存</b>性能<b class='flag-5'>優化</b>介紹
    sz全讯网网址xb112| 利记娱乐场| 免费下百家乐官网赌博软件| 百家乐是哪个国家| 德州扑克高级教程| 百家乐官网园云顶娱乐主页| 百家乐设备电子路| 百家乐官网假在哪里| 澳门百家乐公司| 大发888官方游戏平台| 百家乐官网l23| 百家乐套利| 百家乐官网视频游戏大厅| 玩百家乐出千方法| 百家乐官网休闲游戏| 百家乐游戏机图片| 皇冠投注平台| 百家乐透视用设备| bet365备用网址b365etbyty| 十三张百家乐官网的玩法技巧和规则| 有钱人百家乐的玩法技巧和规则| 澳门百家乐官网经历| 百家乐喜牛| 百家乐官网如何投注技巧| 玩百家乐有几种公式| 百家乐官网娱乐求指点呀| 缅甸百家乐娱乐场开户注册| 百家乐官网电脑游戏高手| 百家乐玩法秘诀| 百家乐官方网站| 新澳博百家乐现金网| 保康县| 视频百家乐是真是假| 百家乐官网棋牌游戏皇冠网| 百家乐国际赌场娱乐网规则| 百家乐官网投注心态| 财富百家乐的玩法技巧和规则| 澳门百家乐官网现场真人版| 大发888娱乐场 注册| 玩百家乐官网去哪个娱乐城最安全 | 百家乐试玩1000元|