C函数调用过程
使用到函数栈,寄存器EBP、ESP(EBP和ESP称为指针寄存器(Pointer Register),主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。)
1.首先将调用call函数的函数的一系列的寄存器信息压入栈中
2.调用call函数
3.将call函数内部局部参数压入栈中
4.弹出call内部参数
5.弹出寄存器信息
GCC内联汇编
原因:
将汇编代码放到C语言中是因为,C语言无法完成所有cpu指令,尤其是特权指令,所以只能用汇编代码实现
主要变化:
原汇编代码=********
C语言中:asm volatile(********);
我们gcc编译器会自动将里面的代码转换好,如字符约定:
- “a”=%eax
- “b”=%ebx
- “c”=%ecx
- “d”=%edx
- “S”=%esi
- “D”=%edi
- “0”=same as the first
x86的中断源
- 外部中断:硬盘,时钟,网卡等
- 软件中断:软件执行过程中需要系统调用
- 异常:软件执行异常,机器检查出的异常
中断处理过程
- 每个中断或异常都有个中断服务历程(ISR)与之关联
- x86环境建立这个关联会使用到一个IDT(中断描述符表)
- 中断程序会产生一个中断号,中断号会在中断描述符表中找到中断门或陷阱门
- 基于这个中断门或陷阱门,我们会找到段的选择子和段内偏移(offset)
- 选择子会去GDT(全局描述符表)里找到一个段描述符里面的Base(基址),这个Base+offset就构成了一个中断服务历程的地址
- 另外段描述符中还有特权级的描述,如CS
- 用户态和内核态发生中断都会跳到内核态,如果内核态发生中断跳到内核态,就会使用到内核的栈,并压入原栈的地址
系统调用与中断
- 系统调用是一个特殊的中断,称之为trap或软中断(软件产生的)
- 需要指定中断号
- 需要完成用户态和内核态的转换
如何通过make生成执行文件的过程
使用make V=看make的过程,可以看到它首先会调用gcc,然后编译生成.o文件,然后调用ld,将.o文件生成一个可执行程序bootloader和dd,这个过程取决于一个makefile文件