ホームページ 運用・保守 Linuxの運用と保守 実践的な戦闘 | RISC-V Linux エントリ アドレス 2M 予約メモリの最適化

実践的な戦闘 | RISC-V Linux エントリ アドレス 2M 予約メモリの最適化

Aug 01, 2023 pm 03:37 PM
Linuxカーネル

前回の記事では、RISC-V Linux のエントリ アドレスが 2M にアライメントされている必要があると述べましたが、今日は 2M アライメントの問題を解決する方法について説明します。メモリの一部を最適化します。

注: この記事は linux5.10.111 カーネルに基づいています

メモリ使用量分析

各チップが工場から出荷された時点で、そのブートROMのアドレスはチップ内に固定されていると仮定します。ブートROMは0x0、つまり上記のとおりです。電源を入れると、プログラムはアドレス0x0から実行を開始します。

RISC-V Linux を起動する前に、最初に opensbi を実行する必要があるため、opensbi をアドレス 0x0处,这样芯片上电后,就会从0x0地址处执行opensbi。在opensbi运行完后,会跳转到opensbi运行地址偏移2M的位置去执行下一级boot(这里下一级boot是kernel),即跳转到0x200000地址处运行kernel,因此应该把kernel放到内存的0x200000 に配置する必要があります。

メモリ分布図は次のとおりです:

実践的な戦闘 | RISC-V Linux エントリ アドレス 2M 予約メモリの最適化

カーネルの場合、起動時に独自のカーネルからアドレスをロードします (つまり、0x200000) は、ページ テーブル マッピングの確立を開始します。ページ テーブル マッピングが物理メモリに対して確立された場合にのみ、後でこれらのメモリにアクセスできるようになります。カーネルはアドレスの前に 2M メモリをロードします (つまり、0x0 - 0x200000) はカーネルによって無視され、この 2M メモリに対してページ テーブルは確立されません。つまり、カーネルはこの 2M メモリにアクセスできません。 0x200000)开始建立页表映射,只有对物理内存建立了页表映射,后面才能访问这些内存。而kernel加载地址前面的2M内存(即0x0 - 0x200000)将被kernel忽略,不会对这2M内存建立页表,即kernel无法访问这2M内存。

在QEMU上RISC-V Linux的启动信息:

実践的な戦闘 | RISC-V Linux エントリ アドレス 2M 予約メモリの最適化

但opensbi实际不需要使用2M这么大的范围,默认是512KB,opensbi的pmp会保护这512KB内存,不让其他程序访问。

実践的な戦闘 | RISC-V Linux エントリ アドレス 2M 予約メモリの最適化

因此在Kernel和opensbi之间会存在1.5M

QEMU 上の RISC-V Linux の起動情報:

実践的な戦闘 | RISC-V Linux エントリ アドレス 2M 予約メモリの最適化 ただしopensbi は実際には 2M ほどの範囲を使用する必要はありません。デフォルトは 512KB、opensbi の pmp はこれを保護します512KB メモリ。他のプログラムによるアクセスは許可されません。 実践的な戦闘 | RISC-V Linux エントリ アドレス 2M 予約メモリの最適化

したがって、カーネルと opensbi の間には 1.5M メモリ ギャップ、およびメモリギャップのこの部分はプログラムによって使用されないため、メモリの無駄が発生します。では、メモリの以前の部分をカーネルに使用させるにはどうすればよいでしょうか。

最適化計画

この 2M メモリを最適化するには 2 つの計画があります: 🎜🎜🎜オプション 1🎜: opensbi をメモリの最後に置き、カーネル エントリ アドレスは 2M アラインメントを維持します。 🎜🎜🎜オプション 2🎜: Opensbi は引き続きメモリの先頭に配置されます。カーネル ソース コードを変更し、2M アライメント制限を解除することで、カーネル アドレスを前方に移動できます。 🎜

オプション 1

opensbi をメモリの最後に置きますが、カーネル エントリ アドレスは 2M アラインメントを維持します。

つまり、カーネルはメモリの前に配置され、opensbi は後ろに配置されます。

実践的な戦闘 | RISC-V Linux エントリ アドレス 2M 予約メモリの最適化

たとえば、カーネルはメモリの 0x0地址处,opensbi放到内存的0x10000000地址处。这样kernel前面就不会有预留内存,只不过这样需要修改bootrom的地址,将地址从0x0修改为0x0x10000000。这种方案只适合芯片还没出厂前,因为用户无法修改bootrom的地址,芯片出厂后,bootrom地址是固定的,假设bootrom地址为0x0,那么芯片上电后,就会从0x0开始运行程序,所以opensbi必须放到0x0 アドレスに配置されるため、カーネルは2Mオフセット。

オプション 2

RISC-V Linux のカーネル ソース コードを変更して、2M アライメント制限を解除することもできます。必要なのは setup_vm () 関数を使用して、 元の第 2 レベルのページ テーブルを第 3 レベルのページ テーブルに変更します。これにより、カーネル エントリ アドレスを 4K に揃えるだけで済み、カーネルを前方に移動するため、フロントメモリが使用されます。 setup_vm()函数中,将原来的二级页表改为三级页表,这样kernel入口地址只需要4K对齐,因此就能将kernel往前挪,从而利用前面的内存。

修改代码

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

コードを変更します

実践的な戦闘 | RISC-V Linux エントリ アドレス 2M 予約メモリの最適化パス: arch /riscv/mm/init.c

元の 2M アライメント チェックをコメントします:

実践的な戦闘 | RISC-V Linux エントリ アドレス 2M 予約メモリの最適化

カーネルの最初の 2M ページ テーブル マッピングを第 2 レベルのページ テーブルから第 3 レベルのページ テーブルに変更します。 :

//新增一个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);
}
ログイン後にコピー

カーネル全体のページテーブルマッピングが第 2 レベルのページテーブルから第 3 レベルのページテーブルに変更されます:
実践的な戦闘 | RISC-V Linux エントリ アドレス 2M 予約メモリの最適化
カーネルサイズが 4M+
実践的な戦闘 | RISC-V Linux エントリ アドレス 2M 予約メモリの最適化
//定义三个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);
}
ログイン後にコピー

🎜🎜 であると仮定します。 🎜🎜上記のコードを変更することにより、カーネル エントリは、アドレスを 1.5M ずつ前方に移動し、opensbi 用に 512KB のみを予約できるようになり、RISC-V Linux の起動後に利用可能な物理メモリが増加します。 🎜
実践的な戦闘 | RISC-V Linux エントリ アドレス 2M 予約メモリの最適化

概要

RISC-V Linuxエントリアドレスの2Mアライメント操作はまだ説明されていませんが、opensbi用に2Mを予約する必要があるため、カーネルはセカンダリページテーブルを確立するだけです。エントリアドレスは 2M でアライメントされている必要があります。メモリのこの部分の最適化ソリューションはまだ誰も提供していません。この記事の最適化ソリューションが一部の人々を助け、すべての人にインスピレーションを与えることを願っています。

以上が実践的な戦闘 | RISC-V Linux エントリ アドレス 2M 予約メモリの最適化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Linux カーネルの機能を探る: 5 つの主要部分の詳細な紹介 Linux カーネルの機能を探る: 5 つの主要部分の詳細な紹介 Mar 21, 2024 am 09:57 AM

Linux カーネルは、オペレーティング システムの中核部分として、ハードウェア リソースの管理やシステム コールの提供などの重要な機能を担っています。この記事では、プロセス管理、ファイル システム、ネットワーク通信、デバイス ドライバー、メモリ管理を含む Linux カーネルの 5 つの主要な部分を詳しく掘り下げ、詳細な紹介とコード例を提供します。 1. プロセス管理 プロセスの作成 Linux カーネルでは、プロセスの作成は fork() システム コールを通じて実装されます。簡単なコード例を次に示します: #include

非 MMU サポートは、Linux カーネルの uClinux ポートによって提供されますか? 非 MMU サポートは、Linux カーネルの uClinux ポートによって提供されますか? Jan 26, 2024 pm 05:18 PM

長くて技術的な内容が多いので、クリックしてフォローしていけば迷うことはありません。序文: Linux カーネルについて理解する コンピュータ システムはハードウェアとソフトウェアが共生しており、相互に依存しており、分離することはできません。コンピューター ハードウェア Linux カーネルの移植手順には、コンピューター シリンダーを構成する周辺デバイス、プロセッサ、メモリ、ハード ドライブ、およびその他の電子デバイスが含まれます。また、それを操作および制御するためのソフトウェアがなければ、単独で動作することはできません。この制御作業を実行するソフトウェアはオペレーティング システムと呼ばれ、Linux 用語では「カーネル」または「コア」と呼ばれます。 Linux カーネルの主要モジュール (コンポーネント) は、ストレージ管理、CPU とプロセス管理、ファイル システム、デバイス管理とドライバー、ネットワーク通信 Linux フォーラム、およびシステムの部分に分かれています。

実践的な戦闘 | RISC-V Linux エントリ アドレス 2M 予約メモリの最適化 実践的な戦闘 | RISC-V Linux エントリ アドレス 2M 予約メモリの最適化 Aug 01, 2023 pm 03:37 PM

前回の記事では、RISC-V Linux のエントリ アドレスが 2M アラインメントである必要があると述べましたが、今日は 2M アラインメントの問題を解決する方法、またはその一部を最適化する方法について説明します。想い出。

Linux カーネルの TCP プロトコル スタック最適化に関する秘密のヒントが明らかに Linux カーネルの TCP プロトコル スタック最適化に関する秘密のヒントが明らかに Jan 28, 2024 am 09:39 AM

親愛なる読者の皆さん、こんにちは!ここで、Linux カーネル TCP プロトコル スタックの開発と最適化における専門スキルとともに、シニア ネットワーク エンジニアとして蓄積してきた貴重な経験とスキルを皆さんと共有できることを光栄に思います。この記事を通じて、この分野に強い興味を持っている方、あるいは現在取り組んでいる方に、お互いに学び合い、議論し、実践的で役立つ参考資料をお届けできればと思います。 1. TCP 接続の確立 TCP 接続の確立は、TCP プロトコル スタックの重要なトランザクションですが、多くの接続問題に直面することは珍しくありません。慎重な検討と詳細なデバッグの結果、SYN フラッディング攻撃の防止 (システム パラメーターの調整による) やネットワーク輻輳への対処 (つまり、TCPFastOp の使用) など、いくつかの一般的で実用的な問題とその解決策を発見しました。

Linux カーネルのソースコード配布の詳細な調査 Linux カーネルのソースコード配布の詳細な調査 Mar 15, 2024 am 10:21 AM

これは、Linux カーネルのソース コード配布を詳しく調査した 1500 ワードの記事です。スペースが限られているため、ここでは Linux カーネル ソース コードの組織構造に焦点を当て、読者の理解を深めるためにいくつかの具体的なコード例を示します。 Linux カーネルは、ソース コードが GitHub でホストされているオープン ソース オペレーティング システム カーネルです。 Linux カーネルのソース コード配布全体は非常に大きく、複数の異なるサブシステムとモジュールが関与する数十万行のコードが含まれています。 Linux カーネルのソース コードをより深く理解するには

Linux カーネル: コンピュータ オペレーティング システムの隠れたボスを明らかにする Linux カーネル: コンピュータ オペレーティング システムの隠れたボスを明らかにする Mar 24, 2024 am 09:10 AM

Linux カーネルがコンピュータ オペレーティング システムで重要な役割を果たしているという見解について説明します Linux カーネルの設計と実装 Linux カーネルの設計と実際のアプリケーションの詳細な分析を通じて、この分野における Linux カーネルの卓越した位置と影響力を明らかにします。 1. 最適化されたメモリ管理 仮想メモリ管理テクノロジを使用することで、Linux カーネルはメモリの割り当てとリサイクルを効率的に完了できます。 Linux カーネルは、置換ページ アルゴリズムの助けを借りて、物理メモリと仮想メモリ間のマッピング関係を正確に処理するように設計および実装されています。アプリケーションの特定のニーズに基づいて柔軟に調整できるため、システム全体のパフォーマンスが向上します。 2. 強力なプロセス管理カーネルは、優れたマルチタスク技術を使用して、複数のプロセスが単一システム内で調和して共存できるようにします。慎重に配合

Android システムと Linux カーネルの関係を調べる Android システムと Linux カーネルの関係を調べる Mar 14, 2024 pm 12:48 PM

Android システムと Linux カーネルは 2 つの密接な関係にあるエンティティであり、両者の関係は密接かつ複雑です。 Android システムでは、Linux カーネルが重要な役割を果たし、Android システムに基盤となるハードウェア ドライバーとシステム コールのサポートを提供します。この記事では、Android システムと Linux カーネルの関係、それらがどのように相互作用して連携するかを検討し、いくつかの具体的なコード例を示します。 Android は、Linux カーネルに基づいて開発されたモバイル オペレーティング システムで、主にスマートフォンやタブレットなどのモバイル デバイスに使用されます。 L

Linux カーネルの障害をデバッグする方法を本当に知っていますか? この記事を読めば、きっと理解できるでしょう。 Linux カーネルの障害をデバッグする方法を本当に知っていますか? この記事を読めば、きっと理解できるでしょう。 Aug 03, 2023 pm 04:50 PM

Linux カーネルはオペレーティング システムの中核であり、CPU、I/O デバイス、物理メモリ、ファイル システムなどのシステム リソースへのアクセスを制御します。ブート プロセス中およびシステムの実行中、カーネルはさまざまなメッセージをカーネル リング バッファに書き込みます。これらのメッセージには、システム動作に関するさまざまな情報が含まれています。

See all articles