음… 망함

왜인진 모르겠으나,, 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의 역할인듯 하다.