OS学习笔记-4(清华大学慕课)mooc实验一

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的中断源

  1. 外部中断:硬盘,时钟,网卡等
  2. 软件中断:软件执行过程中需要系统调用
  3. 异常:软件执行异常,机器检查出的异常

中断处理过程

  • 每个中断或异常都有个中断服务历程(ISR)与之关联
  • x86环境建立这个关联会使用到一个IDT(中断描述符表)
  • 中断程序会产生一个中断号,中断号会在中断描述符表中找到中断门或陷阱门
  • 基于这个中断门或陷阱门,我们会找到段的选择子和段内偏移(offset)
  • 选择子会去GDT(全局描述符表)里找到一个段描述符里面的Base(基址),这个Base+offset就构成了一个中断服务历程的地址
  • 另外段描述符中还有特权级的描述,如CS
  • 用户态和内核态发生中断都会跳到内核态,如果内核态发生中断跳到内核态,就会使用到内核的栈,并压入原栈的地址

系统调用与中断

  • 系统调用是一个特殊的中断,称之为trap或软中断(软件产生的)
  • 需要指定中断号
  • 需要完成用户态和内核态的转换

如何通过make生成执行文件的过程

使用make V=看make的过程,可以看到它首先会调用gcc,然后编译生成.o文件,然后调用ld,将.o文件生成一个可执行程序bootloader和dd,这个过程取决于一个makefile文件

发布了43 篇原创文章 · 获赞 3 · 访问量 3378

猜你喜欢

转载自blog.csdn.net/a1920993165/article/details/99306686