神说、进程要有多个、可以分片、切换、互不影响. 
并要支持多任务、多处理器并行.事就这样成了。 
 于是 神造了多个内核栈,又开辟多个寄存器。 
 就把这些摆列在内存里、内核空间里、 
管理多核,分别任务. 神看着是好的.

有晚上、有早晨、是第四日。

博主写完论文,又写了个简单的编译器,然后回来再拾起来差点烂尾的JOS发现代码已经完全看不懂了,花了一整天时间复习之前自己写的博客,才勉强做了实验四的一点。

本篇博客内容对应课程地址(http://pdos.csail.mit.edu/6.828/2011/labs/lab4/)locking标签之前的内容,也就是多核CPU的初始化工作。博客分以下2部分来进行阐述,1、多核启动流程,2、实验部分

1、多核CPU启动流程

在内核加载和进行初始化时,即便是有一个多核CPU,也只能使用一个核,为了和JOS实验中的描述一致,我们这里暂且把多个核(Core)称之为多个CPU。

内核启动过程中用于执行代码的CPU叫做bootstrap processor (BSP),其它还未被使用的CPU叫做application processors (APs),所以在内核执行的时候必然会有的一个过程就是使用BSP来激活AP的过程。

对应JOS代码是init.c中的init主函数,其关键片段如下:

lab2的 mem_init,lab3的env_init和trap_init,lab4的mp_init和lapic_init在这之后需要补充一个Big kernel Lock 暂时不用管,然后boot_ap函数启动所有的CPU,接着有多少个CPU就建立多少个ENV。

在启动过程中,mp_init和lapic_init是和硬件以及体系架构紧密相关的,通过读取某个特殊内存地址(当然前提是能读取的到,所以在mem_init中需要修改进行相应映射),来获取CPU的信息,根据这些信息初始化CPU结构,大致流程就是这样,博主因为能力所限,这部分就不进行详细分析了。

boot_ap是个很有趣的函数。在函数中首先找到一段用于启动的汇编代码,该代码和上一章实验一样是嵌入在内核代码段之上的一部分,其中mpentry_start和mpentry_end是编译器导出符号,代表这段代码在内存(虚拟地址)中的起止位置,接着把代码复制到MPENTRY_PADDR处。随后调用lapic_startap来命令特定的AP去执行这段代码。

这段汇编(mpentry.S)中所做的工作和entry.S所做的工作基本相同。需要注意的一点是每个CPU都有自己的寄存器和栈,需要启动的AP目前还处于实模式,并且内存也没有开启分页,因此所有和符号地址相关的操作都要非常谨慎的转换为物理地址。

之后控制流跳转到mp_main,值得注意的是从mpentry.S开始这些代码都是执行在AP上的,此时BSP正在等待(while循环)AP启动成功。在mp_main里可以看到AP初始化自己的env,trap等,接着改变自己的cpu数据结构中的cpu状态标志为启动成功,然后进入死循环空转。BSP得到AP启动成功的信息后接着尝试启动下一个AP。

整个启动流程大概就是如此,下面进入实验过程。

2、实验

2.1

第一个任务是因为我们把代码拷贝到了MPENTRY_PADDR处,所以要在初始化Page的时候把这一页从Page_Free_List中取出来,以防止该页被分配出去导致代码拷贝的失败进而不能正确启动AP。

只需要在pmap.c的page_init函数的最后加上以上几行代码,首先获取该地址对应的Page结构,然后从page_free_list中剥离就行。

如果正确的话,此时应该能通过check_page_free_list函数

2.2

第二个实验要求为每一个核映射其内核栈,也就是对于编号为i的cpu,需要映射KSTACKTOP-i*(KSTKSIZE+KSTKGAP)-KSTKSIZE 到KSTACKTOP-i*(KSTKSIZE+KSTKGAP) 这块虚拟地址空间到符号percpu_kstacks[i]所对应的物理地址处,改变mp_mem_init函数,代码如下:

值得注意的是,虽然课程中说此时应该可以通过check_kern_pgdir,但实际上是通不过的。原因在于BSP的内核栈被映射了两次,第一次是在lab3中将内核栈映射到了bootstack,当时只有一个CPU,自然映射的是BSP的堆栈;第二次是在我们刚才写的代码里,将BSP(也就是cpunum()==0的CPU)的内核栈映射到了percpu_kstack[0]。诡异的是bootstack地址不等于percpu_kstack地址,而check_kern_pgdir里居然要求两种映射都存在的情况下才能通过。这显然是不可能的,感觉是JOS实验设计中的一个疏忽吧。因此我把检查bootstack的那段代码注释掉了,这样才得以通过。

2.3

第三个实验是需要完成trap_init_percpu()函数,给相应的CPU加载正确的TSS段选择子,代码如下:

根据函数中的暗示+照葫芦画瓢,不难把代码改成上述的样子。

至此就完成了LAB4的PART A的一小部分,运行目前的OS可以看到(使用make qemu CPUS=4)可以发现创建了9个env,然后出现了未定义的sys_call,系统panic。

JOS学习笔记(十)相关推荐

  1. IOS之学习笔记十五(协议和委托的使用)

    1.协议和委托的使用 1).协议可以看下我的这篇博客 IOS之学习笔记十四(协议的定义和实现) https://blog.csdn.net/u011068702/article/details/809 ...

  2. 吴恩达《机器学习》学习笔记十四——应用机器学习的建议实现一个机器学习模型的改进

    吴恩达<机器学习>学习笔记十四--应用机器学习的建议实现一个机器学习模型的改进 一.任务介绍 二.代码实现 1.准备数据 2.代价函数 3.梯度计算 4.带有正则化的代价函数和梯度计算 5 ...

  3. 吴恩达《机器学习》学习笔记十二——机器学习系统

    吴恩达<机器学习>学习笔记十二--机器学习系统 一.设计机器学习系统的思想 1.快速实现+绘制学习曲线--寻找重点优化的方向 2.误差分析 3.数值估计 二.偏斜类问题(类别不均衡) 三. ...

  4. 吴恩达《机器学习》学习笔记十——神经网络相关(2)

    吴恩达<机器学习>学习笔记十--神经网络相关(2) 一. 代价函数 二. 反向传播算法 三. 理解反向传播算法 四. 梯度检测 五. 随机初始化 1.全部初始化为0的问题 2.随机初始化的 ...

  5. Mr.J-- jQuery学习笔记(十九)--自定义动画实现图标特效

    之前有写过自定义动画Mr.J-- jQuery学习笔记(十八)--自定义动画 这次实现一个小demo 图标特效 页面渲染 <!DOCTYPE html> <html lang=&qu ...

  6. Mr.J-- jQuery学习笔记(十六)--展开和收起动画折叠菜单的实现

    之前写过动画的隐藏与显示:Mr.J-- jQuery学习笔记(十四)--动画显示隐藏 动画隐藏与显示的一个小demo--对联广告:Mr.J-- jQuery学习笔记(十五)--实现页面的对联广告 与动 ...

  7. Mr.J-- jQuery学习笔记(十五)--实现页面的对联广告

    请看之前的:Mr.J-- jQuery学习笔记(十四)--动画显示隐藏 话不多说,直接上demo <!DOCTYPE html> <html lang="en"& ...

  8. kvm虚拟化学习笔记(十)之kvm虚拟机快照备份

    KVM虚拟化学习笔记系列文章列表 ---------------------------------------- kvm虚拟化学习笔记(一)之kvm虚拟化环境安装 http://koumm.blog ...

  9. mysql 临时表 事务_MySQL学习笔记十:游标/动态SQL/临时表/事务

    逆天十三少 发表于:2020-11-12 08:12 阅读: 90次 这篇教程主要讲解了MySQL学习笔记十:游标/动态SQL/临时表/事务,并附有相关的代码样列,我觉得非常有帮助,现在分享出来大家一 ...

  10. ROS学习笔记十二:使用roswtf

    ROS学习笔记十二:使用roswtf 在使用ROS过程中,roswtf工具可以为我们提供ROS系统是否正常工作的检查作用. 注意:在进行下列操作之前,请确保roscore没有运行. 检查ROS是否安装 ...

最新文章

  1. mysql_select按照指定的格式输出到文件
  2. 软件测试是采用(A)执行软件的活动,测试(Test)测试是一项采用测试用例执行软件的活动,在这.ppt...
  3. 动态分辨率是什么意思_b站么么直播最新动态里都有啥 b站什么意思
  4. cmake学习(二)常用变量和常用环境变量
  5. 控制寄存器:指令指针寄存器IP:存放下一条指令的地址的偏移量,标志寄存器FR(16):
  6. Eclipse引入jar包步骤
  7. 脉冲神经网络的开发公司AI-CTX
  8. 小米汽车计划在2024年上半年出车:第一年卖10万台
  9. WebStorm 9“神器”变“霸器”
  10. java打字训练课程设计_Java打字训练课程设计
  11. 四巧工作简化法(ECRS)
  12. Numpy之数据清洗功能
  13. php 判断访问类型,基于php判断客户端类型
  14. 沟通CTBS常见问题
  15. 计量经济学(七)----自相关性Autocorrelation.
  16. 电脑进入pe时蓝屏_进入PE系统就蓝屏怎么办?
  17. 微信html5 下拉刷新,微信小程序下拉刷新:onPullDownRefresh正确使用姿势
  18. win与安卓同步剪切板 快传照片
  19. 语音情绪识别.PDF
  20. linux icc编译器,icc编译器

热门文章

  1. Mysql 查询人数大于或等于 100 且 id 连续的三行或更多行记录。
  2. 常用ASP代码加密工具的工作原理
  3. 新玺配资:煤炭深蹲 新能源方向迎来机会!
  4. oracle中使用online,batch(Oracle+shell)及Online(web即Java)使用场景区分(1)
  5. 关于修改VS资源的ID:例如MENU
  6. 前端base64发给后端图片太大怎么办
  7. 模糊PID(重心法解模糊梯形图FC)
  8. windows shell 编程
  9. 林仕鼎:大数据需要三类人才
  10. mesos java_mesos 入门