系统启动
- CPU上电,加载BIOS
- BIOS从MBR上加载BootLoader
- BootLoader设置保护模式,加载内核
- 内核进行初始化,进入用户shell
中断机制
- 中断初始化 填中断门描述符
- 时钟中断
- int 0x80 系统调用 系统调用是操作系统给应用程序提供的接口API。通过中断,应用程序可以对外设、网络进行读写。
- trapframe
函数调用约定
栈底对应高地址,栈顶对应低地址,栈由内存高地址向低地址生长
bp(base pointer): 用于存放执行中的函数对应的栈帧的栈底地址 sp(stack poinger): 用于存放执行中的函数对应的栈帧的栈顶地址
esp,保存栈最后一个元素,不是第一个可用空间。push,pop操作等价于如下伪代码
1 | *--ESP = value; // push |
ebp,用来引用函数参数,和局部变量。
eip,保存下一条要被执行的指令的地址。调用call指令时,eip会被cpu自动压栈。而jmp指令只是直接修改eip.
cdecl(C declaration,即C声明)是源起C语言的一种调用约定
-
参数从右向左压栈
-
调用函数,call指令,eip压栈,进入新函数
- 进入新函数后,ebp压栈,esp的值赋给ebp。 0(%ebp)保存上一个栈frame的其实位置 4(%ebp) 保存函数返回地址 8(%ebp), 12(%ebp) 保存函数参数
- 保存寄存器值
- 为函数临时变量申请空间,直接减去esp的值,引用时使用ebp。**-4(%ebp)**表示第一个临时变量
- 函数执行
- leave指令恢复esp,ebp;等价于movl %ebp %esp ;popl %ebp
- ret指令返回,cpu会做pop eip
-
清理参数