-
计算机的三大法宝:程序存储计算机、函数调用、中断
-
堆栈的作用:记录函数调用框架、传递函数参数、保存返回值地址、提供函数内部局部便量的存储空间。
-
堆栈相关的寄存器 ESP:堆栈指针,指向堆栈栈顶 EBP:基址指针,指向堆栈栈底
-
堆栈向下增长的原因
这个问题与虚拟地址空间的分配规则有关,每一个可执行C程序,从低地址到高地址依次是:text,data,bss,堆,栈,环境参数变量;其中堆和栈之间有很大的地址空间空闲着,在需要分配空间的时候,堆向上涨,栈往下涨
-
函数调用 call指令经eip中吓一条指令的地址A保存在栈顶,设置eip指向被调用代码
cs:eip总是指向下一条的指令地址
顺序执行:总是指向地址联系的下一条指令 跳转和分支 测试:eip会会根据程序需要而修改。
call:将当前cs:eip的值压入栈顶,cs:eip指向被调用函数的入口地址
ret:从栈顶弹出原来保存在这里的cd:eip的值,放入sc:eip中
call xxx
执行call之前
执行call时,cs:eip原来的值指向call下一条指令,该值被保存到栈顶,然后cs:ei的值指向xx的入口地址
进入xxx
第一条指令:pushl %ebp
第二条指令:movl %esp,%ebp
提出xxx
movl %ebp, %esp
popl $ebp
-ret
- 实验
$ cd ~/LinuxKernel/linux-3.9.4
$ rm -rf mykernel
$ patch -p1 < ../mykernel_for_linux3.9.4sc.patch
$ make allnoconfig
$ make
$ qemu -kernel arch/x86/boot/bzImage
-
效果图
-
查看文件
查看mymain.c文件:
vi mymain.c
void __init my_start_kernel(void)
{
int i = 0;
while(1)
{
i++;
if(i%100000 == 0)
printk(KERN_NOTICE "my_start_kernel here %d
",i);
}
}
总结: