rust-based-os-comp2022
rust-based-os-comp2022 copied to clipboard
[Question] 如何理解程序内存布局初始化流程
这个地方其实衍生与我在阅读这两个地方的时候(https://learningos.github.io/rust-based-os-comp2022/chapter1/4mini-rt-baremetal.html and https://rcore-os.github.io/rCore-Tutorial-Book-v3/chapter1/3first-instruction-in-kernel1.html) 疑问点在于具体的操作内容(可能以下内容严重暴露了我知识体系的不足,请大佬们见谅)
- 根据rCore手册中所表示的内容,我们应当传入一个内存镜像(牵涉到丢弃内核可执行文件中的元数据得到内核镜像的内容)
这个地方我的理解就是我们会传入一堆二进制编码信息
- (调整内核的内存布局)章节表示链接器所生成的默认内存布局不一定能符合我们的需要,在此需要通过Linker Script 来对于链接器的行为进行调整,使得最终生成的ELF文件(可执行文件)的布局符合我们的预期,在此修改Cargo的配置文件以使用我们的链接方案
- 以及正确配置栈空间布局部分的,通过内联汇编代码实现的,我们对于内存的一个划分要求

问题:基于以上的几种材料,我们能否认为,在整个的操作流程中,我们是按照以下顺序进行的呢?
- rustc (以一种我目前不了解的方式)将可能需要用到的文件组件全部转化成为汇编语言文件
- 在main文件
_start之前通过asm!实现的汇编代码调用core::arch::global_asm!(include_str!("entry.asm"));实现对于栈内存的分配 - 根据图片4类似的方法,cargo实现了链接操作,具体操作就相当于将各个文件的各个段按照链接文件中与asm中目标文件的符号表中的全局符号进行分配?
- 最终链接成为一个ELF文件,经过
rust-objcopy剔除其中的元数据,得到内存镜像(二进制文件?) - 然后再整个加载到
0x80200000,也就是Rustsbi硬件初始化完成之后的位置中 - 按照pc逐条取值执行?