实验 1:ChCore操作系统-机器启动
第一关
1.创建一个终端,进入文件
2.输入make build
3.输入script /data/workspace/myshixun/history1.log
4.输入make qemu-gdb
5.开终端2,输入make build
6.输入where
7.按键盘ctrl+d退出
8.exit
9.终端1ctrl+a
10.输入x
11.exit
第2关:内核的引导与加载
实验步骤
把 _start 函数和 0x80000 关联的语句则在 CMakeLists.txt 中
编译时使用以下命令
-T 指定链接器脚本
-e 指定入口函数
set_property(
TARGET kernel.img
APPEND_STRING
PROPERTY
LINK_FLAGS
"-T ${CMAKE_CURRENT_BINARY_DIR}/${link_script} -e _start"
)
练习4
Sections:
Idx Name Size VMA LMA
0 init 0000b5b0 0000000000080000 0000000000080000
1 .text 000011dc ffffff000008c000 000000000008c000
2 .rodata 000000f8 ffffff0000090000 0000000000090000
3 .bss 00008000 ffffff0000090100 0000000000090100
4 .comment 00000032 0000000000000000 0000000000000000
.init段执行时,MMU还没有启动,没有虚拟地址,因此LMA和VMA相同。而其他段则是kernel代码,操作系统kernel一般运行在虚拟地址的高位,但一开始bootloader运行时处于实模式,无法访问0xffffff0000000000以上的内存区域,因此将代码装载入此时的LMA。当进入保护模式后,再将对应的内核代码映射到高地址段,即VMA,再运行。
第3关:内核态基础功能:内核态输入输出
对输入的数字进行进制转换
//进制转换
s = print_buf + PRINT_BUF_LEN;
*s = '\0';
while(u>0)
{
s--;
t=u%base;
if(t<=9)
*s=t+'0';
else
{
if(letbase)
*s = t-10+'a';
else
*s = t-10+'A';
}
u/=base;
}
第4关:内核态基础功能:函数回溯
7
先看下 stack_test 的源码
Copy
// Test the stack backtrace function (lab 1 only)
__attribute__ ((optimize("O1")))
void stack_test(long x)
{
kinfo("entering stack_test %d\n", x);
if (x > 0)
stack_test(x - 1);
else
stack_backtrace();
kinfo("leaving stack_test %d\n", x);
}
8 }
版权归原作者 白灵, 所有, 如有侵权,请联系我们删除。