在这里运行环境我就不多说了,我自己是在bochs上面试调的,(文章主要用来记录学习过程,不提供源码,许多源码网上都有)
在这里我笔记一个定义 : GRUB的全称是GRand Unified Bootloader,是一个多重操作系统启动管理器,用来 引导不同的操作系统。
1.裸机上去运行一句hello kernel 需要的最简单文件
boot 文件夹下是一个boot.s文件 代码从这里开始,里面包含了start函数,告诉了ld连接器这个文件里面包含了入口函数
include 文件夹下是一个types.h文件 这里面试头文件和一些类型的重定义
init 文件夹下是一个entry.c文件 这里个文件时C语言实现的内核入口函数
scripts文件夹下是一个kernel.ld 文件 这个文件是项目初步采用的连接器脚本定义,这个感觉是在make过程中用到了,就是说告诉ld程序如何构造我们所需要的内 核镜像文件,通过查资料它对连接器是这么解释的:
试调结果为
自己感觉这里试通过start函数找到了init中的内核入口函数,显示的hello kernel, 而且types.h 文件在entry.c的头文件中
2.控制屏幕输出内容
首先我们要知道显卡(显示内容存储和显示控制单元)和显示器,再就是字符的编码的种类,字符编码的种类有3种:输入码, 内码,字模码。
字模码 :定义一个字符在屏幕上显示的坐标位置
内码 : 定义字符在内存中的存储形式,大家都知道的ASCII码就是 输入码:顾名思义
这部分比上面多了4个文件 ,
分别是drivers文件夹下的console.c libs下的common.c 和 include下的common.h和console.h
common.c :文件是用来定义几个端口读写函数的以用来方便读写某个端口
console.c :文件是定义显卡存储的起始位置和当前输出的屏幕位置的变量定义,我自己理解为分屏幕的函数把屏幕用坐标分成80*25个格子,每个格子有两部分组成(2个字节每个字节8位,前8位是存储内容,后8位的前4位是背景色后四位前景色)。
common.h和console.h都是函数声明的一些头文件
试调结果为