x01.0s.21: print "Loading..."
0赞
发表于 6/30/2016 11:21:55 AM
阅读(2090)
先把目标设低点,开机进入后,在屏幕上打印“Loading..."即可。由于要在 bochs 中运行,首先就是安装 bochs。Oldlinux 中有相关资源,可自行下载。winxp 和 linux 的配置脚本如下:
# for windows bochs config megs : 32 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=365, heads=16, spt=63 boot: a mouse: enabled=0
# for linux bochs config display_library : sdl megs : 32 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=365, heads=16, spt=63 boot : a mouse : enabled=0 keyboard_mapping : enabled=1, map=/usr/share/bochs/keymaps/sdl-pc-us.map
当然,这只是作为参考。如是 winxp,建议直接在 bochs-sls1.0 中编译,用 dd 写入 /dev/fd1, 即 b.img;如是 ubuntu,我使用 eclipse,贪图智能提示而已,本质并无区别。github 中的代码为 Ubuntu 系统。由于要求简单,代码自然也简单,分别为 makefile, boot/bootsect.s, tools/build.c 如下:
# makefile
AS86 = as86 -0 -a
LD86 = ld86 -0
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
! boot/bootsect.s
.text
entry start
start:
mov ax, #0x07c0
mov ds, ax
mov es, ax
mov ss, ax
mov sp, #0xff00
mov cx, #18
mov bx, #0x000c
mov bp, #msg
mov ax, #0x1301
int 0x10
die:
jmp die
msg:
.byte 13,10,13,10
.ascii "Loading..."
.byte 13,10,13,10
.org 510
.word 0xaa55
/*
* 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(1);
}
int main(int argc, char** argv)
{
int i, id, c;
char buf[1024];
char major_root, minor_root;
if (argc == 5) {
} 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 = 0; i < sizeof buf; i++)
buf[i] = 0;
if ((id = open(argv[1], O_RDONLY, 0)) < 0)
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[508] = (char)major_root;
buf[509] = (char)minor_root;
if ((*(unsigned short*)(buf + 510)) != 0xaa55)
die("boot hasn't '0xaa55' flag.");
i = write(1, buf, 512);
if (i != 512)
die("write call failed.");
close(id);
return 0;
}
效果图如下:

