第一篇.操作系统基础
1.1 操作系统概述
1.2 操作系统引导(总体做的:将操作系统读入内存 + 初始化 )
bootsect.s
setup.s
读取硬件参数
读取system到内存0x00位置
从16位模式 转到 32位模式,即从实时模式 转到 保护模式, 使得寻址方式发生了改变,跳转到0x00执行system,其实是转到head.s代码
实时模式: 地址翻译 CS<<4 + IP
保护模式 :根据CS查表 + IP
head.s
初始化GDT,IDT表
转到main()函数,main()是c函数
main()
各种初始化,包括mem_init 标记那些内存块被使用,哪些没有被使用
1.3 系统接口
1.3.1 操作系统接口
由系统提供的函数调用
1.3.2 系统调用的实现
硬件上隔离用户段和内核段,DPL CPL来实现, 其实是把内存分段了,进行隔离保护
从用户段访问内核段,必须通过中断0x80才能访问内核段
库函数write:
1)系统调用号 => %eax
参数1 => %ebx
参数2 => %ecx
参数3 => %edx
2) int 0x80 中断,进入内核,调用 system_call,
int 0x80 和 system_call函数的关系要先注册好 ,即设置IDT表,改变了DPL,以及段寄存器地址,还有偏移地址,实际上就是设置了DPL和中断函数地址 !!!
system_call:
call _sys_call_table(,%eax,4) //eax保存的是系统调用号,有查call_table表格
call_table :
//查找表,通过系统调用号查找对应的系统调用指针,然后去调用对应的sys_write
疑问
有system_call()的函数声明,但是没有实体,只有在.s文件中找到_system_call的标号
就是是_system_call,
在c语言中声明和调用的时候都写成system_call
在汇编中声明为_system_call,多一个下划线
汇编中调用汇编,则调用_system_call;
汇编中调用c函数,要在c函数前面加一个下划线,、_function;
1.4 操作系统历史
Unix
进程图谱
文件操作
第二篇. 操作系统之 进程与线程
六、 线程引出与实现
L10:用户级线程
进程 和 线程 都是动态概念
进程 = 资源 (包括寄存器值,PCB,内存映射表)+ 指令序列
线程 = 指令序列
线程 的资源是共享的,
进程 间的资源是分隔独立的,内存映射表不同,占用物理内存地址是分隔的
线程 的切换只是切换PC,切换了指令序列
进程 的切换不仅要切换PC,还包括切换资源,即切换内存映射表
用户级线程:调用Yield函数,自己主动让出cpu,内核看不见,内核只能看见所属进程而看不见用户级线程,所以一个用户级线程需要等待,内核会切到别的进程上,不会切到该进程下的其他用户级线程!!!
内核级线程
第一篇.操作系统基础
1.1 操作系统概述
1.2 操作系统引导(总体做的:将操作系统读入内存 + 初始化 )
bootsect.s
setup.s
读取硬件参数
读取system到内存0x00位置
从16位模式 转到 32位模式,即从实时模式 转到 保护模式, 使得寻址方式发生了改变,跳转到0x00执行system,其实是转到head.s代码
实时模式: 地址翻译 CS<<4 + IP
保护模式 :根据CS查表 + IP
head.s
初始化GDT,IDT表
转到main()函数,main()是c函数
main()
各种初始化,包括mem_init 标记那些内存块被使用,哪些没有被使用
1.3 系统接口
1.3.1 操作系统接口
由系统提供的函数调用
1.3.2 系统调用的实现
硬件上隔离用户段和内核段,DPL CPL来实现, 其实是把内存分段了,进行隔离保护
从用户段访问内核段,必须通过中断0x80才能访问内核段
库函数write:
1)系统调用号 => %eax
参数1 => %ebx
参数2 => %ecx
参数3 => %edx
2) int 0x80 中断,进入内核,调用 system_call,
int 0x80 和 system_call函数的关系要先注册好 ,即设置IDT表,改变了DPL,以及段寄存器地址,还有偏移地址,实际上就是设置了DPL和中断函数地址 !!!
system_call:
call _sys_call_table(,%eax,4) //eax保存的是系统调用号,有查call_table表格
call_table :
//查找表,通过系统调用号查找对应的系统调用指针,然后去调用对应的sys_write
疑问
有system_call()的函数声明,但是没有实体,只有在.s文件中找到_system_call的标号
就是是_system_call,
在c语言中声明和调用的时候都写成system_call
在汇编中声明为_system_call,多一个下划线
汇编中调用汇编,则调用_system_call;
汇编中调用c函数,要在c函数前面加一个下划线,、_function;
1.4 操作系统历史
Unix
进程图谱
文件操作
第二篇. 操作系统之 进程与线程
六、 线程引出与实现
L10:用户级线程
进程 和 线程 都是动态概念
进程 = 资源 (包括寄存器值,PCB,内存映射表)+ 指令序列
线程 = 指令序列
线程 的资源是共享的,
进程 间的资源是分隔独立的,内存映射表不同,占用物理内存地址是分隔的
线程 的切换只是切换PC,切换了指令序列
进程 的切换不仅要切换PC,还包括切换资源,即切换内存映射表
用户级线程:调用Yield函数,自己主动让出cpu,内核看不见,内核只能看见所属进程而看不见用户级线程,所以一个用户级线程需要等待,内核会切到别的进程上,不会切到该进程下的其他用户级线程!!!
内核级线程