Hello world!让 grub2 引导自己的操作系统 Xos 内核
按照惯例,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 内核的更多相关文章
- 【教程】在UEFI启动方式下,通过GRUB2引导,直接从硬盘ISO文件安装Windows10和Ubuntu双系统
本文为作者原创,允许转载,但必须注明原文地址: https://www.cnblogs.com/byronxie/p/9949789.html 动机 最近在自学MIT6.828 Operating S ...
- [FW]修复ubutnu12.04+win7的grub2引导
[转]修复ubutnu12.04+win7的grub2引导 原文位置:http://wenku.baidu.com/view/b6b7c9926bec0975f465e2f8.html ps:我使用的 ...
- Linux内核升级、GRUB2引导故障处理与密码破解
目录 内核升级 GRUB2内核启动设置 GRUB2引导菜单加密 GRUB2引导故障及修复 救援模式管理 Rhel7破解root密码 内核升级 查看当前内核版本: uname -r 查看可升级内核: ...
- U盘+GRUB2引导PE或linux镜像
利用U盘制作启动盘,引导WinPE.Linux安装的文章多如牛毛,与他们相比本文的特点有: 1.用且仅用grbu2做引导.不使用grub4dos,不是使用msdos mbr转到活动分区,到ntldr, ...
- grub2引导各种ISO系统镜像
1 grub2引导winpe 1下载winpe.iso镜像,放置在U盘的根目录下 2下载syslinux的memdisk,放置在U盘的根目录下 3 set root=(hd0,msdos1) 设置U ...
- 为云而生,腾讯云服务器操作系统TencentOS内核正式开源
1月9日,腾讯云宣布将开源其服务器操作系统TencentOS内核.相比业内其它版本Linux 内核,腾讯云 TencentOS 内核在资源调度弹性.容器支持.系统性能及安全等层面极具竞争力,特别适合 ...
- 修复Debian(Ubuntu)Grub2 引导
重装win7, 之前的系统debian 的引导就没有了. 而debian 的盘似乎没有ubuntu的livecd模式,于是用ultraISO将ubuntu的ios文件写入到u盘中. boot时选择启动 ...
- centos7备份还原与grub2引导和rescue模式修改root密码
一.centos7备份1.su -2.cd /3.tar -zpPcvf backup.tgz --exclude=/sys --exclude=/mnt --exclude=/proc --excl ...
- CentOS7.2 设置GRUB2引导界面分辨率
最近在学习OS引导启动,GRUB2的学习材料也不少,主要还看官方手册清晰些. 公司里办公机的多启动用的ubuntu的界面,还挺炫酷的.之前看其他博客网文里看到可以设置grub2的分辨率,我拿CentO ...
随机推荐
- Bower => 前端开发也有包管理器
摘要: 一直以来npm,pip等各种包管理器好像都和前端开发没什么太大关系,当然因为nodejs的原因可能感觉npm会亲切一些,不过终归不是针对客户端的包管理工作,所以Bower的出现确实让人眼前一亮 ...
- 【转】如何使用PhoneGap打包Web App
如何使用PhoneGap打包Web App 最近做了一款小游戏,定位是移动端访问,思来想去最后选择了jQuery mobile最为框架,制作差不多以后,是否可以打包成App,恰好以前对PhoneGap ...
- 分页写入文件,第二次分页前一定要关闭IO流啊。。否则文件写不全。。- -粗心
- PLSQL_闪回删除FlashBack Drop表误删除如何进行恢复(案例)
2014-06-25 Created By BaoXinjian
- CF 501C Misha and Forest 好题
C. Misha and Forest Let's define a forest as a non-directed acyclic graph (also without loops and ...
- [物理学与PDEs]第3章习题参考解答
[物理学与PDEs]第3章习题1 只有一个非零分量的磁场 [物理学与PDEs]第3章习题2 仅受重力作用的定常不可压流理想流体沿沿流线的一个守恒量 [物理学与PDEs]第3章习题3电磁场的矢势在 Lo ...
- Eclipse中generate getter and setter对boolean的反应
有点意思 , 如果变量是boolean类型的 ,就会生成isxxx开头的getter方法 , 但如果是Boolean对象的 , 就会生成getterxx开头的getter对象. 例如 Boolean ...
- Ubuntu各个版本的介绍
Ubuntu的版本比较多,而且基于ubuntu的衍生版也很多,让人容易混淆,也让很多人不知道自己适合哪一个,在这里简单比较一下ubuntu的各个版本的特点: 介绍ubuntu版本之前先说一说与ubun ...
- jquery点击改变class并toggle;jquery点击改变图片src源码并toggle;jquery显示隐藏toggle
<html><head><meta charset="utf-8"><title></title><script ...
- python函数参数前面单星号(*)和双星号(**)的区别
在python的函数中经常能看到输入的参数前面有一个或者两个星号:例如 def foo(param1, *param2): def bar(param1, **param2): 这两种用法其实都是用来 ...