음… 망함
왜인진 모르겠으나,, uefi 앱으로 제작하니 *.S 파일 컴파일할때 .size
같은 구문들을 이해를 못한다..
그냥 hermit-loader 참조하여 cosmos-loader 제작중
진행상황…
hermit-loader 는 우선 arch/aarch64/entry.S
파일에 __start 라는 곳에서 instruction들을 시작한다..
초기 과정이 진행된 뒤에는 no_mangle
로 지정된 rust 코드로 이동한다.
b _start_rust
hermit-loader의 경우 _start_rust
임..
이런저런 linking 에 관련한 변수들이 link.ld
에 선언되어있다. (ex. kernel_start
, kernel_end
, __boot_core_stack_start
etc.)
컴파일러한테.. 링크해달라고 하려면,, rustc에다가 인자 넘겨야되는데 찾아보니,, .cargo/config.toml
에다가 인자 써주면 된다.
대충 잡다한 부분들은 복사해서 패스 (필요시 다시 돌아와서 삽질예정..)
none.rs
보면, kernel을 찾는 과정이 있는데,, 왜인진 몰라도 처음에 커널을 제대로 못찾았다..
한번은 elf magic number 일치안하고, 또 한번은 hermit kernel이 아니라고 에러나서,, 직접 만들어보면서 내 커널에 맞게 개조하기로 했다..
우선 find_kernel
에서는 dtb 의 chosen
속성중에 module@
로 시작하는 속성에 해당하는 메모리 위치를 잡아내서 kernel을 찾아낸다..
찾아낸 뒤에는 elf magic number 일치하는지 체크하고, kernel file size를 확인한다.
일치하는지 확인해본 결과 cosmos 커널의 파일사이즈와 정확히 일치하였다.
그러면 find_kernel
에서 이 파일을 읽어서 [u8]
배열 형태로 넘겨준다..
다음에 해야할거는 그럼
- 어지러운
[u8]
에서 필요한 정보 파싱해내기 - memory에 적재하기
여기까지가 bootloader의 역할인듯 하다.