JOS学习笔记(十一)

JOS学习笔记(一) 起初 神创造天地。  地是空虚混沌.渊面黑暗. BIOS运行在水面上。  神说、要有mbr、就加载了mbr。  神看mbr是好的、就用mbr加载了kernel。  神称mbr为引导程序、称kernel为内核.有晚上、有早晨、这是头一日。 用课余时间重新拾起JOS,作为一个码农通过了解不同技术层面的机制对自己的技术水平提高非常大,而JOS作为一个MIT的开放课程,可让我们从 阅读详情

不知不觉已经写了11篇日志了,本篇博客将完成LAB 4的PART A的剩余部分,包括内核锁、进程(环境)的简单调度算法,以及fork系统调用。


一、内核锁

1、锁实现

考虑到当多个CPU同时陷入内核的场景,若对于关键数据结构不加锁必然就会导致重入错误(如cprintf不加锁会在屏幕上输出奇怪的结果),因此使用锁来保证内核函数内部的逻辑正确性是很有必要的。

内核锁相关代码都在spinlock.c和spinlock.h中,关键代码如下:


以及x86.h里面的xchg函数:


可以看到,xchg函数首先使用lock指令使xchgl变为原子操作,然后尝试将xchgl两个操作数互换,并把原先第一个操作数的结果放入result中返回。

若此时锁是空闲的,则xchg返回0,spin_lock函数执行完成,否则继续执行pause指令,然后接着执行xchg函数直到其返回值为1.

关于lock引用一段汇编手册的资料:

总线加锁前缀“lock”,它是为了在多处理器环境中,保证在当前指令执行期间禁止一切中断。这个前缀仅仅对ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG,DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD,XCHG指令有效,如果将Lock前缀用在其它指令之前,将会引起异常。

关于pause:

提升spin-wait-loop的性能,当执行spin-wait循环的时候,笨死和小强处理器会因为在退出循环的时候检测到memory order violation而导致严重的性能损失,pause指令就相当于提示处理器哥目前处于spin-wait中。在绝大多数情况下,处理器根据这个提示来避免violation,藉此大幅提高性能,由于这个原因,我们建议在spin-wait中加上一个pause指令。(出自于intel 汇编手册)


2、实验相关:

实验要求在以下4个地方加锁:

(1)i386_init中,启动多个ap之前。

(2)mp_main中,开始把任务调度到cpu上之前。

(3)trap中,若从用户态陷入内核则加锁。

(4)env_run中,从内核态返回用户态需要释放锁。

加锁后,将原有的并行执行过程在关键位置变为串行执行过程,整个启动过程大概如下:

i386_init-->BSP获得锁-->boot_ap-->(BSP建立为每个cpu建立idle任务、建立用户任务,mp_main)--->BSP的sched_yield-->其中的env_run释放锁-->AP1获得锁-->执行sched_yield-->释放锁-->AP2获得锁-->执行sched_yield-->释放锁.....

其中括号表示并行执行

具体代码如下:

(1)i386_init


(2)mp_main


(3)trap


(4)env_run



二、任务调度

1、原理

在JOS中,任务调度在内核中是函数sched_yield,同时在用户态有相应的系统调用sys_yield也可以调用内核中的这个函数。

i386_init启动时,在boot_ap函数调用后,为每个CPU创建一个idle任务,相应代码在user/idle.c,通过代码可以看到,这些任务使用一个死循环,不断调用sys_yield尝试切换任务。

所以在这种机制下我们需要实现sched_yield函数,具有以下几个要求:

(1)找到状态为runnable的任务,并切换执行

(2)如果找到一个running状态的任务,且此任务执行的CPU为当前CPU,也可将此任务切换执行

(3)若没有runnable任务,则执行idle任务。

(4)从当前CPU执行的任务处开始遍历链表(为了保证公平性)

2、代码

sched_yield的任务调度代码如下:


首先找到CPU当前任务的下标,然后从下标的下一个开始遍历数组。博主这段代码写的比较笨,主要是为了方便调试所用。

同时还要增加系统调用的部分代码,把进入内核态后的系统调用号和具体的系统调用对应起来,较为容易故不再详细论述。


三、fork

1、原理

fork作为一个系统调用,其功能是根据父进程创建出一个一模一样的子进程,若返回的是0则说明是子进程,否则是父进程,同时返回值为子进程的系统调用号。

JOS实现fork过程采用的是用户态“类库”的形式封装了一系列系统调用,包括创建新进程、设置新进程状态、虚拟地址映射等等,这部分已经在user/dumbfork.c中封装好了,实验所要求的是实现相关的系统调用,包括:

sys_exofork:若为父进程返回子进程号,子进程则返回0。sys_env_set_status:设置子进程格式为runnable或者not_runnablesys_page_alloc:分配一个物理页并对应到某个虚拟地址sys_page_map:拷贝父进程的某个PTE,以此来建立子进程的虚拟内存映射sys_page_unmap:解除某个虚拟地址的映射(在PART B中使用)
2、代码sys_exofork:
可以看出,该函数首先复制各寄存器的状态(env_tf),然后系统调用本身返回子进程的id,因为调用此系统调用的进程为父进程。同时将子进程的eax寄存器设置为0,因为系统调用的结果存放在eax寄存器中,这样子进程返回后得到的系统调用返回结果就为0。
sys_env_set_status
首先判断状态会否合法,然后根据进程ID进行查找,最后设置状态并返回。
sys_page_alloc:
按实验要求判断各种条件。
sys_page_map:

主要是一些判断+LAB 2中的函数的封装,没什么可说的。


sys_page_unmap:



到此PART A基本结束了,运行结果如下:



PS:写起来怎么感觉这个实验好简单啊,做起来怎么感觉难到爆啊。。。。

6.828 JOS在Mac下的环境配置 官网上是建议只安装qemu的依赖,再安装他们自己改良过的qemu。但是在实际操作中configure的时候总是提示pkg_config找不到,看了下脚本好像是找不到pkg_config_exe不知道啥情况。最后参考这篇文章进行的配置 安装qemu brew install qemu 安装i386-jos-elf-gcc和i386-jos-elf-gdb brew tap liudangy... 阅读详情

相关推荐

操作系统内核的绝佳学习材料——JOS

操作系统内核的绝佳学习材料——JOS 前言:关于JOS和一些经验之谈 这一学期的操作系统课使用的是MIT用于教学的JOS操作系统,并且StonyBrook在其基础上做了大量改动,最重要的变化就是从32位移植到了64位。因为个人之前曾系统学习过Linux 0.11内核(《操作系统内核Hack:(四)内核雏形》,实现到时钟中断部分停下了),深知自己从零开始实现内核的工作量。即便是如我个人实

西代零零发 1万+

同步原语:锁

123

LIJIWEI0611的博客 791

MIT JOS LAB3学习笔记

LAB3概述:本次操作系统实验,我们对计算机的操作系统进行了初步的探究,通过完成作业和问题,对lab3部分有了较好的理解。Lab3主要实现能运行被保护的用户模式环境(protected user-mode environment,即process)的内核服务。我们将增加数据结构来记录进程、创建进程、为其装载一个程序镜像。我们还要让JOS 内核能够处理进程产生的系统调用和异常。具体来说:第一部分主要...

codes_first的博客 1325

linux xchgl 汇编含义,理解Linux内核中的xchg

在内核中,常看到这样的代码: int locked;locked = xchg(&kexec_lock, 1);在 include/asm-i386/cmpxchg.h 中,有如下定义: #define xchg(ptr,v) ((__typeof__(*(ptr)))__xchg((unsigned long)(v),(ptr),sizeof(*(ptr))))75 static i...

weixin_42308335的博客 2250

MIT 6.828 JOS 环境配置

MIT 6.828 JOS Lab1 记录这学期刚好在学操作系统课程,课余时间也比较充足,所以着手开始做鼎鼎大名的MIT 6.828 操作系统课程的Lab。It must be a long journey, and it just started!环境搭建GIT from MIT由于是第一个Lab,我们还是先要提前准备一些东西的。这门课程的资料可以通过Git获得,具体方法如下:athena% mk

Poundssss的博客 6624

mit6.828_Jos_lab4.rar_jos lab4

MIT6.828课程JOS的LAB4的源代码。造福大众,从我做起

各种类型的锁与原子操作

1、什么情况下,需要锁 一行代码翻译若干条指令,加锁将多条指令不被拆分。 2、lock、trylock、spinlock lock trylock spinlock 线程会休眠 线程不会休眠 线程不会休眠 线程A锁住后,线程B再去申请锁,会引起线程B的挂起,会引起线程的切换 不让线程B切换,线程B有可能被切换 线程B不会被切换,时间片到了也不会引起切换 适用于时间长(大于线程切换时间)粒度大 适用于时间短(小于线程切换时间)粒度小 3、

Goller_的博客 661

移动硬盘报错0x80070570?5分钟搞定CHKDSK修复(附详细参数说明)

本文针对移动硬盘报错0x80070570问题,提供了详细的CHKDSK修复方法。通过5分钟核心修复流程,指导用户使用系统自带工具快速修复文件系统逻辑错误,恢复硬盘访问。文章还深入解析了CHKDSK参数,并提供了备选数据恢复方案与日常防护建议。

app77的博客 234

【JUC并发】cmpxchg和lock指令

在多线程或多处理器系统中,多个处理器可能同时访问和修改同一片内存数据。为了确保数据一致性和操作的原子性,处理器需要提供机制来同步对共享内存的访问。CMPXCHG 和 LOCK 指令就是用于实现这些同步机制的关键。

Candy___i的博客 1500

大话西游2单机版V8一键架设教程:5分钟搞定GM权限和仙玉修改(附完整物品代码表)

本文详细讲解了大话西游2单机版V8的一键架设教程,包括5分钟快速配置GM权限、仙玉修改及物品代码使用技巧。通过分步指导和服务端配置详解,帮助玩家轻松掌握游戏管理功能,重温经典回合制体验。附完整物品代码表,助你快速获取稀有道具和神兽。

weixin_42557830的博客 1231

语义通信实战:跳过“比特”保“语义”,手把手构建轻量级图像压缩重建网络(基于PyTorch)

本文详细介绍了基于PyTorch的轻量级语义通信系统LICRnet的实现,专注于图像压缩重建中的语义信息保留。通过深度可分离卷积、可变窗口多尺度注意力等创新技术,显著降低计算量并提升性能,特别适用于无人机巡检、远程医疗等物联网场景。文章包含完整的代码实现、训练策略及部署优化方案。

weixin_27697385的博客 221

linux下的线程锁----原子锁

交换指令XCHG是两个寄存器,寄存器和内存变量之间内容的交换指令,两个操作数的数据类型要相同,可以是一个字节,也可以是一个字,也可以是双字[1] 。其指令格式如下: XCHG Reg/Mem, Mem/Reg,Reg/Reg 该指令的功能和MOV指令不同,后者是一个操作数的内容被修改,而前者是两个操作数都会发生改变。寄存器不能是段寄存器,两个操作数也不能同时为内存变量。 XCHG指令不影响标志

程序狗的成长之路 3292

使用VIVADO 2019.1 搭建以太网接口

以太网 MAC+SGMII->GMII接口转换 以FPGA V7为例,搭建一个千兆以太网接口。运行环境为Vivado2019.1。板卡的FPGA V7与千兆网口芯片采用SGMII互联,最终实现FPGA与上位机之间的千兆网卡通信,实际实现时,V7采用MAC + GMII ->SGMII的结构。SGMII接口使用1G/2.5G Ethernet PCS/PMA or SGMII ip核,MAC层使用Tri Mode Ethernet MAC ip核。 由于MAC层IP不支持SGMII接口,因此需要G

qq_44641513的博客 8415

JOS学习笔记(三)

过了个年,好久没碰专业内的东西了,之前做的JOS相关的东西都快忘了,还是看了前面两篇日志才想起来。 当进入内核后基本都是比较简单的代码了,我也并没有全部分析,根据讲义要求只分析了一下printf函数和堆栈的backtrace,所以这篇日志也就写这两个方面吧。 1、printf函数。 进入kernel后从i386_init函数开始,首先做一些初始化工作,包括部分内存的清零,初始化显示器串口等(

锐之锋芒 4934

软考中级-软件设计师 Python基础

软考中级-软件设计师 Python知识点整理

片言可决讼,半纸能缚龙 3642

把外部系统一键装进 SAP Build Work Zone:从零开始创建 HTML5 URL App

HTML5 URL App 是一种轻量级解决方案,可将外部网页或系统入口快速集成到SAP企业门户中。开发者只需在manifest.json中配置目标URL、导航模式等参数,无需开发完整前端应用。该方案利用SAP BTP的HTML5 Application Repository集中存储静态资源,通过HTML5 Apps Content Provider将应用暴露给子账号,最终在SAP Build Work Zone中以Fiori磁贴形式呈现。文章详细介绍了manifest.json的关键配置、三种基础设施组件

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 241

JOS学习笔记(七)

接前一篇。 上篇日志主要是完成了一些分页相关机制的工作,但还没有真正的去使用这个分页系统。Lab2的part3部分主要就是让我们使用part2中完成的映射机制来初始化内核的页目录和页表,并将此页目录加载到cr3里,让os真正去使用我们初始化之后的页目录以取代kernpgdir.c里面简单的页目录。 在开始之前让我们看一下JOS的虚拟内存分布图,在part3里的所有工作就是照着此图实现其中的部分

锐之锋芒 4388

OpenClaw 2026 路线图详解:3 大协作能力升级与社区贡献增长 62% 的实证分析

介绍 OpenClaw 2026 如何通过上下文锚定(Context Anchoring)、协作质量定义和责任边界机制,将 AI 编程工具从单点补全升级为嵌入代码生命周期的协作对齐系统,并详解 `.openclaw/config.yaml` 中 `context_anchor` 配置的实操方法与效果

weixin_42545292的博客 383

JOS学习笔记(九)

LAB3代码已经上传。 最近忙于打WOWTCG,早就做完了一直没腾出时间写博客。 LAB3第二部分主要是处理系统调用。 第一部分我们已经让第一个env运行了起来,接着这个env执行一个cprintf,这个cprintf是一个系统调用,因为os暂时没有实现系统调用,所以系统崩溃。 在lab2我们就要完成各种系统调用以及exception和trap等的实现。 handout地址:http:/

锐之锋芒 6717

Openai gym environment for multi-agent games

用于多智能体游戏的 OpenAI Gym 环境

suiusoar 1194

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

JOS学习笔记(五)

神说、内存之间要有映射、将地址空间分为虚实。  神就造出两级页表、将变换前的地址、变换后的地址分开了.事就这样成了。  有晚上、有早晨、是第二日。 来到了lab2,内存管理,该实验分为两部分,第一部分为物理内存管理,第二部分为虚拟内存管理,本篇先描述lab1。 做本章实验一定头脑中要时刻清晰的记住两个内存分布图:物理内存分布图以及虚拟内存分布图。 物理内存的分布在前面的笔记中有介

锐之锋芒 8309

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

JOS学习笔记(八)

神说、内核要有自己的数据、使用户不可访问.事就这样成了。  神称高地址为内核空间、称低地址为用户空间. 神看着是好的。  神说、用户要有自己的进程、和自己的页表、并可以进行系统调用.事就这样成了。   有晚上、有早晨、是第三日。  1、lab3概述 lab3大体分为两部分,第一部分包括执行环境(可以简单的理解为进程,下文也用进程代替执行环境)的建立和运行第一个进程,第二个部分初始

锐之锋芒 8154

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

JOS学习笔记(二)

接上篇,文件跳转到了entry.S里面,这是kernel的入口。首先面临这么一个问题,kernel被加载到了什么地方? 回想上篇elf文件的加载机制,以及objdump里打印出的kernel信息,可以看到,kernel的代码段(text段)被加载到了0x100000的位置,也就是1m的位置,所以内存布局如下: +------------------+ <- 0xFFFFFFFF (4GB)

锐之锋芒 3487

JOS学习笔记(四)

Lab1还差最后一部分,就是给出具体的调试信息,如下面所示: K> backtrace Stack backtrace: ebp f010ff78 eip f01008ae args 00000001 f010ff8c 00000000 f0110580 00000000 kern/monitor.c:143: monitor+106 ebp f010ffd

锐之锋芒 4189

MIT JOS 理解lab1

总结MIT的操作系统实验 JOS lab1,解释PC 启动的几个流程和跳转,重点在于gdt的建立,即实模式到保护模式的转换

MSRA_SE_TEAM的专栏 4164

JOS-lab4

Jos-Lab4 设计文档 By Ddnirvana 本次Lab4分为三个部分,下面也按照这个结构进行lab实现过程的说明。Part A: Multiprocessor Support and Cooperative MultitaskingPART A是整个lab4的基础,主要就是实现多处理器的支持。并且在PART A里面不怎么好测试,而且之前LAB中的BUG全部坑在这部分了,所以还是小麻烦的

dfcmdd的博客 2058
上一篇: JOS学习笔记(十)
下一篇: JOS学习笔记(十二)
ROger__Wong
博客等级 码龄14年 250粉丝 78原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值