抄写Linux内核源码
文章平均质量分 67
shimly123456
这个作者很懒,什么都没留下…
展开
-
bochs 对 Linux0.11 进行调试 (TODO: 后面可以考虑集成 vscode+gdb+qemu)
TODO:here。原创 2023-10-05 18:34:59 · 1440 阅读 · 0 评论 -
理清 Linux0.11 启动流程
2.执行 BIOS,检查存储设备第一个512字节的内容,末尾有 0x55AA 的就是可启动设备。找到启动设备后把第一个扇区(512字节)加载到 0x7c00 内存地址处,随后 PC 跳转到 0x7c00。3.执行 0x7c00 的代码,也就是 MBR 的代码,首先把自身 512 字节的代码复制到 0x90000,随后跳转到 0x90000:go 继续执行代码。1.上电,CPU PC 指向 0xfff0。原创 2023-09-20 14:57:52 · 69 阅读 · 0 评论 -
抄写Linux源码(Day20:感觉得开始写代码了)
TODO: 感觉得开始写代码了,不然很多文章看了也白看。原创 2023-10-07 02:44:46 · 47 阅读 · 0 评论 -
抄写Linux源码(Day19:按下键盘后为什么屏幕上就会有输出)
OK,整个 console.c 就讲完了,要知道这个文件可是整个内核中代码量最大的文件,可是功能特别单一,也都很简单,主要是处理键盘各种不同的按键,需要写好多 switch case 等语句,十分麻烦,我们这里就完全没必要去展开了,就是个苦力活。相似的,我们还可以实现滚屏的效果,无非就是当检测到光标已经出现在最后一行最后一列了,那就把每一行的字符,都复制到它上一行,其实就是算好哪些内存地址上的值,拷贝到哪些内存地址,就好了。啥意思,就是你往上图的这些内存区域中写数据,相当于写在了显存中。原创 2023-10-07 02:43:17 · 164 阅读 · 0 评论 -
抄写Linux源码(Day18:读取硬盘前的准备工作有哪些?)
TODO: here。原创 2023-10-07 01:16:40 · 183 阅读 · 0 评论 -
抄写Linux源码(Day17:你的键盘是什么时候生效的?)
3.fork,execve, wait 这三个系统调用,也可以说是 进程调度 (否则无法 halt shell 程序并且启动另外的程序)5.内存管理 (shell 启动其它进程时,不能共用内存,而是切换其它进程的页表) — 完成内核内存管理。2.硬盘驱动、文件系统 (shell程序一开始是存放在磁盘里的,所以需要这两个东西)1.缺页中断(不理解为什么要这个东西,只是闪客说需要,后边再说)读完闪客文章 “你的键盘是什么时候生效的?读闪客文章 “你的键盘是什么时候生效的?7.应用程序申请内存的接口。原创 2023-10-06 15:22:42 · 352 阅读 · 0 评论 -
抄写Linux源码(Day16:内存管理)
TODO:here。原创 2023-10-06 12:44:36 · 83 阅读 · 0 评论 -
抄写Linux源码(Day15:进入 main 函数后)
现在已经进入 main 函数了,那么,进入 main 函数后我们要怎么实现上面提到的,还没完成的 6 个要求呢?3.fork,execve, wait 这三个系统调用,也可以说是 进程调度 (否则无法 halt shell 程序并且启动另外的程序)2.硬盘驱动、文件系统 (shell程序一开始是存放在磁盘里的,所以需要这两个东西)5.内存管理 (shell 启动其它进程时,不能共用内存,而是切换其它进程的页表)1.缺页中断(不理解为什么要这个东西,只是闪客说需要,后边再说)7.应用程序申请内存的接口。原创 2023-10-06 03:35:48 · 67 阅读 · 0 评论 -
抄写Linux源码(Day14:从 MBR 到 C main 函数 (3:研究 head.s) )
3.fork,execve, wait 这三个系统调用,也可以说是 进程调度 (否则无法 halt shell 程序并且启动另外的程序)而要先进行 head.s?6.为了写代码方便,我们需要从 MBR 进入到 main 函数,这也是从 汇编 切换到 C 语言。2.硬盘驱动、文件系统 (shell程序一开始是存放在磁盘里的,所以需要这两个东西)5.内存管理 (shell 启动其它进程时,不能共用内存,而是切换其它进程的页表)1.缺页中断(不理解为什么要这个东西,只是闪客说需要,后边再说)原创 2023-10-06 00:12:45 · 297 阅读 · 0 评论 -
抄写Linux源码(Day13:从 MBR 到 C main 函数 (2:研究 setup.s) )
TODO:here。原创 2023-10-04 13:33:12 · 80 阅读 · 0 评论 -
抄写Linux源码(Day12:从 MBR 到 C main 函数 (1:研究 bootsect.s) )
显然,这样复杂的功能用汇编写会很花时间,所以我们得想办法从汇编转为 C 代码,随后进入一个 C main 函数。经历了 Day11,看到了 Linux 0.11 中的内存管理代码后。原创 2023-09-21 21:53:41 · 164 阅读 · 0 评论 -
抄写Linux源码(Day11:设置内存管理机制)
TODO: whatver原创 2023-09-20 17:20:13 · 97 阅读 · 0 评论 -
抄写Linux源码(Day10:在 qemu_x86_64 上打印字符串)
3.fork,execve, wait 这三个系统调用,也可以说是 进程调度 (否则无法 halt shell 程序并且启动另外的程序)4.键盘驱动、VGA/console/uart 驱动、中断处理 (支持键盘输入和屏幕显示)2.硬盘驱动、文件系统 (shell程序一开始是存放在磁盘里的,所以需要这两个东西)1.缺页中断(不理解为什么要这个东西,只是闪客说需要,后边再说)所以,我们第一个目标是在内核层上打印 Hello World。这些东西毫无疑问都需要在内核层上开发。原创 2023-09-20 14:31:01 · 76 阅读 · 0 评论 -
抄写Linux源码(Day9:读闪客文章第37回 “shell 程序跑起来了”)
原文链接:https://mp.weixin.qq.com/s?之所以跳过来先读 37 回,是因为遵循传统路径 “从 Linux0.11 启动一直读到 Shell 启动” 可能会造成我们难以理解 shell 和 Linux0.11 其他模块的关系 (为什么启动 shell 之前要做这么多准备?因此,我决定先读 37 回,把 shell 这个程序看明白,写明白,随后再以 “把 shell 运行在 qemu-system-x86_64 上面” 为目标,去构建整个 Linux0.11。原创 2023-08-02 22:47:07 · 146 阅读 · 0 评论 -
抄写Linux源码(Day8:Linux0.11 调试方法)
根据 gdb 显示的调试信息来看,bochs 所运行的内核在编译阶段并没有添加调试信息,我们只能看到内存地址,但是我们可以在 ~/oslab/linux-0.11/System.map(这是个文本文件) 这里看到内存地址和符号的对应关系,从而帮助我们定位到相应的 C 文件、C 函数。此时除了直接运行 run 来运行 Linux0.11 之外,还可以配合使用 dbg-c 和 rungdb,使用 gdb 连接 bochs,来调试 Linux0.11。来连接 gdb 和 bochs。原创 2023-08-02 23:07:18 · 251 阅读 · 0 评论 -
抄写Linux源码(Day7:读闪客文章第二回 “自己给自己挪个地儿”)
bootsect.s 中,_start 到 go 之间这段代码的作用是:把 bootsect.S 这 512 字节的数据从内存 0x7c00 拷贝到 0x90000 处,随后跳转到 0x90000:go 继续执行代码。上面是直译,那把这段话翻译成更人话的方式讲出来就是,将内存地址 0x7c00 处开始往后的 512 字节的数据,原封不动复制到 0x90000 处。今天到此为止,不得不说,闪客的文章写得真好,又简单又易读,语言还幽默风趣。jmpi 是一个段间跳转指令,表示跳转到 0x9000:go 处执行。原创 2023-08-02 22:22:51 · 169 阅读 · 0 评论 -
抄写Linux源码(Day6:读闪客文章第一回 “最开始的两行代码”)
啊啊啊。原创 2023-08-02 21:07:16 · 317 阅读 · 0 评论 -
抄写Linux源码(Day5:能够打印字符串的 MBR)
闪客 Linux0.11 解读:https://github.com/dibingfa/flash-linux0.11-talk。完成闪客文章1的阅读。原创 2023-07-31 20:17:20 · 98 阅读 · 0 评论 -
抄写Linux源码(Day3:启动南大OS)
我们可以尝试启动南大OS,接着阅读南大OS源码,看看 JYY/YZH 构建主引导扇区的手段。原创 2023-08-01 23:27:29 · 453 阅读 · 0 评论 -
抄写Linux源码(Day2:构建调试环境)
接着在另一个窗口运行 gdb,输入命令 target remote localhost:1234,即可连接qemu并调试运行在 qemu 上的程序。可以看到在最初始的时候,PC寄存器指向 0xfff0,这也是 Intel CPU 规定的 CPU 上电后的初始地址。经过 RTFM,可以使用 qemu-system-x86_64 -s -S 让 qemu 在启动之后停住。我们计划把操作系统运行在 qemu-system-x86_64 上,使用 gdb 调试。原创 2023-08-01 23:05:00 · 167 阅读 · 0 评论 -
抄写Linux源码(Day1:获取并运行 Linux0.11)
这是我参考的一个别人写的 Linux0.11 解读:https://github.com/dibingfa/flash-linux0.11-talk。我获取 Linux-0.11 源码的链接:https://github.com/Wangzhike/HIT-Linux-0.11.git。在 ubuntu 20.04 下,从参考资料 “安装 Linux 0.11” 那里开始往下看,即可成功运行 Linux 0.11。参考资料:https://zhuanlan.zhihu.com/p/438577225。原创 2023-07-31 20:00:45 · 475 阅读 · 0 评论