深度探索Linux系统虚拟化:原理与实现
上QQ阅读APP看书,第一时间看更新

1.5.4 Guest

接下来我们实现一个非常小的Guest,由于它足够小,所以基本不会发生Bug。这个Guest就是一个简单的无限循环,也不运行任何敏感指令:


// guest/kernel.S

    .code16gcc
    .text
    .globl  _start
    .type   _start, @function
_start:
    1:
    jmp 1b

这个Guest的内核中没有任何文件格式解码器,需要将Guest编译为无格式的,因此我们需要使用objcopy从ELF格式转换为binary格式,代码从地址0开始。这个Guest没有任何依赖,所以不连接任何其他的第三方库,最终Makefile如下:


// guest/Makefile

BIN := kernel.bin
ELF := kernel.elf
OBJ := kernel.o

all: $(BIN)

$(BIN): $(ELF)
    objcopy -O binary $< $@

$(ELF): $(OBJ)
    $(LD) -Ttext=0x00 -nostdlib -static $< -o $@

%.o: %.S
    $(CC) -nostdinc -c $< -o $@

clean:
    rm -rf $(OBJ) $(BIN) $(ELF)