Linux Inside 是中文版,值得下载一读。

先把目标设低点,开机进入后,在屏幕上打印“Loading..."即可。由于要在 bochs 中运行,首先就是安装 bochs。Oldlinux 中有相关资源,可自行下载。winxp 和 linux 的配置脚本如下:

# for windows bochs config

megs : 

romimage: file=$BXSHARE/BIOS-bochs-latest
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest floppya: 1_44="a.img", status=inserted
floppyb: 1_44="b.img", status=inserted
ata0-master: type=disk, path="c.img", cylinders=, heads=, spt= boot: a mouse: enabled=

winxp

# for linux bochs config

display_library : sdl
megs : romimage : file=/usr/share/bochs/BIOS-bochs-latest
vgaromimage : file=/usr/share/vgabios/vgabios.bin floppya: 1_44="a.img", status=inserted
floppyb: 1_44="b.img", status=inserted
ata0-master: type=disk, path="c.img", cylinders=, heads=, spt= boot : a mouse : enabled=
keyboard_mapping : enabled=, map=/usr/share/bochs/keymaps/sdl-pc-us.map

linux

当然,这只是作为参考。如是 winxp,建议直接在 bochs-sls1.0 中编译,用 dd 写入 /dev/fd1, 即 b.img;如是 ubuntu,我使用 eclipse,贪图智能提示而已,本质并无区别。github 中的代码为 Ubuntu 系统。由于要求简单,代码自然也简单,分别为 makefile, boot/bootsect.s, tools/build.c 如下:

# makefile

AS86 = as86 - -a
LD86 = ld86 - AS = as
LD = ld
LDFLAGS = -s -x -M
CC = gcc
CFLAGS = -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -Iinclude
CPP = gcc -E -nostdinc -Iinclude ROOT_DEV = /dev/hd1 .c.s:
$(CC) $(CFLAGS) -S -o $*.s $<
.s.o:
$(AS) -c -o $*.o $<
.c.o:
$(CC) $(CFLAGS) -c -o $*.o $< Image: boot/bootsect tools/build
tools/build boot/bootsect > Image
sync boot/bootsect: boot/bootsect.s
$(AS86) -o boot/bootsect.o boot/bootsect.s
$(LD86) -o boot/bootsect boot/bootsect.o tools/build: tools/build.c
gcc -o tools/build tools/build.c

makefile

! boot/bootsect.s

.text

entry start
start:
mov ax, #0x07c0
mov ds, ax
mov es, ax
mov ss, ax
mov sp, #0xff00 mov cx, #
mov bx, #0x000c
mov bp, #msg
mov ax, #0x1301
int 0x10 die:
jmp die msg:
.byte ,,,
.ascii "Loading..."
.byte ,,, .org
.word 0xaa55

boot/bootsect.s

/*
* tools/build.c
*/ #include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <linux/fs.h>
#include <unistd.h>
#include <fcntl.h> #define MINIX_HEADER 32
#define GCC_HEADER 1024
#define SYS_SIZE 0x2000
#define DEFAULT_MAJOR_ROOT 3
#define DEFAULT_MINOR_ROOT 1
#define SETUP_SECTS 4 void die(char* str)
{
fprintf(stderr, "%s\n", str);
exit();
} int main(int argc, char** argv)
{
int i, id, c;
char buf[];
char major_root, minor_root; if (argc == ) {
} else {
major_root = DEFAULT_MAJOR_ROOT;
minor_root = DEFAULT_MINOR_ROOT;
}
fprintf(stderr, "Root device is (%d, %d)\n", major_root, minor_root);
for (i = ; i < sizeof buf; i++)
buf[i] = ; if ((id = open(argv[], O_RDONLY, )) < )
die("Unable open bootsect");
if (read(id, buf, MINIX_HEADER) != MINIX_HEADER)
die("Unable read Minix header");
i = read(id, buf, sizeof buf);
fprintf(stderr, "bootsect is %d bytes.\n", i);
buf[] = (char)major_root;
buf[] = (char)minor_root;
if ((*(unsigned short*)(buf + )) != 0xaa55)
die("boot hasn't '0xaa55' flag.");
i = write(, buf, );
if (i != )
die("write call failed.");
close(id); return ;
}

tools/build.c

源代码:https://github.com/chinax01/Lab

在 ubuntu 中进入目录后运行如下命令即可:

make

make editcopy

bochs

x01.os.21: print "Loading..."的更多相关文章

  1. x01.os.13: 文件系统

    停了两天电,忽然得空闲.找来破吉他,已然不成弦.           丁丁当当敲,敲到电来到.为把时间捡,熬夜三四点. 从我的置顶随笔 x01.Lab.Download 中下载 x01.os.12.t ...

  2. x01.os.14: 时间都去哪儿了

    时间都去哪儿了 老帕的“花儿为什么这样红”,三分钟引起六次欢呼,却败给了张碧晨.试想一下,如果是人气更高的陈冰,即使唱得和张碧晨一模一样,可能仍然不敌老帕,为什么张碧晨就能取胜呢?有这么个笑话:一人弹 ...

  3. x01.os.9: 进程切换

    进入内核后,当然不能无所事事.先创建三个进程,分别打印 A,B,C.虽然只是简单的打印,但却是一切扩展的基础,不可等闲视之. 进程切换,涉及一系列的寄存器需要保护,于是,就有了 ProcessStac ...

  4. x01.os.8: 加载内核

    在 x01.os.7 中,借助 freedos,学习了保护模式.但操作系统必须完成引导:boot, 加载内核:loader,kernel,进而管理process,memory,file等. 引导比较简 ...

  5. x01.os.7: 傻子一样的等

    傻子一样的等 昨日出差,办完事后,下午 2:30,准备进长途汽车站买票回家,被一人拦住,说可以带我进去,车马上就要开了,买票来不及.我以为是汽车司机,就跟了进去.进去后,他打了个电话,说 3:30 车 ...

  6. x01.os.18: MBR

    硬盘不同于软盘,它是要分区的.这时,mbr(master boot record)便不可少了.安装 os 硬盘的第一扇区,开始有一小段不多于 446 字节的程序,然后是分区表 512-446-2 字节 ...

  7. x01.os.16: 添加功能

    准备工作  1.确保是 win xp,如是 win 8,运行 nasm 需按提示同意安装组件.  2.确保 src 和 z_tools 在同一目录下,nasm 已包含在 z_tools 文件夹中.  ...

  8. x01.os.12: 在 windows 中写 OS

    在 windows 中写操作系统,需要一系列的辅助工具.在此,要感谢川谷秀实!所有工具,都在 z_tools 文件夹中.有了大师的帮助,不妨也来尝试在 windows 中写一把 OS. 源代码及工具可 ...

  9. x01.os.11: IPC 路线图

    学习的最好方法就是看代码,所以我们不妨跟着 IPC 的调用路线图,来学习学习 IPC. 从 x01.Lab.Download 下载代码后,首先进入 main.c 文件,在 TestA 中,有这么一句: ...

随机推荐

  1. 读取xml数据装配到字典中之应用场景

    前段时间看到支付宝设置里面有个多语言这个功能,蛮有意思的,就想双休没事的话做个相关的demo玩玩,可是礼拜六被妹子拽出去玩了一天,来大上海有大半年了,基本没有出去玩过,妹子说我是超级宅男,也不带她出去 ...

  2. iOS App引导页功能实现

    一.写作原因 以前都没有想着来写点东西,今天遇到件事情让我决定每次还是要做记录.因为以前自己可以轻松的完成pod spec的配置,但是今天在做的时候还是忘了遇到了很多坑.pod spec配置遇到的坑不 ...

  3. Xshell生成密钥key(用于Linux 免密码登录)

  4. C语言之预处理

    这是2016年的最后一篇博客,年初定的计划是写12篇博客,每月一篇,1/3转载,2/3原创,看来是实现不了了! -- 题外话.今天要写的东西是C语言中的预处理器,我们常说的宏定义的用法.为什么要写这个 ...

  5. Java程序猿 :2016 年终小结

    01 2016年即将进入尾声,不禁感叹,在学校的时候过日子是以天来算,而现在是以星期来算,甚至是月份. 这才发现,时间过得真快.这一年,遇到了很多人,很多事. 机缘巧合,年中去了趟帝都,爬了长城,游了 ...

  6. 微信小程序的应用及信息整合,都放到这里了

    微信小程序终于开始公测了,这篇文章也终于可以发布了. 这篇文章可以说是微信小程序系列三部曲最后一篇.8 月份,小程序推出前,我写了<别开发 app 了>详细阐述了为什么创业应该放弃原生 a ...

  7. LinqToDB 源码分析——生成表达式树

    当我们知道了Linq查询要用到的数据库信息之后.接下就是生成对应的表达式树.在前面的章节里面笔者就已经介绍过.生成表达式树是事实离不开IQueryable<T>接口.而处理表达式树离不开I ...

  8. C#委托的一次"甜蜜"接触

    委托是个说烂了的话题,但是依旧有好多人不知道为什么要在C#中使用委托,最近有朋友也问到我这个问题,所以举例些场景,以供那些知道怎么声明委托.怎么调用却不知道为什么要用的朋友一些参考,当然也是希望验证下 ...

  9. jQuery使用

    jQuery jQuery是一个快速,小,功能丰富的JavaScript库. 它使 HTML文档遍历和操作.事件处理. 动画和Ajax更简单和易于使用的API,在工作 众多的浏览器. 和多功能性的结合 ...

  10. C#开发微信门户及应用(33)--微信现金红包的封装及使用

    我在上篇随笔<C#开发微信门户及应用(32)--微信支付接入和API封装使用>介绍为微信支付的API封装及使用,其中介绍了如何配置好支付环境,并对扫码支付的两种方式如何在C#开发中使用进行 ...