按照惯例,Xos 的第一步是在屏幕上打印 Hello world!第一步是神奇的一步,如果读者对 PC 不了解,将很难得到头绪。

PC 开机后,CS 和 IP 被初始化为 CS=0xFFFFh,IP=0x0000h,CPU 将从 0xFFFF0h 处读取第一条指令。这个地址正好位于主板上的一段 ROM 即 BIOS 中。BIOS 中的启动程序末尾会将硬盘 MBR 扇区加载到内存 0x7C00h ,并从此处执行。这时候 CPU 处于实模式,使用INT中断可调用 BIOS 程序在屏幕上打印字符。于渊的《自己动手写操作系统》中有详细描述。

但 Xos 不会从硬盘 MBR 加载到内存中,她将通过 grub2 引导。这样做的好处是不需要改动硬盘 MBR ,也不需要用汇编写大量代码,引导程序将完成实模式到保护模式的切换。

内核让 grub2 可引导的条件是符合 Multiboot 规范,在前 8192 字节内需要提供一个 Multiboot header 。grub2 将根据 flags 位初始化内核环境并从内核入口调用内核。

下面是Xos引导测试代码:

 1 typedef struct strMultiBootHeader{
 2     unsigned long    magic;
 3     unsigned long    flags;
 4     unsigned long    checksum;
 5 }MultiBootHeader;
 6
 7 void mbprint(char* str);
 8
 9 unsigned long    magic;
10
11 MultiBootHeader mbh __attribute__((section(".text"))) ={
12     .magic        = 0X1BADB002,
13     .flags        = 0X00000003,
14     .checksum   = -(0X1BADB002 + 0X00000003),
15 };
16
17 void KernelEntry(void)
18 {
19     __asm__("movl %%eax,%0":"=m"(magic));
20
21     if( magic != 0X2BADB002 )
22     {
23         mbprint("Kernel load errer!\n");
24         return;
25     }
26     mbprint("Hello world!\n");
27     while(1)
28         ;
29     return;
30 }
31
32 void mbprint(char* str)
33 {
34     char *pvideo = (char *)0xB8000;
35     while( *str != '\n' )
36     {
37         *pvideo++ = *str++;
38         *pvideo++ = 0x04;
39     }
40
41     return;
42 }

用下面的命令生成内核:

1 gcc multiboot.c -c -fno-builtin
2 ld multiboot.o -o Xos -Ttext 0x10000 --entry=KernelEntry

在 grub2 配置文件 /boot/grub/grub.cfg 里添加启动项:

1 menuentry 'Xos0.01'{
2     insmod part_msdos
3     insmod ext2
4     set root='hd0,msdos1'
5     multiboot /boot/Xos
6 }

Hello world!让 grub2 引导自己的操作系统 Xos 内核的更多相关文章

  1. 【教程】在UEFI启动方式下,通过GRUB2引导,直接从硬盘ISO文件安装Windows10和Ubuntu双系统

    本文为作者原创,允许转载,但必须注明原文地址: https://www.cnblogs.com/byronxie/p/9949789.html 动机 最近在自学MIT6.828 Operating S ...

  2. [FW]修复ubutnu12.04+win7的grub2引导

    [转]修复ubutnu12.04+win7的grub2引导 原文位置:http://wenku.baidu.com/view/b6b7c9926bec0975f465e2f8.html ps:我使用的 ...

  3. Linux内核升级、GRUB2引导故障处理与密码破解

    目录 内核升级 GRUB2内核启动设置 GRUB2引导菜单加密 GRUB2引导故障及修复 救援模式管理 Rhel7破解root密码 内核升级 查看当前内核版本: uname  -r 查看可升级内核:  ...

  4. U盘+GRUB2引导PE或linux镜像

    利用U盘制作启动盘,引导WinPE.Linux安装的文章多如牛毛,与他们相比本文的特点有: 1.用且仅用grbu2做引导.不使用grub4dos,不是使用msdos mbr转到活动分区,到ntldr, ...

  5. grub2引导各种ISO系统镜像

    1 grub2引导winpe 1下载winpe.iso镜像,放置在U盘的根目录下 2下载syslinux的memdisk,放置在U盘的根目录下 3 set root=(hd0,msdos1)  设置U ...

  6. 为云而生,腾讯云服务器操作系统TencentOS内核正式开源

    ​1月9日,腾讯云宣布将开源其服务器操作系统TencentOS内核.相比业内其它版本Linux 内核,腾讯云 TencentOS 内核在资源调度弹性.容器支持.系统性能及安全等层面极具竞争力,特别适合 ...

  7. 修复Debian(Ubuntu)Grub2 引导

    重装win7, 之前的系统debian 的引导就没有了. 而debian 的盘似乎没有ubuntu的livecd模式,于是用ultraISO将ubuntu的ios文件写入到u盘中. boot时选择启动 ...

  8. centos7备份还原与grub2引导和rescue模式修改root密码

    一.centos7备份1.su -2.cd /3.tar -zpPcvf backup.tgz --exclude=/sys --exclude=/mnt --exclude=/proc --excl ...

  9. CentOS7.2 设置GRUB2引导界面分辨率

    最近在学习OS引导启动,GRUB2的学习材料也不少,主要还看官方手册清晰些. 公司里办公机的多启动用的ubuntu的界面,还挺炫酷的.之前看其他博客网文里看到可以设置grub2的分辨率,我拿CentO ...

随机推荐

  1. java工程师分享:我是如何自学成才的?

    原文:http://www.java800.com/peixun-79062115.html 我是10年河南工业大学的毕业生,当时我们专业许多学生都去报了java培训机构,去达内的都不少.我也想去培训 ...

  2. [备忘]Visio中连接线交叉时跨线小弯的去掉方法

    连接线格式->行为->连接线->跨线->添加->从不 format->behavior…->Connector->Line jumps->Add: ...

  3. 访问修饰符internal

    internal(C# 参考) internal 关键字是类型和类型的成员 访问修饰符. 只有在同一程序集的文件中,内部类型或成员才是可访问的,如下例所示: public class BaseClas ...

  4. 黄聪:PHP json_encode中文乱码解决方法

    相信很多人在使用Ajax与后台php页面进行交互的时候都碰到过中文乱码的问题.JSON作为一种轻量级的数据交换格式,备受亲睐,但是用PHP作为后台交互,容易出现中文乱码的问题.JSON和js一样,对于 ...

  5. (C# 基础) Datatable

    增加一行: DataTable measurements = new DataTable(); measurements.Columns.Add("StationTestName" ...

  6. [jQuery]attr和prop的区别

    转自:http://www.cnblogs.com/Showshare/p/different-between-attr-and-prop.html 在高版本的jquery引入prop方法后,什么时候 ...

  7. Form_Form Builder本地部署运行的实现(案例)

    2014-08-09 Created By BaoXinjian

  8. Java爬虫搜索原理实现

    permike 原文 Java爬虫搜索原理实现 没事做,又研究了一下爬虫搜索,两三天时间总算是把原理闹的差不多了,基本实现了爬虫搜索的原理,本次实现还是俩程序,分别是按广度优先和深度优先完成的,广度优 ...

  9. Tesseract训练笔记

    [参考] http://www.cnblogs.com/samlin/p/Tesseract-OCR.html https://code.google.com/p/tesseract-ocr/wiki ...

  10. 【转】H264编码原理以及I帧B帧P帧

    前言 H264是新一代的编码标准,以高压缩高质量和支持多种网络的流媒体传输著称,在编码方面,我理解的他的理论依据是:参照一段时间内图像的统计结果表明,在相邻几幅图像画面中,一般有差别的像素只有10%以 ...