用qemu模拟Intel x86平台实验环境 —— 概述

文章系列:
用qemu模拟Intel x86平台实验环境 —— 概述
用qemu模拟Intel x86平台实验环境 —— 启动系统
用qemu模拟Intel x86平台实验环境 —— 加载并运行app

文章目录

  • 需求
  • 平台结构
  • 实验平台运行方式
  • 工作概述

需求

linux kernel底层涉及到平台硬件模块,比如段/页机制的硬件单元,APIC,接触时比较陌生,虽然bochs可以模拟x86平台,但硬件固定,不能像qemu一样灵活地增删硬件。因此打算用qemu搭建一个用于研究硬件模块的实验环境。

平台结构

  • qemu: 模拟平台硬件
  • seabios: 系统上电运行的固件
  • floppy: 有两个作用,作为引导盘,在0扇区存放引导代码boot.bin,功能是将floppy根目录下存放的应用程序app.bin从磁盘中读出,加载到指定的内存位置;作为数据盘,根目录存放应用程序app.bin

实验平台运行方式

需要研究某个硬件模块时,通过以下步骤达到目的:

  • 编写硬件模块试验代码app.S
  • 通过as汇编成app.o,加入debugging调试信息
  • 通过ld将app.o链接成elf格式文件app.bin,指定app.bin中代码段的lvm为boot.bin中加载app.bin的内存位置
  • 读取app.bin的代码段,将其dd到文件作为裸的二进制程序,拷贝到floppy的根目录
  • 添加相应硬件模块并启动qemu,开启qemu内部的gdb server
  • gdb加载app.bin,调试应用

说明:第二步中可选的汇编器有多种,这里我们选取的as(兼容GNU Assembler)汇编器,对应的是AT&T语法,除此之外还有Intel开发的MASM及其他汇编器比如NASM,选取as汇编器的原因是通过-gstabs选项可以添加调试信息,这样gdb就可以调试,而NASM工具没有添加调试信息的选项,因此被排除了。其它工具没有研究过,所以,就是它了。

工作概述

  • qemu组件安装,用包安装或者下载源码编译都可以,不赘述
  • seabios组件安装,qemu包安装时会自动安装seabios固件,不需要考虑,也可以下载seabios源码自己编译安装
  • floppy磁盘来源,我用的1.44M容量floopy磁盘,空白盘可以通过bochs工具bximage生成,也可以dd生成
    dd if=/dev/zero of=a.img bs=512 count=2880
  • floppy磁盘0扇区固件,boot.bin固件,这是主要工作,需要自己写代码完成后dd到0扇区,代码包括以下功能:
    • 创建引导扇区标记,往0扇区的倒数两个字节写入0xAA55,使bios能够识别并加载这个扇区内容到内存地址0x7c00
    • 格式化floppy为FAT12格式,这个通过在boot.bin中定义FAT12引导扇区格式,用dd工具把boot.bin写到0扇区来实现
    • 读取floppy盘根目录的app.bin文件内容,将其加载到0x90100内存地址处,跳转到此处,执行app.bin的代码

你可能感兴趣的:(虚拟化,内核,Intel,Architecture)