最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

李治军操作系统 笔记

业界 admin 9浏览 0评论

第一篇.操作系统基础

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,内核看不见,内核只能看见所属进程而看不见用户级线程,所以一个用户级线程需要等待,内核会切到别的进程上,不会切到该进程下的其他用户级线程!!!
内核级线程

发布评论

评论列表 (0)

  1. 暂无评论