之前 gitee 图床挂了,然后 gitee 想用 pages 也必须用身份证,折腾一整最后放弃了 gitee,直接用 github 好了 (还是 github 靠谱),本想着研究一下 hugo,但是新东西费时间啊,就继续使用 hexo+next 了,算是升了个级,并且添加了 github CI,解决环境,部署问题,一个字,爽!

首先搭建 hexo 博客步骤还是和 Use hexo + github to build a blog | Sidney God 一样,按照步骤做就好了,注意这里不要去改 node_modules 源码了 (好像除了 markdown 和 mathjax 冲突,也没啥需要改的,kmarked 不适用新版本 hexo,别折腾了..),环境部署麻烦

Read more »

《64 位》比《32 位》多了一步 loader.bin 似乎,《32 位》的下一步直接就是导入 C 语言,开始搞系统了,《64 位》还得再来个 loader,接着干吧.. 这一节很重要,承上启下,甚至于内容也是

这次把书上的源码上传的 gitee 了: 00_一个 64 位操作系统的设计与实现/一个 64 位操作系统的设计与实现 - 源代码/第二部分 初级篇/第 3 章/程序/程序 3-4・Sidney/MakeOS - 码云 - 开源中国 (gitee.com)

书上说,Loader 的作用很大,大概包括:

  • 检测硬件信息

    主要是通过 BIOS 中断服务程序来获取和检测硬件信息。BIOS 上电自检的大部分信息只能在实模式下获取,内核运行在非实模式下,所以需要在进入内核前将信息检测出来,再作为参数提供给内核程序使用。比如获取 ROM,RAM,设备寄存器和内存空洞等资源的物理地址范围交给内存管理单元模块维护;通过 VBE 功能检测出显示器支持的分辨率,显示模式,刷新率以及显存物理地址以配置合理的显示模式

  • 处理器模式切换

    BIOS 运行的实模式到 32 位操作系统用的保护模式,再到 64 位操作系统用的 IA-32e 模式 (长模式)

  • 向内核传递数据

    向内核传递两种数据,控制信息:控制内核执行流程或限制内核某些功能;硬件数据信息:检测出来的硬件数据信息,保存在固定的内存地址中,并将数据其实内存地址和数据长度作为参数传递给内核。

Read more »

1 执行环境介绍

在 find loader 那一节之后,发现后面的代码真的看不懂了,直接抄也没有意义,于是补了一下相关的知识.. 希望能继续下去

1.1 CPU 工作模式

参考 Intel 手册卷 3 第 2.2 MODES OF OPERATION

32 位的支持三种工作模式和一种准工作模式

  • 实地址模式 (Real-address mode),处理器上电 (power-up) 或复位 (reset) 后处于该模式。这个模式实际上是为了兼容 8086,因为地址线只有 20 根,限制了寻址只能是 1M 大小,也就是通过段寄存器<<4+偏移地址\text {段寄存器} << 4 + \text {偏移地址}方式寻址。进入这个模式,也就只使用 20 根地址线,主要是因为 A20M# 引脚被屏蔽了

  • 保护模式 (Protected mode),这个是 80386 时期引入的,也就是 32 位处理器原本的工作模式。在这个模式下不再使用段寄存器<<4+偏移地址\text {段寄存器} << 4 + \text {偏移地址}的方式寻址,而是通过段描述符的方式描述基址和限长,并通过描述符中的属性设置实现对内存段的访问限制和数据保护。

  • 虚拟 8086 模式 (Virtual-8086 mode),是一种准工作模式,目的是为了在保护模式下能够执行 8086 程序

    Read more »

说是第三天,我看了该一个星期了.. 发现之前看得有点浮躁,最近看了费曼读书法有了新的想法,不怕慢,就怕没看明白,所以听费曼的,每次看卡壳了,就返回去重新看..

看到这里,突然觉得还是以《64 位》为主比较好,《32 位》太老了,用的还是 nask 转换起来有点累,并且《64 位》介绍得细啊,所以我悟了,《32 位》用来打辅助吧..

1 软盘与 FAT12

先来看软盘,一个 PC 里面可以有多个软盘,一个软盘里面包含 2 个磁头,80 个柱面,18 个扇区。因为软盘正反面都可以存储数据,所以有俩磁头去读取数据。柱面参考下图 (注意编号 0~79),英文是 cylinder;扇区参考下图 (注意编号 1~18),英文是 sector

Read more »

第二天的内容本该是,学习一些汇编指令和 Makefile,在这之前我觉得有必要好好看看 CPU 结构,自古操作系统和组成原理就分不开啊

面向总线的计算机组成示意图。中央处理器,从主存储器中逐条进行取指令,分析指令和执行指令。计算机各组件通过总线连在一起,总线是一些平行导线的集合,用来传递地址,数据和控制信号,可以在 CPU 之外连接 CPU,存储器及 IO 设备;也可以在 CPU 内部连接 CPU 的各个组成部分。

Read more »

这是 30 天的第一天内容,也不知道自己能坚持到几天,有几天就几天了,活这么久了,半途而废的事情还少吗?

首先需要准备几个工具

1 qemu

不可能真去买个软盘什么的,所以我们需要一个虚拟计算机的东西——QEMU

Read more »

学习嘛,当然要有浓厚的兴趣先,所以需要百度学习了一下,按下电源键之后的故事。操作系统这玩意虽说玄乎,但是参考资料还是很多的

参考书籍是《30 天自制操作系统》和《一个 64 位操作系统的设计与实现》,以 30 天为主,但是这玩意用的是 Windows 环境,这显然是不友好的,最终选择环境位 Ubuntu18,能换的都换换呗

Intel 手册:Intel® 64 and IA-32 Architectures Software Developer Manuals

Vol1:用来介绍 Intel x86 平台的基本架构和执行环境。

Vol2:介绍 x86 指令,学汇编的时候可以参考啊

Vol3:介绍 x86 系统编程的基础,包括内存管理、保护、任务管理、中断和异常处理、多处理器支持、散热和电源管理功能、调试、性能监控、系统管理模式、虚拟机扩展 (VMX) 指令、英特尔虚拟化技术 (Intel VT) 和英特尔软件防护扩展 (Intel SGX)。

Vol4:介绍 x86 CPU 上的 MSR,是 CPU 内部的一组特殊的寄存器(这个是从原来的 Vol3 中独立出来的)。

Read more »

手里就一台笔记本,可不想把系统换成 Linux 的,毕竟有很多操作还是很不方便,但是又想学习学习 Android 源码,所以,总得找点什么凑活着用的办法,于是我把目光放到了 Win10 上的 Linux 子系统上了,也就是 WSL,毕竟虚拟机太废内存划不来,亲测

CPU:AMD Ryzen 7 4800H with Radeon Graphics 2.90 GHz

RAM:16G

ROM:512G SSD + 2T HDD

GPU:GTX 1650

跑起来不说多么流畅,反正不卡,可能编译慢点,咱也不差那点时间,硬盘预留个 256G 的空间就够了。话不多说,记录一下这次操作的经历..

Read more »

这篇笔记主要是对 C/Cpp 一些知识的补充,这篇笔记过后就是抽象机制以及一些库函数的学习了

1 源文件与程序

一个 C 语言文件到可执行文件,中间经历了什么?预处理 (Preprocessing)、编译 (Compilation)、汇编 (Assemble)、链接 (Linking)。这是耳熟能详的几个过程,甚至还能敲出对应的 gcc 命令,那么实际上到底是啥情况呢?比如现在有个 C 程序

1
2
3
4
5
#include <stdio.h>
int main(void) {
printf("Hello World!\n");
return 0;
}

敲出 gcc 的命令:gcc main.c -o main.o -v

Read more »

1 初始化

对象的声明可以通过初始化的过程获得初始值。主要就是见识一下 C/Cpp 里面几种初始化的形式,免得大惊小怪

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// C语言的初始化还好,怎么着都得有个 =
int a[3] = {1, 2, 3};
int b = 0;
int c = {1}; // scalar initialization

typedef struct {int a[3], b;} MyType;
MyType mm = {{1}, 3};

char* ptr = malloc(10);

// Cpp多了一个花样
int a[3] {1, 2, 3};
int b {0};
typedef struct {int a[3], b;} MyType;
MyType mm {{1}, 3};
auto *m = new MyType;
auto *m1 {new MyType()};
Read more »