一、课程总结
本课程是理论和代码相结合的授课模式,在先讲解一般操作系统的通用运行逻辑后再结合Linux内核源码具体学习相关操作系统功能逻辑的实现。
计算机系统的基本工作原理
1. 计算机的三个关键性方法机制
当代所有计算机平台的基础–冯诺伊曼机
先了解一下什么是存储程序计算机?
主要思想是讲程序存放在计算机存储器中,然后按照存储器中的存储程序的首地址执行程序的第一条指令,按照该程序中编写好的指令执行,直至程序结 束。
冯诺伊曼机的三大特点:
包含运算器、存储器、控制器、I/O
内部采用二进制来表示指令和数据。
将编写好的程序和数据先放入计算机中,然后启动。
核心是存储程序计算机。
2. 堆栈
作用:记录调用框架,传递参数,保存返回值,暂时存储局部变量
相关寄存器:ESP+EBP(堆栈相关寄存器),CS:EIP(函数调用相关),EAX(返回值地址),还有传递参数相关
运行机制:通过pop,push两种操作,结合以上各种寄存器,实现函数调用,返回地址的记录,并且在函数调用完之后可以返回到原文中继续执行。
3. 中断–系统调用(这里只写相关部分的中断内容)
系统调用的总过程:
触发系统调用时,用户态使用int$0x80指令触发中断,跳转到汇编代码system_call,触发中断机制,当前进程用户态的堆栈SS:ESP,CS:EIP EFLAGS保存在内核中,接下来执行到system_call的位置,将这段汇编用于保存现场,执行系统调用内核函数,函数调用完之后返回,恢复现场。最后iret将关键现场恢复到对应的寄存器中去,并回到int$0x80之后的下一条指令继续执行。
初始化过程:
系统加载 start_kernel 开始,调用了 trap.c 中的 trap_init()函数对中断进行初始化。并且调用同一文件下的set_trap_gate()/set_system_gate()/set_intr_gate()等对中断描述符进行初始化。在进入保护模式之前, IDT 再次通过 setup_idt()函数进行初始化,在这里使用了 ignore_int()函数,是为了保护未初始化完成时发生异常不出错。然后调用 init_IRQ()函数,把中断描述附表的中断处理代码段地址设在在 interrupt 数组中,该数组指向同一个函数处理 common_interrup。
为什么需要分级?
系统体系架构分为用户态和内核态,用户态的权限低于核心态,也就是说代码掌控的范围收到了限制,如果没有权限级别的划分,程序员所有代码都可以使用特权指令,系统很容易出现崩溃的情况。
操作系统实现的功能之一-进程管理
1. 进程的的概念:
运行一个程序的时候,操作系统需要描述其的运行过程,通过结构体task_struct{}来描述,统称为PCB。
2. 进程的描述信息有:
PID,进程状态,优先级,sp,上下文,内存指针。
3.创建进程–fork()
fork函数不同于其他函数,因为其返回次数的特殊性:fork会有两个返回值,一个为父亲进程的返回值,一个为子进程的
子进程返回0,父进程返回子进程的进程ID。
4.fork运行机制: