0%

系统启动和中断机制

系统启动

  1. CPU上电,加载BIOS
  2. BIOS从MBR上加载BootLoader
  3. BootLoader设置保护模式,加载内核
  4. 内核进行初始化,进入用户shell

中断机制

  1. 中断初始化 填中断门描述符
  2. 时钟中断
  3. int 0x80 系统调用 系统调用是操作系统给应用程序提供的接口API。通过中断,应用程序可以对外设、网络进行读写。
  4. trapframe

函数调用约定

栈底对应高地址,栈顶对应低地址,栈由内存高地址向低地址生长

bp(base pointer): 用于存放执行中的函数对应的栈帧的栈底地址 sp(stack poinger): 用于存放执行中的函数对应的栈帧的栈顶地址

esp,保存栈最后一个元素,不是第一个可用空间。push,pop操作等价于如下伪代码

1
2
3
*--ESP = value;	// push

value = *ESP++; // pop

ebp,用来引用函数参数,和局部变量。

eip,保存下一条要被执行的指令的地址。调用call指令时,eip会被cpu自动压栈。而jmp指令只是直接修改eip.

cdecl(C declaration,即C声明)是源起C语言的一种调用约定

  1. 参数从右向左压栈

  2. 调用函数,call指令,eip压栈,进入新函数

    1. 进入新函数后,ebp压栈,esp的值赋给ebp。 0(%ebp)保存上一个栈frame的其实位置 4(%ebp) 保存函数返回地址 8(%ebp), 12(%ebp) 保存函数参数
    2. 保存寄存器值
    3. 为函数临时变量申请空间,直接减去esp的值,引用时使用ebp。**-4(%ebp)**表示第一个临时变量
    4. 函数执行
    5. leave指令恢复esp,ebp;等价于movl %ebp %esp ;popl %ebp
    6. ret指令返回,cpu会做pop eip
  3. 清理参数

其他

  1. Makefile的编写
  2. GCC内联汇编
  3. 基本开发工具的常用参数说明