rust-based-os-comp2022 icon indicating copy to clipboard operation
rust-based-os-comp2022 copied to clipboard

[Question] 如何理解程序内存布局初始化流程

Open jackyliu16 opened this issue 3 years ago • 0 comments

这个地方其实衍生与我在阅读这两个地方的时候(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) 疑问点在于具体的操作内容(可能以下内容严重暴露了我知识体系的不足,请大佬们见谅)

  1. 根据rCore手册中所表示的内容,我们应当传入一个内存镜像(牵涉到丢弃内核可执行文件中的元数据得到内核镜像的内容)

这个地方我的理解就是我们会传入一堆二进制编码信息

  1. 调整内核的内存布局)章节表示链接器所生成的默认内存布局不一定能符合我们的需要,在此需要通过Linker Script 来对于链接器的行为进行调整,使得最终生成的ELF文件(可执行文件)的布局符合我们的预期,在此修改Cargo的配置文件以使用我们的链接方案
  2. 以及正确配置栈空间布局部分的,通过内联汇编代码实现的,我们对于内存的一个划分要求

image

问题:基于以上的几种材料,我们能否认为,在整个的操作流程中,我们是按照以下顺序进行的呢?

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

jackyliu16 avatar Jul 14 '22 07:07 jackyliu16