Skip to content

ywx2012/ossrc

Repository files navigation

《穿越操作系统迷雾》源码

经作者同意,上传到GitHub。仅供学习交流使用,分享转载请保留作者版权声明。

可以前往豆瓣和作者讨论交流。

截图

./screenshot.png

仓库说明

Tags下面放的是完全没有任何改动的纯净版原始源码。

main 分支如无必要,不对原始代码进行任何改动。

改动

支持Linux/x86 Boot Protocol

kvmtool支持一种独特的加载方式,当检测不出文件格式时,会把内核文件内容直接加载到0x10000处。原始代码只支持这一种加载方式,离开了kvmtool就无法运行。这里对原始代码进行了一些的改动,以便支持Linux/x86 Boot Protocol。这样就不会报Warning: Kernel image is not a bzImage了,也方便后续支持在QEMU下运行。

因为Linux/x86 Boot Protocol会把保护模式代码加载到0x100000。因此需要把start32改到这个位置,同时因为在原始代码中这是start64所在位置,先把start64挪到0x200000。

原始代码中,跳往start64时,并没有跳到0xffffffff80100000这个地址,而是跳到了0x100000。因此,在0x0和0xffffffff80000000开始的地址空间内都映射了内核。不知道出于什么原因,0x0处仅映射了2MB,而0xffffffff80000000处映射了KERNEL_PAGE_NUM页。为方便起见,这里就把原始代码 .org 0x33000 处第一项直接指向 pml2 。

因为pml2内容会由前面的代码填充,故一开始全填零即可。原始代码在这里填了第一项。

因为vesa_mode_info固定在0x4000,且有256个字节了,因此setup_sects为0x20,(0x4200-0x200)/512。

支持QEMU

参考INT 15H, E820H,查询系统地址区间时需要设置EDX为0x0534D4150。原始代码漏了这行,倒也不影响在kvmtool上运行。

因为QEMU不支持VESA,参考VBE Display API,改成QEMU Standard VGA获取framebuffer地址。并强制设置成640x480x32。

因为QEMU默认内存大小为128M,而原始代码app1和app2物理地址起始位置分别为0xc800000和0xd000000。分别改成0x1000000和0x2000000。

因为schedule代码限制,在切换到current的栈之前,打开中断会崩溃。而QEMU PIT初始状态可能就是开着的。sti会立即产生时钟中断。为了避免对代码进行改动,就把sti往后挪一下。

增加了atkbd_init,关闭8042的translation,并把Scan Code Set设置为2。不然按键输出是错的。

目前已能支持在Github Actions里运行起来,并通过截图对比。

支持在不同Linux发行版下编译运行

objcopy跳过.note.开头的section。有些发行版默认打开,会导致system.bin无法生成。

因为有些发行版编译器不支持,检测到有这个选项再设置 -fcf-protection=none

有的发行版无法编译 push $main 这行,改为 pushq $main

Alpine

安装编译工具
apk add make gcc musl-dev linux-headers
安装编译kvmtool所需依赖
apk add sdl12-compat-dev

运行会Segmentation fault,原因不明。

安装QEMU
apk add qemu-system-x86_64

ALT

安装编译工具
apt-get install make gcc
安装编译kvmtool所需依赖
apt-get install libSDL-devel glibc-devel-static
安装QEMU
apt-get install qemu-system-x86-core

ArchLinux

安装编译工具
pacman -S make gcc
安装编译kvmtool所需依赖
pacman -S sdl12-compat
安装QEMU
pacman -S qemu-system-x86

CentOS

安装编译工具
dnf install --setopt=install_weak_deps=False make gcc
安装编译kvmtool所需依赖
dnf install --setopt=install_weak_deps=False glibc-static sdl12-compat-devel
安装QEMU
dnf install --setopt=install_weak_deps=False qemu-kvm

Debian

安装编译工具
apt-get --no-install-recommends install make gcc libc6-dev
安装编译kvmtool所需依赖
apt-get --no-install-recommends install libsdl1.2-compat-dev
安装QEMU
apt-get --no-install-recommends install qemu-system-x86

Fedora

安装编译工具
dnf install --setopt=install_weak_deps=False make gcc
安装编译kvmtool所需依赖
dnf install --setopt=install_weak_deps=False glibc-static sdl12-compat-devel
安装QEMU
dnf install --setopt=install_weak_deps=False qemu-system-x86-core

Mageia

安装编译工具
dnf install --setopt=install_weak_deps=False make gcc
安装编译kvmtool所需依赖
dnf install --setopt=install_weak_deps=False glibc-static-devel lib64SDL-devel
安装QEMU
dnf install --setopt=install_weak_deps=False qemu-system-x86-core

openSUSE

安装编译工具
zypper install --no-recommends make gcc
安装编译kvmtool所需依赖
zypper install --no-recommends libSDL-devel glibc-devel-static
安装QEMU
zypper install --no-recommends qemu-x86

Ubuntu

安装编译工具
apt-get --no-install-recommends install make gcc libc6-dev
安装编译kvmtool所需依赖
apt-get --no-install-recommends install libsdl1.2-compat-dev
安装QEMU
apt-get --no-install-recommends install qemu-system-x86

Void

安装编译工具
xbps-install -S make gcc
安装编译kvmtool所需依赖
xbps-install -S SDL-devel
安装QEMU
xbps-install -S qemu-system-amd64