【自制操作系统】(二)HelloWorld

作者: VicX | 来源:发表于2016-04-18 10:52 被阅读899次

前期工作

在此之前,笔者已经大致掌握了如何创建一个能boot的Floppy Disk Image。笔者的启动镜像内的目录结构参考了James的bootloader的目录结构。

因为笔者用Mac开发,所以对应的update_image.sh修改为如下(接受一个参数作为编译后的kernel地址):

#!/bin/bash

hdiutil attach -mountpoint boot_folder boot.img
cp $1 boot_folder/
hdiutil detach boot_folder

探索过程及最后解决方案

  1. 【失败】以James的Genesis教程为例做为出发点

问题:编译失败。

main.c:4:17: warning: declaration of 'struct multiboot' will not be visible outside of this function [-Wvisibility]
int main(struct multiboot *mboot_ptr)
                ^
main.c:4:5: error: first parameter of 'main' (argument count) must be of type 'int'
int main(struct multiboot *mboot_ptr)
    ^
1 warning and 1 error generated.
make: *** [main.o] Error 1

在寻找解决方案的过程中,慢慢发现osdev.org的强大之处:其教程比较贴近目前的软硬件水平,能找到很多问题的解决方案。其中有一篇资料详细地解释了James教程的问题。

具体教程:James Molloy's Tutorial Known Bugs

  1. 【成功】Bare Bones

和教程不同的是,笔者仍然使用floppy disk image作为启动镜像

源码笔记

Bare Bones教程中的注释十分详细,建议读者仔细阅读。

笔者此部分的练习代码将以Bare Bones教程为基础,进行简单的定制。下文是代码的简要总结:

最重要的说明
grub在加载完我们的内核后进入文本模式(text mode),当然你也可以设置其它模式(参考文档)。

文本模式下,我们只需要简单地将需要显示的字符串(只支持ascii)写入0xB8000作为起始地址的一段缓冲区中。缓冲区大小为(85列x20行),而缓冲区中的每个单位是一个用16bit表示的带有颜色配置的字符。其中高8位为需要显示的字符,低8位中的高4位为前景色、低4位为背景色。值得一提的是,我们需要自己实现控制字符(如\t,\n等)对应的逻辑。

源码地址(目前是一个private的git repository,计划完成所有练习后再made public。)

boot.s

目的:完成C内核所不能完成的操作,包括但不限于对文件格式的操作。具体的指令可在此文档中查找相应说明。

为什么boot.s中操作这么少?
boot.s并没有担当bootloader的角色。bootloader的任务由grub完成。

kernel.c

只是简单地在屏幕打印一句“Hello\tWorld\n”。

util.c

目前只要一个strlen()函数。

vga.c

屏幕显示相关的功能。主要增加了scroll()、clear()两个函数,以及对特殊的控制符的支持(制表符和换行符等)。

link.ld

linker脚本

Makefile

运行截图

相关文章

网友评论

  • bruce_zhou:之前学校也看着书,写过一个操作系统
    null122:@VicX 哈哈现在都扯得太远了,都扯不到点子上,旧瓶子装新酒,半瓶子乱咣当
    VicX:@bruce_zhou 我们学校,现在本科生的操作系统都是选修,真是堪忧啊。
  • 清凌一夜:厉害
    VicX:@Mr小小时 并没有啦,我只是在摸索。同时将摸索的过程分享出来,希望路过的大牛能多多指点。
  • VicX:工作日又到了,又要给实验室干活。周末接着研究 :persevere:

本文标题:【自制操作系统】(二)HelloWorld

本文链接:https://www.haomeiwen.com/subject/wwqalttx.html