• Stars
    star
    265
  • Rank 153,631 (Top 4 %)
  • Language
    C
  • Created about 6 years ago
  • Updated 4 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

《操作系统真象还原》一书实现的系统代码

tiny-os

环境准备

Bochs

在Mac上使用以下命令安装:

brew install bochs

配置

每个章节下的bios配置部分应视bochs的具体版本而定,可自行修改:

# 对应真实机器的bios
romimage: file=/usr/local/Cellar/bochs/2.6.9_2/share/bochs/BIOS-bochs-latest
# 对应真实机器的VGA bios
vgaromimage: file=/usr/local/Cellar/bochs/2.6.9_2/share/bochs/VGABIOS-lgpl-latest

说明

每个章节下的代码均可以独立运行,在对应的目录下执行以下命令即可启动:

./build.sh

即可启动执行。完毕之后可执行以下命令清理环境:

./clean.sh

运行

第三章

结果

第四章

结果

有以下几点需要注意:

  1. 书中的源码boot.inc的DESC_LIMIT_VIDEO2定义可能有误,应修改为:

    DESC_LIMIT_VIDEO2 equ 00000000000000000000000000001011b

    原因是保护模式的基地址是0xb8000,所以最后8位应该是b,而不是0,这样才能正确显示字母'P'。

    第164页的图4-11同样有问题,第4个GDT表项(显存)的base应该等于0xb8000,因为如果是图中的0xc00b8000,那么对应的物理内存地址是3072MB处,明显不合理。

  2. Mac上的nasm并不支持数字中间以下划线分割的写法,会出现编译错误。

  3. 第161页代码4-3的21行为:

    times 60 dq 0

    Apple版本的nasm这样写会报错,原因是不能把int型的0赋给dq。稍加变通即可:

    times 120 dd 0

第五章

内存检测

这里对书中源码进行了改造,只使用e820一种方式,检测失败时会在第一行显示字符串: 'failed',成功将在第二行显示: 'done',如下图:

内存检测结果

内存检测的结果通过命令: x /4wx 0xb00查看,如下图:

检测结果

结果正是我们设置的内存大小: 32MB,无误。

内存分页

内存分页结果

这一节注意要和前面的保护模式、内存检测部分结合起来。

加载内核

由于此时没有可以用于打印的手段,所以正确性需要到下一章节验证。此部分需要使用Linux交叉编译器中的ld命令才可以正常链接,Mac自带的无法使用,Mac上的安装参考:

11-kernel-crosscompiler

第六章

打印字符串

打印字符

这里是打印字符和打印字符串两者结合的效果,这里遇到了一个奇怪的问题,如果在main.c中存在除main之外的其它函数,那么实验结果将不正确,原因未知。

打印数字

打印数字

第七章

ASM

汇编中断实现

改进

改进

Timer

timer

实验中的中断号与书中不同。

第八章

Assert

Assert

注意, 在64位Linux系统上编译时有几点需要注意:

  • GCC加上参数:

    -m32 -fno-stack-protector
  • LD增加参数:

    -m elf_i386
  • 在Ubuntu上使用apt安装的bximage版本较老, 创建镜像的命令为:

    bximage -hd -mode=flat -size=10 -q disk.img

内存池

内存池

内存分配

内存分配

注:上一节中内存池初始化代码有一个bug:用户内存池其实地址应该是0xc009a1e0,已在此节修正。

第九章

线程启动

线程启动

线程调度

线程调度

这部分两次上下文切换的过程较难理解,整理成如下的时序图:

时序图

注意:

  • 如果被调度线程是第一次执行,那么转到线程对应的函数
  • 如果不是第一次被调度,那么走时序图的下半部分,原因是switch_to中保存的起始地址其实是此函数的返回地址
  • 虚线流程由第二次调度触发

第十章

锁

More Repositories

1

spring-analysis

Spring源码阅读
Java
13,457
star
2

jdk-sourcecode-analysis

JDK源码阅读笔记
Java
1,944
star
3

onlineexam

在线考试
Java
69
star
4

tomcat-jdbc-notes

Tomcat自带数据库连接池源码阅读
Java
65
star
5

js_calculator

JavaScript模仿Windows10计算器
JavaScript
53
star
6

mysql-driver

Mysql jdbc驱动源码阅读
Java
24
star
7

netty-wheel

简单netty轮子
Java
23
star
8

X86_ASM

《X86汇编语言-从实模式到保护模式》实验
Assembly
19
star
9

Consumer

封装常用的生产者-消费者模型
Java
18
star
10

activemq-notes

active-mq源码阅读
Java
10
star
11

configurator

配置注入,简单IOC
Java
7
star
12

tomcat-notes

Tomat源码阅读笔记
7
star
13

feign-consumer

Spring-cloud-feign学习
Java
3
star
14

hotspot

从《Hotspot实战》一书中引出的想法,^_^
Java
3
star
15

jvm

深入理解jvm虚拟机例子
Java
3
star
16

nb-job-notes

niubi-job源码阅读笔记
3
star
17

clock

JavaScript闹钟
JavaScript
3
star
18

eureka-learn

Spring cloud eureka学习
Java
3
star
19

concurrent-notes

The Art of Multiprocessor Programming, some codes...
Java
3
star
20

elastic-job-learn

Elastic-Job学习
Java
3
star
21

designpatterns

设计模式demo
Java
3
star
22

8086_ASM

《汇编语言》第三版实验
Assembly
3
star
23

concurrent

Java Concurrency in Practice
Java
2
star
24

notes

笔记
2
star
25

datastructure

数据结构课程相关代码
C
2
star
26

useful-scripts

Python
1
star
27

spring-cloud-learn

RT
Java
1
star
28

lambda

<Java8函数式编程>代码
Java
1
star
29

ribbon-consumer

Netflix ribbon learn
Java
1
star
30

snake

贪吃蛇
Java
1
star
31

2048

2048
Java
1
star
32

design

毕业设计--爬虫
Java
1
star
33

tips

javascript模态提示小工具
JavaScript
1
star
34

Tetris

Javascript Canvas实现的俄罗斯方块
JavaScript
1
star