음… 망함
왜인진 모르겠으나,, 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
에다가 인자 써주면 된다.
[target.'cfg(target_arch="aarch64")']
rustflags = ["-Clink-arg=-Tsrc/arch/aarch64/link.ld"]
대충 잡다한 부분들은 복사해서 패스 (필요시 다시 돌아와서 삽질예정..)
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의 역할인듯 하다.