rCore-Tutorial-Book-v3
rCore-Tutorial-Book-v3 copied to clipboard
rCore-Tutorial-Book-v3/chapter1/3-2-mini-rt-baremetal
构建裸机运行时执行环境 — rCore-Tutorial-Book-v3 0.1 文档
https://rcore-os.github.io/rCore-Tutorial-Book-v3/chapter1/3-2-mini-rt-baremetal.html
章末的练习题怎么没了o(TヘTo)
章末的练习题怎么没了o(TヘTo)
目前习题仍在准备中,敬请期待~
请问什么是 “链接脚本的优先匹配原则”,没看懂
请问什么是 “链接脚本的优先匹配原则”,没看懂
意思是某个目标文件的 .bss.stack
段既可以被通配符 *(.bss.stack)
匹配,也可以被通配符 *(.bss.*)
匹配,但由于 *(.bss.stack)
出现在链接脚本中较前的位置,因此链接器会将 .bss.stack
段放到链接脚本中 *(.bss.stack)
的那个位置。
也就是说,即便显式地写了两遍同一个目标文件的同一个分段,链接器也只会链接一次对吗
sbi_call的实现貌似忘贴上去了,搜了下以前版本的rCore教学里有
我觉得这里面的地址0x80020000
都应该改成0x80200000
?
我觉得这里面的地址
0x80020000
都应该改成0x80200000
?
在 2021-02-07的更新 中 Qemu 的 base address 从 0x80020000
改成 0x80200000
,k210 则保持不变。目前文档还没来得及更新。
额,添加裸机打印相关函数章节的pub fn console_putchar
没有把syscall
改成sbi_call
....
问个链接语法问题:
stext = .;
.text : {
*(.text.entry)
*(.text .text.*)
}
这个stext = .
是不是不影响链接过程啊? 我觉得把.text{}放在这个位置已经能达到放置.text段的效果了, 我觉得这是不是只是为了定义一个全局可见的symbol啊.
我的这种感觉来自于
fn clear_bss() {
extern "C" {
fn sbss();
fn ebss();
}
(sbss as usize..ebss as usize).for_each(|a| {
unsafe { (a as *mut u8).write_volatile(0) }
});
}
这里用到了符号sbss, 所以我猜测链接脚本中这些stext等都是起符号作用.
问个链接语法问题:
stext = .; .text : { *(.text.entry) *(.text .text.*) }
这个
stext = .
是不是不影响链接过程啊? 我觉得把.text{}放在这个位置已经能达到放置.text段的效果了, 我觉得这是不是只是为了定义一个全局可见的symbol啊. 我的这种感觉来自于fn clear_bss() { extern "C" { fn sbss(); fn ebss(); } (sbss as usize..ebss as usize).for_each(|a| { unsafe { (a as *mut u8).write_volatile(0) } }); }
这里用到了符号sbss, 所以我猜测链接脚本中这些stext等都是起符号作用.
的确如此,它只是为了指出 .text 段的位置。
如何咋DRAM中放置应用程序的各个部分
应该是 如何在
的吧
与上节不同,需要关注地方主要是: - 物理内存的DRAM为止(放应用程序的地方)
想请问一下这个 物理内存的DRAM为止
是什么意思
请问助教可以把Chapter1教程中到这一节结束的代码(即能在裸机上输出的代码)公布一下吗?感觉看教程自己一步一步做容易在中间出错,影响理解。
正确配置栈空间布局中“优雅的退出” 的rust_main函数体应该是shutdown()吧
昨天我和松意识到我们的链接脚本中漏掉了两个段:.sbss
和.sdata
它们也需要被加到对应的段里:
.data : {
*(.data .data.*)
+ *(.sdata .sdata.*)
}
.bss : {
*(.bss.stack)
sbss = .;
*(.bss .bss.*)
+ *(.sbss .sbss.*)
}
不然就会被放到 ekernel
后面,隐患很大啊[捂脸]
昨天我和松意识到我们的链接脚本中漏掉了两个段:
.sbss
和.sdata
它们也需要被加到对应的段里:.data : { *(.data .data.*) + *(.sdata .sdata.*) } .bss : { *(.bss.stack) sbss = .; *(.bss .bss.*) + *(.sbss .sbss.*) }
不然就会被放到
ekernel
后面,隐患很大啊[捂脸]
多谢指出,马上Fix
pub fn shutdown() -> ! {
sbi_call(SBI_SHUTDOWN, [0, 0, 0]);
panic!("It should shutdown!");
}
这个地方似乎应该是sbi_call(SBI_SHUTDOWN,0,0,0);
四个参数
@chenzhiy2001 多谢,已修改。
请问一下 ''' error: couldn't allocate output register for constraint '{x10}' --> src/sbi.rs:7:9 | 7 | llvm_asm!("ecall" | ^
error: unexpected token in '.section' directive
|
note: instantiated into assembly here
-->
error: invalid instruction mnemonic 'la'
|
note: instantiated into assembly here
-->
error: invalid instruction mnemonic 'jal'
|
note: instantiated into assembly here
-->
error: unexpected token in '.section' directive
|
note: instantiated into assembly here
-->
error: aborting due to 5 previous errors; 1 warning emitted ''' 编译的时候出现这个问题要如何解决啊?
sbi_cal和syscall的命令一样,底层如何判断权限呢?是rustSBI根据id控制的么?
如何做到执行环境的初始化代码被放在内存上以 0x80200000 开头的区域上?----对这部分的讲解不是很理解,我的理解是这样的:操作系统代码是bootloader(也就是rustSBI)加载到内存中的,放到0x80200000 开头的区域上是由bootloader控制的,因此我们配置栈空间布局只能改变各个段的现对位置及内核初始位置,使booloader加载到的位置和我们配置的初始位置一致,这样地址偏移就会一致。这样理解正确么?
你好sbi_call的代码可以贴一下嘛
你好经过验证应该要把sbi_call声明为pub在main.rs才能使用吧
/home/oslab/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/bin/llvm-objcopy: error: 'target/riscv64gc-unknown-none-elf/release/os': No such file or directory Makefile:49: recipe for target 'target/riscv64gc-unknown-none-elf/release/os.bin' failed make: *** [target/riscv64gc-unknown-none-elf/release/os.bin] Error 1 你好这个错误是需要怎么修改呢
结果发现刚执行一条指令,整个系统就飞了( pc 寄存器等已经变成为 0 了)。再一看, sp 寄存器是一个非常大的值 0xffffff
这是怎么发现的?前文rust-gdb里并没有0xffffff
. = ALIGN(4K); etext = .; srodata = .; rodata : { (.rodata .rodata.) } 请教下为什么每个节一开始要4K对齐呢?
想问下GDB只能用riscv64-unknown-elf-gdb这个吗,但是好像不能把断点打到方法上
对于在裸机上执行的应用程序,其执行环境(就是QEMU模拟硬件+“三叶虫”操作系统内核)将可执行文件加载到内存的时候,并负责将 .bss 所分配到的内存区域全部清零。
这里有点不通顺,或许可以将“并”改为“同时”?
但我们在 main.rs 的 rust_main 函数中调用 panic!("It should shutdown!"); 宏时,整个模拟执行的结果是:
根据上下文,“但”应该改为“当”?
但也能看出,这个操作系统很脆弱,只能支持一个简单的易用,在本质上 是一个提供方便服务接口的》库。
这里“易用”感觉打错了,我猜是“应用”?