JOS学习笔记(七)

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

接前一篇。

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

在开始之前让我们看一下JOS的虚拟内存分布图,在part3里的所有工作就是照着此图实现其中的部分映射。

 首先从高位地址说起,kernbase到最高为4g是一块remapped内存,这块很大的内存从低到高要映射整块物理内存。

其次kernbase往下PTSIZE(貌似是4M)是无用内存,再往下是KERNSTACKTOP也就是内核栈的栈顶,众所周知栈的生长顺序是从高地址向低地址生长,所以这个位置也就是栈开始生长的位置。从KERNSTACKTOP往下KSTKSIZE为内核栈区域,大概是8个页面,内核栈不能超过这个区域。从KERNSTACKTOP往下一个PTSIZE这块区域除了内核栈之外还有一块空白区域,防止栈溢出的时候复写用户空间的数据。

接着是ULIM,代表用户空间的最高地址,换句话说此位置往下所有空间为用户空间,用户空间有很多东西,之后的LAB会详细说明,在此只说UPAGES。

UPAGES是JOS用户记录物理页面使用情况的数据结构,为了使用户空间能访问这块数据结构,会将PAGES映射到UPAGES位置。

好总结一下,是要总共要求映射3块区域,,1是映射UPAGES结构,,2是映射内核栈,3映射整块物理内存。


 

1、UPAGES的映射

所谓映射就是将某个虚拟内存地址(符号地址)映射到实际的物理地址,UPAGES映射到pages也就是通过UPAGES访问到的地址恰恰是pages这个符号指向的物理地址的内容。而映射的实质就是往页表和页目录里写入相应的值,使UPAGES这个符号经过地址变换之后指向的地址恰好是pages的物理地址。

实现的方式很简单,先获取pages数组的大小,并向上对齐到PGSIZE得到要映射的页面,然后一个页面一个页面分别映射即可。

容易出错的地方:(1)不能使用sizeof获取pages数组的大小,因为此数组是动态分配的,使用sizeof只会获取到pages这个指针本身的大小(4B)。(2)一个页面地址映射一次即可,映射的最小单位是页面,一个页面内的地址不需要反复映射。


2、内核栈的映射。

目前内核栈的符号地址是bootstack表示栈底(栈的低地址,不是逻辑上的栈底反而是逻辑上的栈顶,因为向下生长),需要将KSTACKTOP-KSTKSIZE映射到这个位置,并向上按顺序映射KSTKSIZE大小的内存区域。

其余部分不用管,虽然函数说明中写了很多。



3、映射整块内存区域。

要映射KERNBASE到0xffffffff总共256M内存的空间到从0开始的物理地址。虽然我们没有足够的物理空间,但we just set up the mapping anyway。什么叫just set up the mapping anyway啊,没有就是没有,不够就是不够,你让我映射到哪里去?!抱怨归抱怨,但我都给映射到了物理的0地址上去了,也算是没有办法的办法。

但这么映射整块物理内存会出问题。在page_insert操作中会将该Page结构的pp_ref++,但映射整块物理内存的过程实际是便利了整个pages数组,这就会导致所有的Page结构的pp_ref++。但别忘了还有个page_free_list串起来了空闲的Page,这些空闲的Page理所应当的pp_ref也被增加了,最后的结果是page_free_list里面页面的pp_ref不为0。在空闲链表中的页面的引用次数不为0,这很明显是不符合逻辑的,因此要进行--操作。

当然还有一种解释是:不这么做通不过check,至于愿意相信哪种随你好了。

通过这个问题我觉得这算是JOS设计不合理的一个地方,映射和页面被引用是否是一个概念?谁负责维护pp_ref的信息,是这个页面的申请者还是page_insert函数还是page_insert的调用者?感觉这些地方还有待商榷。但之前1和2的映射不用考虑这个问题是因为牵扯到的页面不在free_page_list里,这在free_page_list初始化的时候就把里面的页面剔除了。


最后,可以看到通过check。



lab2到此结束,lab2和lab1的代码我上传到自己的资源里欢迎下载。

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

相关推荐

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...

努力学习的姜饼 1806

虚拟地址与物理地址栈的映射关系

                                虚拟地址与物理地址栈的映射关系全篇围绕下图展开:(以JOS架构说明)KERNBASE:0xF0000000;以下部分(物理内存与虚拟内存均相差KERNBASE,栈结构都是一致的,所以我仅仅陈列虚拟内存的结构)KERNBASE+0x00100000上面是内核数据。(中间保留)end:标记内核数据在虚拟内存中最后的位置。分配页表:从Bas...

Jector7的博客 752

MIT JOS LAB3学习笔记

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

codes_first的博客 1325

获取操作系统的内核基地址

操作系统的内核模块根据处理器的个数和是否支持PAE(Physical Address Extension物理地址扩展)分为以下四种 ntoskrnl.exe ---Uniprocessor单处理器,不支持PAE ntkrnlpa.exe ---Uniprocessor单处理器,支持PAE ntkrnlmp.exe ---Multiprocess...

weixin_33724046的博客 653

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在macOS下的环境配置

本文将介绍如何在macOS下配置MIT6.828 JOS实验的环境。

He11o_Liu的专栏 3845

清华操作系统实验ucore_lab2

lab2 实验目的 理解基于段页式内存地址的转换机制 理解页表的建立和使用方法 理解物理内存的管理方法 练习0: 需要更改的文件为kdebug.c和trap.c,具体更改的代码如下: kdebug.c: uint32_t t_ebp = read_ebp(); uint32_t t_eip = read_eip(); int i,j; for(i = 0;i< STACKFRAME_DEPTH && t_ebp!=0;i++) { cprintf("ebp=%08x,e

JustinAustin的博客 2971

深度学习的卷积神经网络的煤矸石识别

在本博文中,我们提出了一种基于深度学习的煤矸石检测与识别系统,该系统采用YOLOv8算法对煤矸石进行检测和识别,实现对图片中的煤矸石进行准确识别。1.项目需求对煤矸石进行检测与识别,系统将识别出图片中的克服小块煤矸石漏检的缺陷。 2.项目实现 通过调研,本项目最终使用yolov8模型作为目标检测的模型, YOLOv8 旨在快速、准确且易使用,使其成为广泛的物体检测、图像分割和图像分类任务的极佳选择。 1.数据集:格式为jpg的3091张煤矸石图片2.YOLOv8环境配置yolo检测网络包括24个卷积层

2201_75355700的博客 792

关于JOS 未对所有内存分页映射之前 物理地址映射问题的思考

在kern/pmap。         ////////////////////////////////////////////////////////////////////// // create initial page directory. kern_pgdir = (pde_t *) boot_alloc(PGSIZE); memset(kern_pgdir, 0, PGSIZE

Jason Leaster | Rebuilding the tower of babel 1963

海思SD3403/SS928开发(二)环境搭建:从零到一构建高效开发环境的实战指南

本文详细介绍了海思SD3403/SS928开发板环境搭建的全流程,包括Ubuntu系统选择、基础配置、开发环境依赖安装、SDK工具链配置等关键步骤。通过实战经验分享,帮助开发者避免常见问题,快速构建高效开发环境,提升开发效率。

weixin_28717683的博客 284

5.4 磁悬浮轴承控制系统仿真:在MATLAB/Simulink中搭建包含功放、传感器模型的闭环系统模型,进行稳定性与动态性能仿真

磁悬浮轴承控制系统仿真方法 摘要:磁悬浮轴承控制系统仿真需建立包含转子动力学、传感器、控制器、功率放大器和电磁执行器的高保真非线性模型。通过MATLAB/Simulink搭建闭环系统,重点建模传感器带宽限制与噪声、功放饱和特性以及电磁力非线性。仿真分析包括时域阶跃响应、扰动抑制测试,频域稳定性分析(伯德图、奈奎斯特图),以及参数摄动下的鲁棒性验证。关键要验证控制算法在非线性因素影响下的稳定性和动态性能,为实际系统实现提供可靠依据。仿真中需特别注意物理量单位一致性和数字控制离散化效应。

技术工作者 1107

JOS学习笔记(三)

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

锐之锋芒 4934

TikTok网页版X-bougs和_signature参数逆向实战:从断点到RPC调用的完整流程

本文详细解析了TikTok网页版X-bougs和_signature参数的逆向工程实战,从基础断点调试到高级RPC调用,完整还原加密参数的生成过程。通过工具链搭建、加密定位、核心突破及实战演练,帮助开发者深入理解TikTok的加密体系,并构建自动化签名系统。

weixin_28691003的博客 438

JOS学习笔记(九)

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

锐之锋芒 6717

C#跨平台制图新纪元:Mapsui,一库在手,地图我有

深入学习Mapsui的渲染机制,定制属于你的地图样式,无论是颜色、图标还是文字,都可以随心所欲。

java专栏 1456

2026年全国青少年信息素养大赛算法应用主题赛(C++赛项复赛模拟卷1:文末附答案)

2026年全国青少年信息素养大赛算法应用主题赛(C++赛项复赛模拟卷1:文末附答案)

王老师青少年编程 1613

JOS学习笔记(十一)

JOS LAB4 PART A的剩余部分

锐之锋芒 5333

SAP-ABAP:BAPI_INSPOPER_RECORDRESULTS 记录检验操作结果更新检验批状态详细解析

SAP-ABAP:BAPI_INSPOPER_RECORDRESULTS 记录检验操作结果更新检验批状态详细解析

baidu_35680696的博客 967

JOS学习笔记(五)

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

锐之锋芒 8309

ZeroClaw安装、使用方法详细全解

ZeroClaw 是一个用 Rust 编写的轻量级、高性能、完全自主的 AI 助手运行时框架

洛星核的博客 618

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

JOS学习笔记(二)

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

锐之锋芒 3487

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

JOS学习笔记(八)

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

锐之锋芒 8154

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

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

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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

Learning by doing——JOS lab1

JOS是MIT开放课程6.828的实验系统,它做好了涉及底层硬件的基本操作,留给我们一个OS空架子,待我们一步步添加代码,最终形成功能完善的OS。最近做完了lab1,相对于看Linux源码轻松许多,但却切实体验了一把动手写操作系统的感觉。在做实验的时候,要明白的一点是,做这个实验是为了帮助我们更好的理解操作系统的概念和基本的设计原则,多想想要是自己设计这个系统会怎么做,然后对比JOS设计,给出

自由而不散漫,主见而不偏执 1421
上一篇: 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、付费专栏及课程。

余额充值