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

Implement so called placement new for Page #67

Closed
efenniht opened this issue Nov 26, 2019 · 2 comments
Closed

Implement so called placement new for Page #67

efenniht opened this issue Nov 26, 2019 · 2 comments
Assignees

Comments

@efenniht
Copy link
Collaborator

현재 코드에서는 mpool.alloc() 을 부른 다음에 이 페이지 테이블을 초기화 시키는데, 이것을 리팩토링해서 Box::new() 와 같은 방식으로, 초기화되지 않은 상태를 보여주지 않도록 합시다. 그리고 나서 performance regression이 없는 지 어셈블리를 비교해 봅시다.

@efenniht efenniht self-assigned this Nov 26, 2019
@efenniht
Copy link
Collaborator Author

이것을 Rust에서는 placement new라고 부르고 있습니다. 이 기능을 지원하기 위해서 RFC가 있었는데 폐기되고 nightly에서도 사라졌습니다. (rust-lang/rust#27779 (comment)) work around를 좀 찾아보겠습니다...

@efenniht efenniht changed the title Refactor initialization after allocation in mm.rs and mpool.rs Implement so called placement new for Page Nov 27, 2019
@efenniht
Copy link
Collaborator Author

efenniht commented Nov 27, 2019

commit: efenniht@014efc4

placement new 기능이 없는 상태에서, 컴파일러가 최적화를 잘 시켜 주면 되지 않을까라는 생각으로 만들었습니다. 하지만 최적화에 실패해서 스택에 임시 변수를 만들었고, stack overflow가 발생했습니다.

Disassembly:

Disassembly of section .text._ZN4hfo22mm14PageTableEntry14populate_table17hb2e8569d7ceb9f09E:

0000000000000000 <_ZN4hfo22mm14PageTableEntry14populate_table17hb2e8569d7ceb9f09E>:
   0:   a9bb67fc    stp x28, x25, [sp, #-80]!
   4:   d1400be9    sub x9, sp, #0x2, lsl #12
   8:   d13ec129    sub x9, x9, #0xfb0
   c:   a9015ff8    stp x24, x23, [sp, #16]
  10:   a90257f6    stp x22, x21, [sp, #32]
  14:   a9034ff4    stp x20, x19, [sp, #48]
  18:   a9047bfd    stp x29, x30, [sp, #64]
  1c:   910103fd    add x29, sp, #0x40
  20:   9274cd3f    and sp, x9, #0xfffffffffffff000
...

보시다시피 스택에 2 << 12 + 0xfb0 바이트만큼 할당한 다음 페이지 크기에 맞추어 align을 합니다.

지금 상황에서 in place constructor를 rust에서 흉내내기는 어려울 것 같습니다.

cc @jeehoonkang

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

No branches or pull requests

1 participant