首先是 设置 loard_16.c 中的 boot_info 这个变量, 这里最初保存的是 读取到的内存的信息。
然后是 增加跳转的函数。
然后就是 去改动 内核代码。
由于内核的代码最终 调用的是 kernel_init.
最关键的就是 这里了, call kernel_init 相当于 在调用一个函数, 但是在汇编中需要手动的 将参数入栈, 并且这里还需要手动的 将 C语言函数中的 入栈的参数取出来。
这里需要完善。
先来看一下 esp ebp
不去理会 所谓的栈顶, 栈底, ebp 就是栈的最高地址,esp 是不断变化的,如果想要取寻找变量,就通过ebp 取寻找。
解析:
总结 : 所以 我写的函数的逻辑是, 先保存 上一个函数的ebp ,然后设置当前函数的ebp , 然后将 将要调用的函数的参数 手动入栈,然后调用函数。
所以我们最终是要去改动 init.c 的。
inti.c 的代码如下:
#include "comm/boot_info.h"
#include "init.h"
int test (int a, int b) {
return a + b;
}
void kernel_init (boot_info_t * boot_info) {
int a = 1, b = 2;
test(a , b);
for (;;) {}
}