【操作系统OS】学习笔记:第一章 操作系统基础【哈工大李治军老师】
基于本人观看学习 哈工大李治军老师主讲的操作系统课程 所做的笔记,仅进行交流分享。
特此鸣谢李治军老师,操作系统的神作!
如果本篇笔记帮助到了你,还请点赞 关注 支持一下 ♡>𖥦<)!!
主页专栏有更多,如有疑问欢迎大家指正讨论,共同进步!
给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ
第一章 操作系统基础
更多操作系统笔记:【哈工大李治军老师】操作系统笔记专栏汇总
目录
课程链接:
一、什么是操作系统
1.操作系统的引入
2.什么是操作系统?
3.操作系统课 我们要学什么?
二、开始揭开钢琴的盖子
1.从打开电源开始...
2.计算机怎么工作?
计算机核心结构:
3.打开电源,计算机执行的第一句指令什么?
引导扇区BootSect.s
三、操作系统启动
1.set up模块
2.进入保护模式
3.GDT
4.jmpi 0,8
5.system模块
head.s
四、操作系统接口
1.什么是操作系统接口?
2.命令行:
3.图形按钮
4.接口表现:函数调用
操作系统接口——系统调用
五、系统调用的实现
区分内核态和用户态
特权级检查:
中断指令int
系统调用的实现
中断处理程序:system_call
六、操作系统历史
操作系统的核心图像:多进程切换、文件操作
操作系统学习任务
课程链接:
b站:
【哈工大】操作系统 李治军(全32讲)https://www.bilibili.com/video/BV19r4y1b7Aw/?share_source=copy_web&vd_source=6605d3cd5f58ef0c4e5ae59875ef0dda
中国大学MOOC:
大学慕课—操作系统—主讲:哈工大李治军https://www.icourse163.org/course/HIT-1002531008?from=searchPage&outVendor=zw_mooc_pcssjg_
一、什么是操作系统
1.操作系统的引入
用一句话说一说计算机专业要干什么?
用计算机帮助人们解决一些实际问题
通过内存地址输出到现存地址,通过控制器等过程才能输出“hello”
这种使用计算机的方式太麻烦!利用操作系统就可以跳过计算机硬件,更直接、更简单、高效地通过应用软件操作计算机。
直接使用 printf 就可以输出hello:
2.什么是操作系统?
是计算机硬件和应用之间的一层软件
方便我们使用硬件,如使用显存..
高效的使用硬件,如开多个终端(窗口)
管理哪些硬件
3.操作系统课 我们要学什么?
学习操作系统可以有很多层次
从应用软件出发“探到操作系统”
集中在使用计算机的接口上
使用显示器:printf; 使用CPU:fork, 使用文件:open、read...
从应用软件出发“进入操作系统”
一段文字是如何写到磁盘上的...
从硬件出发“设计并实现操作系统”
给你一个板子,配一个操作系统...
课程目标:
动手实践一个真实的操作系统
二、开始揭开钢琴的盖子
1.从打开电源开始...
这神秘的黑色背后发生着什么?..
不要总等着别人告诉你答案,尽量自己去寻找...
从知识和常识出发进行思索...
打开电源--->计算机要开始工作了
计算机怎么工作? 这是我们最最基本,也最最重要的常识....
2.计算机怎么工作?
说到底就是一个计算模型。
核心:设置控制器动作
从通用图灵机到计算机
又一个伟大的发明:冯·诺依曼存储程序思想 1946年提出
存储程序的主要思想:将程序和数据存放到计算机内部的存储器中,计算机在程序的控制下一步一步进行处理
计算机由五大部件组成:输入设备、输出设备、存储器、运算器、控制器
计算机核心结构:
首先把程序放到存储器(内存)中,然后用一个指针(IP)指向它,进行自动取址执行,产生结果。
取址执行!!!
3.打开电源,计算机执行的第一句指令什么?
引导扇区BootSect.s
0x7c00处存放的代码就是从磁盘引导扇区读入的那512个字节。
引导扇区就是启动设备的第一个扇区。
硬盘的第一个扇区上存放着开机后执行的第一段我们可以控制的程序。
注:需要汇编语言基础,C语言内存不可控,汇编直接对应机器码,是完全可控的。操作系统正需要完全可控的汇编语言。
将内存中 0x7C00 处的 512 个字节(正好就是全部 bootsect.s)移动到内存地址 0x90000 开始的一段内存中
这段汇编文件将来就会编译成机器指令,然后机器指令放在引导扇区上。
bootsect.s 的最后,PC指针被设置为 0x90200,执行指令 “int 0x13”,跳转到setup程序开始处(即0x90200)执行setup程序。
读入setup模块后:ok_load_setup
读入system模块,Loading system将会被显示出来
三、操作系统启动
引导扇区BootSect.s 分段读入操作系统的代码,首先读入set up,然后在屏幕上打出了一个 logo:Loading system...
调用13号中断,读入后面的system部分,然后进行set up
根据名字就可以想到:setup将完成OS启动前的设置
1.set up模块
关键:int 0x15
获得物理内存大小:将获取到的值放在ax中,ax再赋给[ 2 ]
段寄存器9000左移4位再加2:0x90002扩展内存数 读入内存大小并保存(因为操作系统要管理内存)
do move:将整个操作系统system模块,移动到0地址处。 从0地址开始一直是操作系统
2.进入保护模式
jmpi 0,8 :把0赋给IP 8赋给CS
通过段基址+段内偏移的方式完成寻址:PC=CS<<4+IP 跳转到80地址,这个地址是非法的,在这里寻址方式发生了改变!
新的寻址方式: (从16位机切换到32位机扩大内存)32位模式也叫保护模式
寄存器:cr0
cr0寄存器的最后一位如果是0就是16位模式,如果是1就是保护模式。
setup.s 寄存器cr0最后一位设置为1,cpu会执行另外一条的解释执行指令的电路,内存寻址方式会改变为保护模式。
3.GDT
CS不再是左移四位产生一个地址,而是CS(选择子),里面存放的是查表的下标(索引),真正的地址放在表项中。
jmpi 0,8 是选择表中的基址,再和IP偏移加在一起产生32位地址。
set up初始化GDT表(全局描述符):
4.jmpi 0,8
PC=GDT[8]+0=0,PC指针跳转到 0x0地址处
setup.s 到此执行完成,然后开始执行 system 模块
5.system模块
system模块(目标代码)中的第一部分代码? head.s
system由许多文件编译而成,为什么是head.s?
编写操作系统:Makefile 编译后的操作系统镜像:Image
head.s
head.s的汇编语法:
进入main函数:
main的工作就是xx_init: 内存、中断、设备时钟、CPU等内容的初始化....
三个参数分别是envp,argv,argc
但此处main并没使用此处的main只保留传统main的形式和命名
四、操作系统接口
1.什么是操作系统接口?
接口:连接两个东西、信号转换、屏蔽细节...
操作系统接口:连接上层用户和操作系统软件
2.命令行:
命令对应程序!!! 通过它输入相应的指令来完成一些特定的操作。
3.图形按钮
在图形用户界面(GUI)中,通常使用各种图形按钮来实现不同的操作。
4.接口表现:函数调用
操作系统接口——系统调用
由于程序无法直接访问硬件资源和操作系统内核,因此需要通过系统调用来请求操作系统完成相关任务。这些函数允许应用程序请求操作系统完成特定的任务,例如读取文件、向设备发送数据、创建进程等,通常被封装在系统库中。
系统调用举例:
文件操作:打开、读取、写入文件
进程控制:创建、运行和销毁进程
内存管理:分配、释放内存
设备控制:连接、读写设备
五、系统调用的实现
实现一个whoami系统调用
进入内核思想 应用程序不能直接进入内核调用函数!!不能随意jmp、move! 系统调用就是提供了一种调用手段
区分内核态和用户态
内核态可以访问任何数据,用户态不能访问内核数据
对于指令跳转也一样实现了隔离...
CPL是当前特权级,是 CPU 在执行代码时的特权级别
DPL是描述符特权级,指的是某个段描述符所代表的内存段允许访问的最高特权级别。
CPL 分为四种级别:Ring 0~3,数字越小级别越高,也就是特权级越高
Ring 0 表示内核态特权级,被操作系统内核使用
Ring 1~3 表示用户态特权级,被应用程序使用
特权级检查:
操作系统内核拥有自己的代码段和数据段,特权级别通常为 Ring 0,因此对应的段描述符的 DPL 值也应该设为 0,这样才能确保只有内核态特权级别才能访问这些段。
当 CPU 执行代码时,会根据指令所在段的 DPL 值与当前 CPL 值进行比较,如果 CPL 比 DPL 高,则不能访问该段;如果 CPL 比 DPL 低或相等,则可以访问该段。
中断指令int
中断指令int是用于触发 CPU 中断处理程序的机器指令。
在进行中断时,CPU 会自动进入内核态,因此可以访问操作系统内核提供的所有资源和服务
系统调用的实现
将一个系统调用号置给ex 然后调用int 0x80然后进入内核。
因为int 0x80是用户程序发起的调用内核代码的唯一方式.
int 0x80中断的处理
set_system_gate用来设置0x80的中断处理
然后现在的cs就是内核态的,就可以通过现在的cs查表得到段基址加上ip去执行内核里的中断处理程序了
中断处理程序:system_call
system_call 从中断堆栈中获取系统调用号和参数并执行对应的系统调用处理例程。
_sys_call table函数指针数组
六、操作系统历史
操作系统的核心图像:多进程切换、文件操作
操作系统学习任务
更多操作系统笔记:【哈工大李治军老师】操作系统笔记专栏汇总
大家的点赞、收藏、关注将是我更新的最大动力!欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!
相关文章:
【操作系统OS】学习笔记:第一章 操作系统基础【哈工大李治军老师】
基于本人观看学习 哈工大李治军老师主讲的操作系统课程 所做的笔记,仅进行交流分享。 特此鸣谢李治军老师,操作系统的神作! 如果本篇笔记帮助到了你,还请点赞 关注 支持一下 ♡>𖥦<)!! 主页专栏有更多࿰…...
Linux C/C++ 网络编程中地址格式转换(inet_pton和inet_ntop函数)
网络编程中地址格式转换(inet_pton和inet_ntop函数) 地址格式转换 #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h>int inet_pton(int af , const char * src ,void * dst);(1…...
庖丁解牛函数知识---C语言《2》
目录 前言: 1.嵌套调用函数 2.链式访问 3.函数的声明与定义 4.*递归 5.递归与非递归 ❤博主CSDN:啊苏要学习 ▶专栏分类:C语言◀ C语言的学习,是为我们今后学习其它语言打好基础,C生万物! 开始我们的C语言之旅吧…...
Git 使用教程:最详细、最正宗手把手教学(万字长文)
目录 一:Git二:SVN与Git的的区别三、安装Git四:常规操作五:远程仓库六:创建与合并分支七:bug分支八:多人协作九:git可视化工具 Git Git 是一种分布式版本控制系统,用于…...
【华为OD机试 2023最新 】最优资源分配/芯片资源占用(C语言题解 100%)
文章目录 题目描述输入描述输出描述备注用例题目解析代码思路C语言题目描述 某块业务芯片最小容量单位为1.25G,总容量为M*1.25G,对该芯片资源编号为1,2,…,M。该芯片支持3种不同的配置,分别为A、B、C。 配置A:占用容量为 1.25 * 1 = 1.25G配置B:占用容量为 1.25 * 2 =…...
markdown二元运算符
符号markdown名称 \pm \pm正负/加减 ∓ \mp ∓\mp负正/减加 \times \times乘号 ⋅ \cdot ⋅\cdot点乘号 \div \div除号 ∣ \mid ∣\mid整除 ∤ \nmid ∤\nmid不整除 ⊕ \oplus ⊕\oplus异或...
【华为/华三】PPP
NCP network阶段 用于协商网络层参数,IPCP静态协商IP地址(即互推地址)动态协商叫做获得地址 Q:为什么PPP两端,可以不在一个网段内,也能够通信? A:因为PPP中的NCP会通过IPCP协商IP…...
【Java笔试强训 9】
🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 一、选择题 二、编程题 🔥另类加法…...
【C++】STL标准库之list
STL标准库之list list类的简介常用的list类的接口构造迭代器容量访问修改 list和vector的区别 list类的简介 list是一种序列式容器,可以在任意位置插入和删除元素,并且其时间复杂度为O(1),在底层,list是双向链表结构,…...
Nomogram | 盘点一下绘制列线图的几个R包!~(二)
1写在前面 不知道各位小伙伴的五一假期过的在怎么样,可怜的我感冒了。😷 今天继续之前没有写完的列线图教程吧,再介绍几个制作列线图的R包。🤠 2用到的包 rm(list ls())library(tidyverse)library(survival)library(rms)library(…...
Django之定时任务django-crontab
Django之定时任务django-crontab crontab安装django-crontab注册应用定时时间格式定时时间示例设置定时任务符号方法解决crontab中文问题管理定时任务注意 crontab Django可以使用第三方库如django-crontab来实现定时任务的调度。该库允许使用类似于crontab文件格式的语法指定任…...
linux常见命令
ls:列出当前目录下的所有文件和子目录 cd:切换当前工作目录,例如 cd /home/user 进入 /home/user 目录 pwd:显示当前工作目录的路径 mkdir:创建一个新目录,例如 mkdir newdir 创建一个名为 newdir 的目录…...
【14.HTML-移动端适配】
移动端适配 1 布局视口和视觉视口1.1 设置移动端布局视口宽度 2 移动端适配方案2.1 rem单位动态html的font-size;2.2 vw单位2.3 rem和vw对比2.4 flex的弹性布局 1 布局视口和视觉视口 1.1 设置移动端布局视口宽度 避免布局视口宽度默认980px带了的缩放问题,并且禁止…...
平衡二叉树旋转机制
概念 平衡二叉树的旋转机制是一种通过对树进行旋转操作来保持其平衡的方法。 分类 平衡二叉树的旋转机制包括两种基本类型的旋转:左旋和右旋,以及它们的组合。 左旋 左旋是将一个节点的右子节点旋转到它的位置上,同时将该节点移到其左侧&…...
深入浅出C++ ——C++11
文章目录 一、C11简介二、列表初始化二、声明四、范围for循环五、STL中的变化六、右值引用和移动语义1. 什么是左值?什么是左值引用?2. 左值引用与右值引用比较3. 右值引用使用场景和意义4. 完美转发 新的类功能默认成员函数类成员变量初始化defaultdele…...
智能座舱3.0阶段,看全球巨头如何打造更具“价值”的第三空间
面向中国这一全球最大的汽车电动化与智能化单一市场,作为全球第七大汽车技术供应商的FORVIA佛瑞亚集团开始全面发力。 在2023年上海国际车展上,FORVIA佛瑞亚携旗下佛吉亚与海拉一系列突破性技术和互动体验亮相,展示了对电气化与能源管理、安…...
【Linux】入门介绍
🌱博客主页:大寄一场. 🌱系列专栏:Linux 😘博客制作不易欢迎各位👍点赞⭐收藏➕关注 目录 前言 Linux背景介绍 1.发展史 UNIX发展的历史 Linux发展历史 2. 开源 3. 官网 4. 企业应用现状 5. 发行版…...
【Python】序列类型②-元组
文章目录 1.元组简介2.元组的定义2.1定义只有一个元素的元组 3.元组的下标访问4.元组的常用方法5.使用in判断是否存在元素6.多元赋值操作 1.元组简介 元组和列表一样可以存放多个,不同数据类型的元素 与列表最大的不同就是:列表是可变的,而元组不可变 2.元组的定义 元组的定义:…...
循环的数字
循环的数字 题目描述 你曾经因为看见一样的东西一遍又一遍地重复、循环而对电视节目感到厌烦么?好吧,虽然我并不关心电视节目的好坏,不过有时却也很像那样不断循环的数字。 让我们假定两个不同的正整数 ( n , m ) (n, m) (n,m) 是循环的&…...
MySQL查询之聚合函数查询
0. 数据源 student.sql文件。 /*Navicat Premium Data TransferSource Server : localhost_3306Source Server Type : MySQLSource Server Version : 80016Source Host : localhost:3306Source Schema : testdbTarget Server Type : MySQLTa…...
普通2本,去过字节外包,到现在年薪25W+的测试开发,我的2年转行心酸经历...
个人简介 我是一个普通二本大学机械专业毕业,17年毕业,19年转行,目前做IT行业的软件测试已经有3年多,职位是高级测试工程师,坐标上海… 我想现在我也有一点资格谈论关于转行这个话题;希望你在决定转行之前…...
util.callbackify
util.callbackify(original) 将 async 异步函数(或者一个返回值为 Promise 的函数)转换成遵循异常优先的回调风格的函数,例如将 (err, value) > ... 回调作为最后一个参数。 在回调函数中,第一个参数为拒绝的原因(如…...
解决使用CLIP模型时TypeError: Cannot handle this data type: (1, 1, 224, 224), |u1
想提供Huggingface的transformer库实现多模态模型CLIP的推断,结果报错 (myenv) rootd27d1ff1836c:/home/model_test# python3 CLIP.py ftfy or spacy is not installed using BERT BasicTokenizer instead of ftfy. Traceback (most recent call last): File “/hom…...
Mysql第二章 多表查询的操作
这里写自定义目录标题 一 外连接与内连接的概念sql99语法实现 默认是内连接sql99语法实现左外连接,把没有部门的员工也查出来sql99语法实现右外连接,把没有人的部门查出来sql99语法实现满外连接,mysql不支持这样写mysql中如果要实现满外连接的…...
ESP32-CAM:TinyML 图像分类——水果与蔬菜
目录 故事 硬件参数: 在 Arduino IDE 上安装 ESP32-Cam 使用 BLINK 测试电路板 测试无线网络 运行您的 Web 服务器 水果与蔬菜-图像分类 下载数据集 使用 Edge Impulse Studio 训练模型...
如何防止订单重复支付
想必大家对在线支付都不陌生,今天和大家聊聊如何防止订单重复支付。 看看订单支付流程 我们来看看,电商订单支付的简要流程: 订单钱包支付流程 从下单/计算开始: 下单/结算:这一步虽然不是直接的支付起点,但…...
不是那么快乐的五一
大家好,我是记得诚。 五一假期结束了,明天开始上班了。 这个假期没休息好,也没出去玩。 放假前一天,接到通知让加班。 第一天就去公司加班了,属实很难受,我心想如果别人有了出远门的安排,还…...
Maven命令和配置详解
Maven命令和配置详解 1. pom基本结构2. build基本结构3. Maven命令详解3.1 打包命令3.2 常用命令3.3 批量修改版本-父子pom4. Maven配置详解4.1 settings.xml4.2 项目内的maven工程结构Maven POM构建生命周期工程实践1. pom基本结构 <?xml versi...
P3029 [USACO11NOV]Cow Lineup S 双指针 单调队列
“五一”小长假来了趟上海,在倒数第二天终于有时间做了一会儿题目,A了之后过来写一篇题解 【问题描述】 农民约翰雇一个专业摄影师给他的部分牛拍照。由于约翰的牛有好多品种,他喜欢他的照片包含每个品种的至少一头牛。 约翰的牛都站在一条沿…...
数据结构与算法之链表: Leetcode 83. 删除排序链表中的重复元素 (Typescript版)
删除排序链表中的重复元素 https://leetcode.cn/problems/remove-duplicates-from-sorted-list/ 描述 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 示例 1 输入:head [1,1,2] 输出&…...
延安有哪些做网站的公司/应用商店关键词优化
radio组件的样式大小太大了,和我的文字大小不匹配,看起来很难看 于是给radio设置了width和 height ,然而并不起作用 最后是使用transform:scale(0.7); 完美解决问题...
嘉兴网站制作套餐/互联网营销课程体系
基于CloudSim Plus的计算卸载仿真设计 1. 前提介绍 仿真框架的实现,主要依托于仿真实体、以及仿真事件,简单介绍如下 1.1 仿真实体 继承CloudSimEntity类(推荐)或者实现SimEntity接口(不建议) public class ExampleEntity extends CloudSimEntity {pu…...
黄骅市领导班子最新调整/百度seo招聘
Java Enum原理 public enum Size{ SMALL, MEDIUM, LARGE, EXTRA_LARGE }; 实际上,这个声明定义的类型是一个类,它刚好有四个实例,在此尽量不要构造新对象。 因此,在比较两个枚举类型的值时,永远不需要调用equals方法&…...
福州网签查询系统/网络推广与优化
我在国庆期间将公司的oracle 8i数据库升级到10G 64,升级完成之后发现Sysaux Tablespace 的Datafile竟然没有.原来是我在升成Control File时用的Datafile list是我在升级之前导出来的,没有将升级过程中生成的新的Tablespace Sysaux 的Datafile加进List中去造成的.我在之前的多次…...
网站建设的规划方案/永久免费自助建站系统
菱形 程序…………………… #include<stdio.h> int main() {int i,j,k; printf("\n\n");for(i1;i<4;i) //从第一行到第四行 {for(j1;j<16-i;j) //第一行15个空格 printf(" ");for(k1;k<2*i-1;k)printf("*"); //也可将 * …...
b2b网站做网络推广有用吗/百度推广管理系统
算数运算符 加- 减* 乘/ 除// 整除% 取余** 指数 算数优先级: 指数>乘除>加减 ps:python里面区分优先级只有小括号 () 没有 [] 和 {} , 比较运算符 <><>! ps:python可以优化…...