Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[実装例]動的メモリ割り当ての実装 #8

Open
wants to merge 1 commit into
base: traphandler
Choose a base branch
from

Conversation

rihib
Copy link
Owner

@rihib rihib commented Aug 28, 2024

思考プロセス

alloc_pages

  • 使用していない物理ページを必要に応じて割り当てられるようにしたい
  • ページ数を引数として受け取り、割り当て可能なメモリ領域の先頭アドレスを返すalloc_pages関数を作る。解放処理は行わないので考えなくて良い
  • 動的に割り当て可能なのは__free_ramから__free_ram_endまでの領域であるため、この間のメモリを割り当てれば良い
  • 割り当てられていないメモリの先頭アドレスを保持し続ける必要がある。そのため静的変数(またはグローバル変数)として保持する
  • もしも割り当て可能なメモリ領域を超えてしまうようならパニックを起こす
  • ページを割り当てる際はセキュリティ上、ゼロクリアしたものを渡す

kernel_main

  • 実際にalloc_pages関数を使ってメモリを割り当ててみて、割り当てたメモリの先頭アドレスを確認することで正常に動作しているか確かめることができる。そのため、確かめられるようにkernel_main関数を変更する

テスト

void kernel_main(void) {
    memset(__bss, 0, (size_t) __bss_end - (size_t) __bss);
    
    WRITE_CSR(stvec, (uint32_t) kernel_entry);

    paddr_t paddr0 = alloc_pages(2);
    paddr_t paddr1 = alloc_pages(1);
    printf("alloc_pages test: paddr0=%x\n", paddr0);
    printf("alloc_pages test: paddr1=%x\n", paddr1);

    PANIC("booted!");
}

最初のアドレス (paddr0) が__free_ramのアドレスと一致し、次のアドレス (paddr1) が最初のアドレスから2 * 4KB分進んだアドレス (16進数で0x2000足した数) と一致することを確認する。

$ ./run.sh
alloc_pages test: paddr0=80221000
alloc_pages test: paddr1=80223000
$ llvm-nm kernel.elf | grep __free_ram
80221000 R __free_ram
84221000 R __free_ram_end

@rihib rihib changed the title 動的メモリ割り当ての実装 [deprecated]動的メモリ割り当ての実装 Aug 28, 2024
@rihib rihib closed this Aug 28, 2024
@rihib rihib reopened this Aug 28, 2024
@rihib rihib changed the base branch from main to traphandler August 28, 2024 00:53
@rihib rihib changed the title [deprecated]動的メモリ割り当ての実装 動的メモリ割り当ての実装 Aug 28, 2024
@rihib rihib changed the title 動的メモリ割り当ての実装 [実装例]動的メモリ割り当ての実装 Aug 28, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant