一、背景
本系列笔记是基于彭东大神的课程操作系统45讲。 入门第一课自己手动做一个最简单的内核,就像任何编程语言一样的第一课,先写一个helloWorld程序,这次我们写一个HelloOS系统(一个最简单的操作系统,没有任何功能,只有输出一句话HelloOS)。
二、环境搭建
思考一下,当我们开启PC机时是不是有一个引导程序,所以这次的实验我们要借助GRUB引导程序(Centos7已经帮我们装好了)。我们需要准备好HelloOS需要的文件,然后配置好相关的信息,让GRUB引导我们安装程序。 我的环境配置:
VMware+Centos7的虚拟机 CentOS Linux release 7.8.2003 (Core) nasm环境
三、动手实践
现在我直接用彭东大神写好的代码,进行实际操作,具体过程如下: 1.首先注册一个gitee账号(可以用github账号授权登录) 2.在centos7系统中,找一个合适的位置,创建一个文件夹OSTest(自己随意命名),用这个文件夹作为本地仓库,然后 git init初始化仓库,接着git clone 远程仓库的地址。 彭东大神的gitee仓库地址:操作系统45讲 3.现在已经拷贝好了远程仓库,可以看到OTest文件夹下有cosmos文件夹。这是操作系统45讲课程相关全部代码,我们为找到lesson2文件夹,打开里面有HelloOS文件夹。 4.现在我们来分析一下HelloOS文件夹下的各个文件: 我们来回忆一下程序生成的过程: Linux下具体操作:
源文件生成预处理文件: gcc -E HelloWorld.c -o HelloWorld.i 预处理文件生成汇编文件: gcc -S HelloWorld.i -o HelloWorld.s 汇编文件生成二进制目标文件: gcc -c HelloWorld.s -o HelloWorld.o 二进制目标文件链接生成可执行文件:gcc HelloWorld.o -o HelloWorld 源文件直接生成可执行文件:gcc HelloWorld.c -o HelloWorld Linux系统运行可执行文件:./HelloWorld
现在回来看我们要自己实现一个操作系统内核应该怎么做:
由于C语言是高级语言不能直接处理计算机硬件,所以我们需要用汇编语言先搭建好C语言的工作环境(C语言后函数调用操作,需要入栈、出栈)。所以entry.asm文件就是负责搭建C语言的工作环境的。汇编程序写好后需要一个链接器脚本hello.lds来生成可执行elf文件。现在C语言可以使用了,我们用C语言输出语句HelloOS,只不过此时我们需要自己写一个程序来规定printf的输出格式(通过操作显卡)。现在所有的准备都已经做好了,我们编译整个HelloOS工程(在HelloOS文件夹下输入指令:make -f Makefile)
5.熟悉了HelloOS的各个文件作用之后,现在开始构建Hello OS工程,由于整个工程里面有汇编程序,也有C语言程序。 所以先安装nasm,(GCC系统默认安装过了)
yum install build-essential nasm
①HelloOS构建成功后会生产HelloOS.bin文件,现在切换为root用户权限(su -),然后把HelloOS.bin文件复制到/boot/路径下
cp -r HelloOS.bin /boot/
②现在要把HelloOS添加到GRUB的启动设置中,打开install.md文件。注意此时boot目录挂载的分区是你自己机器上的分区。
menuentry 'HelloOS' {
insmod part_msdos #GRUB加载分区模块识别分区
insmod ext2 #GRUB加载ext文件系统模块识别ext文件系统
set root='hd0,msdos1' #注意boot目录挂载的分区,这是我机器上的情况
multiboot2 /HelloOS.bin #GRUB以multiboot2协议加载HelloOS.bin
boot #GRUB启动HelloOS.bin
查看boot分区:df /boot/ 在/etc/grub.d/40_custom文件中,添加HelloOS在grub2中的配置,即把menutry这块代码插入到/etc/grub.d/40_custom文件尾。(或者直接将配置信息复制插入到 /boot/grub2/grub.cfg 文件)
③重新生成 /boot/grub2/grub.cfg 文件,切换到grub目录下执行以下语句
[root@zsh grub2]# grub2-mkconfig -o /boot/grub2/grub.cfg
6.万事俱全,重启VM虚拟机,此时我们看到启动项多了HelloOS,如下。 然后进入HelloOS系统之后就是,一行语句Hello OS!(现在还没有其他功能)
|