From 1e77addeb63aff55a50468f1400ca956e09d16b2 Mon Sep 17 00:00:00 2001 From: Gshine <1847722163@qq.com> Date: Sun, 10 Nov 2024 19:08:24 +0800 Subject: [PATCH 1/2] =?UTF-8?q?update=202024=E5=B9=B411=E6=9C=8810?= =?UTF-8?q?=E6=97=A5=2019:08:24?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/jsconfig.json | 2 +- content/posts/sysnet/tp5a0.md | 54 +++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 content/posts/sysnet/tp5a0.md diff --git a/assets/jsconfig.json b/assets/jsconfig.json index 3aada663..9f5e8bd5 100644 --- a/assets/jsconfig.json +++ b/assets/jsconfig.json @@ -3,7 +3,7 @@ "baseUrl": ".", "paths": { "*": [ - "../themes/FixIt/assets/*" + "..\\themes\\FixIt\\assets\\*" ] } } diff --git a/content/posts/sysnet/tp5a0.md b/content/posts/sysnet/tp5a0.md new file mode 100644 index 00000000..edc43fbb --- /dev/null +++ b/content/posts/sysnet/tp5a0.md @@ -0,0 +1,54 @@ +--- +title: "TP5A0: An Experimental Macrokernel" +subtitle: +date: 2024-11-10T18:58:28+08:00 +slug: 5441bf2 +draft: true +# author: +# name: +# link: +# email: +# avatar: +description: +keywords: +license: +comment: false +weight: 0 +tags: + - draft +categories: + - draft +hiddenFromHomePage: false +hiddenFromSearch: false +hiddenFromRelated: false +hiddenFromFeed: false +summary: +resources: + - name: featured-image + src: featured-image.jpg + - name: featured-image-preview + src: featured-image-preview.jpg +toc: true +math: true +lightgallery: true +password: +message: +repost: + enable: true + url: + +# See details front matter: https://fixit.lruihao.cn/documentation/content-management/introduction/#front-matter +--- + + + +## 前言 + +以 + +## References + +- 豆瓣: [操作系统真象还原](https://book.douban.com/subject/26745156/) +- 吾爱破解: \[系统底层\] [从 0 到 -1 写一个操作系统](https://www.52pojie.cn/thread-1748588-1-1.html) +- 稀风: [如何从零实现一个操作系统 KOS](https://gitee.com/thin-wind/KOS) +- 看见南山: [用《操作系统真象还原》写一个操作系统](https://space.bilibili.com/8393171/channel/collectiondetail?sid=1394920) From ebfe7c6a20604b9fe02c0e2a18743a836e501766 Mon Sep 17 00:00:00 2001 From: Gshine <1847722163@qq.com> Date: Sat, 7 Dec 2024 20:31:54 +0800 Subject: [PATCH 2/2] =?UTF-8?q?update=202024=E5=B9=B412=E6=9C=88=207?= =?UTF-8?q?=E6=97=A5=2020:31:54?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/posts/sysnet/tp5a0.md | 54 ---------------- content/posts/sysprog/CSAPP-ch2.md | 7 +- content/posts/sysprog/tp5a0.md | 95 ++++++++++++++++++++++++++++ static/images/tp5/x86-io.drawio.png | Bin 0 -> 25133 bytes 4 files changed, 101 insertions(+), 55 deletions(-) delete mode 100644 content/posts/sysnet/tp5a0.md create mode 100644 content/posts/sysprog/tp5a0.md create mode 100644 static/images/tp5/x86-io.drawio.png diff --git a/content/posts/sysnet/tp5a0.md b/content/posts/sysnet/tp5a0.md deleted file mode 100644 index edc43fbb..00000000 --- a/content/posts/sysnet/tp5a0.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: "TP5A0: An Experimental Macrokernel" -subtitle: -date: 2024-11-10T18:58:28+08:00 -slug: 5441bf2 -draft: true -# author: -# name: -# link: -# email: -# avatar: -description: -keywords: -license: -comment: false -weight: 0 -tags: - - draft -categories: - - draft -hiddenFromHomePage: false -hiddenFromSearch: false -hiddenFromRelated: false -hiddenFromFeed: false -summary: -resources: - - name: featured-image - src: featured-image.jpg - - name: featured-image-preview - src: featured-image-preview.jpg -toc: true -math: true -lightgallery: true -password: -message: -repost: - enable: true - url: - -# See details front matter: https://fixit.lruihao.cn/documentation/content-management/introduction/#front-matter ---- - - - -## 前言 - -以 - -## References - -- 豆瓣: [操作系统真象还原](https://book.douban.com/subject/26745156/) -- 吾爱破解: \[系统底层\] [从 0 到 -1 写一个操作系统](https://www.52pojie.cn/thread-1748588-1-1.html) -- 稀风: [如何从零实现一个操作系统 KOS](https://gitee.com/thin-wind/KOS) -- 看见南山: [用《操作系统真象还原》写一个操作系统](https://space.bilibili.com/8393171/channel/collectiondetail?sid=1394920) diff --git a/content/posts/sysprog/CSAPP-ch2.md b/content/posts/sysprog/CSAPP-ch2.md index e0b77e54..1bf4524d 100644 --- a/content/posts/sysprog/CSAPP-ch2.md +++ b/content/posts/sysprog/CSAPP-ch2.md @@ -44,7 +44,6 @@ repost: -- {{< link href="https://hackmd.io/@sysprog/CSAPP-ch2" content="原文地址" external-icon=true >}} 搭配 CMU: 15-213: Intro to Computer Systems: Schedule for Fall 2015 - 可以在 [这里](https://www.cs.cmu.edu/afs/cs/academic/class/15213-f15/www/schedule.html) 找到相关的投影片和录影 @@ -227,3 +226,9 @@ Denormalized 的作用一是表示 0,二是配合 Normalized 在靠近 0 的 > 50% of the time. Round-to-even 可以让 round 后的数据在统计上的均值与原先数据的均值误差比较小 + +## References + +- HackMD: {{< link href="https://hackmd.io/@sysprog/CSAPP-ch2" content=".GUST 的文字导读" external-icon=true >}} +- bilibili: {{< link href="https://space.bilibili.com/4564101" content="yaaangmin 的讲解视频" external-icon=true >}} / {{< link href="/yangminz/bcst_csapp" content="相关资源" external-icon=true >}} +- bilibili: {{< link href="https://space.bilibili.com/4564101" content="Dr.Dng 陪跑 CSAPP: bigONE《深入理解计算机系统》" external-icon=true >}} diff --git a/content/posts/sysprog/tp5a0.md b/content/posts/sysprog/tp5a0.md new file mode 100644 index 00000000..d7e55510 --- /dev/null +++ b/content/posts/sysprog/tp5a0.md @@ -0,0 +1,95 @@ +--- +title: "TP5A0: An Experimental 32-Bit Macrokernel" +subtitle: +date: 2024-11-10T18:58:28+08:00 +slug: 5441bf2 +# draft: true +# author: +# name: +# link: +# email: +# avatar: +description: +keywords: +license: +comment: false +weight: 0 +tags: + - draft +categories: + - draft +hiddenFromHomePage: false +hiddenFromSearch: false +hiddenFromRelated: false +hiddenFromFeed: false +summary: +resources: + - name: featured-image + src: featured-image.jpg + - name: featured-image-preview + src: featured-image-preview.jpg +toc: true +math: true +lightgallery: true +password: +message: +repost: + enable: true + url: + +# See details front matter: https://fixit.lruihao.cn/documentation/content-management/introduction/#front-matter +--- + + + +## 前言 + +以吾爱破解论坛的系列博文「[从 0 到 -1 写一个操作系统](https://www.52pojie.cn/thread-1748588-1-1.html)」为主干,配合书籍《操作系统真象还原》来从零开始实现一个基于 x86 架构的 32 位操作系统。该系列博文可以视为书籍的提纲,省略了书籍中为趣味性而增加的形象表达和无关的背景故事,使得如何实现操作系统相关的表述更为精简干练,但是由于论坛的图床原因,博文有些图片已失效,需要搭配书籍来查看相应图片;另外博文中所贴代码可能在上传时被分割了,并不符合指定格式,需要搭配博文作者的源代码和书籍所提供的代码片段来验证,确保代码准确无误。 + +此外,原书和博文对于开发环境配置、模拟器 Bochs 的运用、x86 汇编并未做过多的介绍说明,这些内容可以参考 References 的相关资源进行针对性的学习,这里比较推荐稀风大神的 [KOS](https://gitee.com/thin-wind/KOS) 项目,里面资料非常详尽,有些原书未列入的问题这里面也有相应的解决方案。 + +### 开发环境 + +{{< admonition info >}} +- WSL2 Ubuntu 22.04 +- Bochs 2.8 +- NASM 2.15.05 +- GNU Make 4.3 +- VS Code + - ASM Code Lens + - clangd + - Clang-Format + - WSL +{{< /admonition >}} + +```bash +OS: Ubuntu 22.04.5 LTS on Windows 10 x86_64 +Kernel: 5.15.153.1-microsoft-standard-WSL2 +Uptime: 3 mins +Packages: 924 (dpkg), 6 (snap) +Shell: bash 5.1.16 +Theme: Adwaita [GTK3] +Icons: Adwaita [GTK3] +Terminal: Windows Terminal +CPU: Intel i7-1065G7 (8) @ 1.497GHz +GPU: b523:00:00.0 Microsoft Corporation Device 008e +Memory: 665MiB / 7840MiB +``` + +## Bootloader + +两种 IO 接口访问方式的区别可以形象理解为:采用统一编址方式的外设需要连接在 **内存地址解码单元** 之后,这样才可以使用统一的地址来访问外设;而采用独立编址方式的外设则直接与 CPU 通过 **端口** 进行连接,CPU 通过特殊的指令访问这些外设的 IO 接口 (即通过端口实现与驱动互联),而无需通过统一的内存地址进行访问 (但是只能使用 dx 和 ax 这两个寄存器)。 + +{{< image src="/images/tp5/x86-io.drawio.png" >}} + +## Protected Mode + +保护模式杂糅了很多历史兼容,在架构上很复杂,不需要研究太深,知道启用保护模式的大致流程即可。 + +## References + +- 吾爱破解: \[系统底层\] [从 0 到 -1 写一个操作系统](https://www.52pojie.cn/thread-1748588-1-1.html) +- 稀风: [如何从零实现一个操作系统 KOS](https://gitee.com/thin-wind/KOS) +- 看见南山: [用《操作系统真象还原》写一个操作系统](https://space.bilibili.com/8393171/channel/collectiondetail?sid=1394920) +- 豆瓣: [操作系统真象还原](https://book.douban.com/subject/26745156/) +- 豆瓣: [x86 汇编语言:从实模式到保护模式](https://book.douban.com/subject/20492528/) diff --git a/static/images/tp5/x86-io.drawio.png b/static/images/tp5/x86-io.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..96a7a10d63d763207831b680f393e18145bcbf88 GIT binary patch literal 25133 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