Bochs源码分析 - 2:使用bochs运行引导代码

Bochs源码分析 - 8:bochs的CPU代码初步分析 前言 上一篇文章,我们分析了floppy设备的初始化,本来我们希望看看floppy的工作原理,但是调试时发现其运行cpu,通过BIOS启动指令来调用floppy。(从现在来看这是肯定的,floppy是外设,要想调用必须通过cpu,还是自己对底层不太熟悉) Bochs的CPU模块特别复杂,函数众多,我们是第一次分析,对其结构还是不太熟悉,我们先尝试来看其执行流程。在分析前,我浏览了一遍喻强老师的《Bochs项目源码分析与注释》,其CPU模块的核心图如下。 CPU模块的... 阅读详情

前言

        这一篇文章中,我们尝试使用编写引导代码,然后配置bochs让其可以运行这份代码,过程中遇到的问题,为什么这么做,我会尽可能详细的描述给大家,当然自己可能存在错误,请见谅!!

安装 nasm 编译器

下载地址: https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/win64/

编写启动引导代码

org 07c00h
mov   ax, cs
mov   ds, ax
mov   es, ax
call  DispStr
jmp   $
 
DispStr:
mov   ax, BootMessage
mov   bp, ax
mov   cx, 16
mov   ax, 01301h
mov   bx, 000ch
mov   dl, 0
int   10h
ret
 
BootMessage: db "Hello, OS"
times  510 - ($-$$) db 0
dw     0xaa55

使用nasm将汇编代码编译成bin(二进制)文件

nasm boot.asm -o boot.bin

使用IDA逆向工具来分析这个boot.bin文件

         如上是汇编代码与使用IDA反汇编的对比图,注意在启动IDA时会出现一个界面,其存在16位32位两种模式,我们要选择"否",使用16模式来反汇编,才能得到正确的反汇编代码。从反汇编代码角度看,其都是相对地址,没有什么需要分析的。

 -------------------------------------

备注:这里其实不需要用IDA来分析,也没啥分析的,但是之后我们都会尝试使用二进制分析工具来分析某些文件,来看看里面到底写了什么。

---------------------------------------

用bximage生成一个软盘映象

        下面我们来使用bochs提供的bximage工具来生成一个"软盘映像",当bochs编译成功,其会生成 .\bochs\obj-debug 目录,里面存放着编译后的文件,在该目录下存在一个 bximage.exe工具。

         之后,为了搞清这个生成的软盘映像(a.img)中有什么,我们使用010editor打开这个磁盘,发现其就是创建了一个1.44M大小的文件,里面使用0填充什么也没写!!

        当然,其项目如下,感兴趣可以看这个源码,当然因为这里直接全填充0,也没什么好看的(至少现在是这样,未来可能回头来看这份代码,谁知道呢。)

使用 dd.exe 将 启动代码(boot.bin)写入软件映像(a.bin)中

        在Windows下没有dd指令,该指令在Linux下可以将一个文件写入另一个文件中。看其他博客大多数使用cgywin工具(相当于Windows平台下小型linux工具集)中的dd.exe,这个下载有点麻烦,我们选择使用 "dd for windows"这个工具,直接百度或Google下载即可。

        使用 dd for windows,命令如下,将 boot.in 写入到 a.img 文件下.

dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc

 写入完成之后使用IDA打开,看着确实已经写入进去了。

 编写bochs的配置文件,让其启动软盘(a.img)

         编写配置文件可能是新手最痛苦的一个步骤,本来就不太会用还需要设置各种花里胡哨的参数,而且bochs网上的配置文件一般都是2.6.8版本,有些许改动,新手面对这个可能束手无策,照着网上的一顿copy可能会出错,这里我先给出2.6.11版本的正确配置文件,你需要正确配置你的机器上的绝对路径,所有注意事项已经在配置文件的开头标记出!!!

###############################################################
# bochs-2.6.11 版本的配置文件
# 注意: 
#   1.在 romimage  vgaromimage keyboard 中使用绝对路径,
#       如果使用默认的$BXSHARE可能会出现问题(我的就出现了问题,路径不对),
#       如果出现问题,使用绝对路径,其要使用的三个路径如下:
#       romimage --> bochs\bios\BIOS-bochs-latest
#       vgaromimage --> bochs\bios\VGABIOS-lgpl-latest
#       keyboard --> bochs\gui\keymaps\x11-pc-us.map
#
#   2. bochs识别的路径分隔符是使用 '/' (Linux版本),而Windows版本的是 '\',
#       如果Windows环境下直接复制粘贴路径,则默认是'\',bochs识别错误,
#       不修改的话会引起路径错误。
#       所以,一定要修改 '\' 为 '/'!!!!
#  
###############################################################

# This option sets the 'guest' and 'host' memory parameters to the same value.
megs: 32

# The ROM BIOS,负责BIOS启动的,我们这里直接使用系统自带的,后期或许可以自己编写BIOS来启动。
romimage: file= D:/code/bochs-project/bochs-src/bios/BIOS-bochs-latest

# A VGA BIOS, 应该是显示接口,使用系统自带的。
vgaromimage: file= D:/code/bochs-project/bochs-src/bios/VGABIOS-lgpl-latest

# what disk images will be used 
# 填写我们之前编写的软盘路径。
floppya: 1_44=D:/code/bochs-project/code/2-boot_code/a.img, status=inserted

# choose the boot disk.
# 这里设置软盘启动,与上面对应。
boot: floppy

# where do we send log messages?
# 这个暂时不需要启动日志输出,记得这个输出文件相当大。
# log: bochsout.txt

# disable the mouse, since Finix is text only
# 不需要键盘,我们现在只是文本启动。
mouse: enabled=0

# enable key mapping, using US layout as default.
# 使用系统自带的键盘设置。
keyboard: keymap=D:/code/bochs-project/bochs-src/gui/keymaps/x11-pc-us.map

         当你按照上面所讲正确配置好自己的"绝对路径"之后,按下面这个操作,bochs成功运行我们所编译的文件。

         但是,如果上面配置文件不正确,别慌,耐心看bochs所显示的内容,如下图是我在配置过程中出现的错误,然后 bochs关于配置的官方文档 在这里耐心查看自己的错误(我的设置很简洁了,没有太复杂的额外设置,应该不会出错)。

 

Bochs源码分析 - 11:《X86探索及编程》代码初步解释 前言 现在我们来阅读邓志老师的《x86/x64体系探索及编程》,边阅读边将其代码放到bochs中运行,然后观察bochs的CPU是如何来模拟的。现在我们来详细分析ex3-2目录里面的内容。 boot.asm 代码解读 自己在工作中经常看汇编代码,但是写汇编代码真的很少写过,我们现在一边分析着这段boot汇编代码一边回顾其如何编写。 ; Int 19h 加载 sector 0 (MBR) 进入 BOOT_SEG 段, BOOT_SEG 定义为 0x7c00 ... 阅读详情

相关推荐

Bochs源码分析 - 12:这才是真正的调试姿势!!

前言 之前我们为了正确的调试bochs,采用了很多方法,一种是利用IDA进行调试,第二种是采用bochs-dbg配合调试,第三种是在cpu_loop(..)中下循环来进行调试。这三种来实际操作中都很不方便。 真正的调试姿势 IDA以二进制模式分别以0x7c00,0x8000-2为偏移打开uboot.bin与setup.bin文件,静态分析;配置调试模式编译bochs,精确下断点定位指令;再通过visual studio 在cpu_loop(..)函数中下软件断点分析指令...

WriteAnything_的博客 687

Bochs源码分析 - 5: 从启动到cpu运行之前的一系列初始化

前言 现在正式开始调试bochs源代码,在这之前我也没读过bochs源码,算是从零开始读,自己可能会走入一些误区,有些可能猜错,如果发现之后会来改正。我们先大体走一遍整个系统,不要纠结于各种复杂细节流程。 这篇文章开始分析程序在点击启动后如何开始并且一步步初始化完成初始化,完成相关配置文件。说实话,如下图bochs启动时一系列的配置参数,对像我这种新手来说是相当恐怖的,各种启动参数信息。其实调试过一遍之后,虽然里面很多细节还是不太懂,但是再看这些信息心里踏实多了。 启...

WriteAnything_的博客 1312

Bochs项目源码分析与注释.pdf

Bochs是一个x86硬件平台的开源模拟器。它可以模拟各种硬件的配置。Bochs模拟的是整个PC平台,包括I/O设备、内存和BIOS。更为有趣的是,甚至可以不使用PC硬件来运行Bochs。事实上,它可以在任何编译运行Bochs的平台上模拟x86硬件。通过改变配置,可以指定使用的CPU(386、486或者586),以及内存大小等。一句话,Bochs是电脑里的“PC”。根据需要,Bochs还可以模拟多台PC,此外,它甚至还有自己的电源按钮。

Bochs源码分析-CPU类

因为学习需要,要看虚拟机Bochs的源代码。写随笔主要为了学习总结,其次是分享大家共同研究,大神勿喷,欢迎评论。 手头资料:bochs源代码,下于:bochs.sourceforge.net,还有喻强写的源码分析电纸书。 在Bochs模拟机里面CPU类是最复杂的一个类,也是最重要的一个类。原因很简单,在整个计算机体系中CPU处于中心位置,计算机其它部件都是在CPU的调控下进行有序的工作,当然C...

weixin_30635053的博客 267

Bochs核心代码分析(中文PPT、WORD格式,755K)

Bochs关键代码的分析,主要是CPU部分。讲得比较透彻。

LINUX内核完全剖析、源码及Bochs编译环境

最近在研发自己的系统,需要熟悉操作系统原理。故咨询了清华大学的师兄,并从他那里拿到了内容及其全面的Linux操作系统资料,听师兄说是从他的一个教授教案里拷贝的。压缩包中内容详尽,包括内核源码、内核分析电子书、内核编译环境(可以直接编译源码)及各个版本的linux内核下载地址(historic ,v1.0-v4.x),有需要的同仁,请自行下载. 包含内容: 1.LINUX内核完全剖析0.11内核.pdf 2.linux-0.11-devel-040329.zip 3.linux-0.11.tar.gz 4.Windows下用Bochs编译运行Linux-0.11.doc 5.各版本kernel下载地址.txt

Bochs源码分析 - 0 文章集合

为什么要阅读Bochs源码 Bochs是一个x86硬件平台的开源模拟器。它可以模拟各种硬件的配置。Bochs模拟的是整个PC平台,包括I/O设备、内存和BIOS。更为有趣的是,甚至可以不使用PC硬件来运行Bochs。事实上,它可以在任何编译运行Bochs的平台上模拟x86硬件。通过改变配置,可以指定使用的CPU(386、486或者586),以及内存大小等。一句话,Bochs是电脑里的“PC”。根据需要,Bochs还可以模拟多台PC,此外,它甚至还有自己的电源按钮。 ...

WriteAnything_的博客 1801

Bochs配置 - vhd虚拟硬盘.pdf

这本书教你如何配置Bochs,让你在Bochs上流畅运行程序并调试程序。主要应对人群是学习保护模式的同学。

操作系统的完整代码——镜像构建代码ycos.cpp

    为了介绍如何用YC编译器开发操作系统,作者设计并实现了一个简单的操作系统:YCOS。下面对YCOS源码进行详细分析和解释。 1. YCOS镜像构建代码ycos.cpp #include "ycos.h" #define L(_String) L ## _String #define yc_assert(EP) ((EP)?((void)(_wassert(L###EP,L(__FILE__...

1244

OCTF2016--piapiapia

知识点: php反序列化长度变化尾部字符串逃逸 目录扫描发现www.zip,下载得到源码 源码有index.php,输入账号密码后会进入profile.php,还有register.php、updata.php、class.php和config.php flag值在config.php中,想办法访问到其内容 通过seay代码审计找到一点线索 看到profile.php中存在任意文件读取漏洞,前面还有反序列化 现在我们有个大体思路了,update.php中有一个$prof..

Oavinci的博客 465

Dify Rerank 模型配置全流程解析:从报错定位到代码实现

Dify Rerank 模型配置全流程解析:从报错定位到代码实现

engchina的专栏 4461

操作系统内核Hack:(三)引导程序制作

操作系统内核Hack:(三)引导程序制作 关于本文涉及到的完整源码请参考MiniOS的v1_bootloader分支。 1.制作方法 现在我们已经了解了关于BootLoader的一切知识,让我们开始动手做一个BootLoader吧!但真正开始之前,我们还要做出一个选择,在之前的讨论中我们曾说过,有两种学习和制作引导程序和操作系统内核的路线:1)《Orange’s:一个...

weixin_30293079的博客 451

验证(uvm常见问题)--子类和父类的句柄和对象问题

sv中的子类和父类 在sv中,有如下两个类,child继承于parent。然后在test module中,正确转换的方法如下面所示。其中c1,c2,p1 都指向了同一个子类的对象c1。总结如下: 一个子类的对象是包括子类的成员变量,方法和父类的成员变量,方法。 子类的句柄c1可以直接赋值给父类的句柄p1,此时p1只可以访问父类的成员变量和方法,或者子类的虚方法,比如下面调用p1.display是...

q876507447的博客 7626

《 Linux内核完全剖析》、《linux内核完全注释》学习

《 Linux内核完全剖析》、《linux内核完全注释》学习

青少年趣味编程 1527

Transformer模型在语义通信中的实战应用:从信源编码到端到端优化

本文深入探讨了Transformer模型在语义通信中的实战应用,从信源编码到端到端优化。文章分析了Transformer凭借其强大的全局依赖建模能力,如何成为实现高效语义提取与传输的理想架构,并提供了构建可端到端训练系统的具体实现思路与评估方法,旨在为下一代智能通信系统提供技术参考。

o9p0q1的博客 686

YOLO11 改进、魔改|分组残差自注意力GRSA,通过分组残差优化 QKV 计算、指数空间映射优化位置偏差,在大幅降低自注意力模块参数和计算量的同时,增强特征关系与位置信息的表征能力

【摘要】研究人员提出GRSA(分组残差自注意力)机制,解决Transformer在图像超分辨率任务中效率与性能难以兼顾的问题。GRSA通过分组残差层减少自注意力参数冗余,同时采用指数空间相对位置偏差优化位置信息表征。实验表明,GRSA在降低50%参数量的同时保持模型性能,适用于目标检测和图像分割任务。在YOLO系列模型中集成GRSA可提升小目标检测精度,代码实现已开源,详细部署教程见相关视频与GitHub资源。该机制为轻量化Transformer模型提供了高效解决方案。

qq_64693987的博客 790

linux0,Linux0.01 linux0.01版本内核的讲解 - 下载 - 搜珍网

Linux 0.01/Linux 0.01光盘/386intel/386intel.pdfLinux 0.01/Linux 0.01光盘/doc/Bootable CD-ROM Format Specification.pdfLinux 0.01/Linux 0.01光盘/example/第9章 Linux磁盘文件系统/bitmap.cLinux 0.01/Linux 0.01光盘/example...

weixin_31600305的博客 248

TVBox源总失效?不如自己搭建一个!告别不稳定!手把手教你自建TVBox源,全网资源尽掌握!

🚀 TVBox源总失效?别慌!手把手教你自建TVBox源,打造一个稳定、海量、无广告的影视宝库!从此告别片荒,尽享丝滑观影体验!

XiaoqiangClub的博客 5361

在Visual C++中调试Linux 0.11内核:搭建混合开发环境与实战指南

操作系统内核是计算机系统的核心,负责管理硬件资源和提供基础服务。理解其工作原理对于深入计算机体系结构至关重要,而调试是学习内核不可或缺的环节。传统上,内核调试依赖于命令行工具和模拟器,流程割裂,体验不佳。现代集成开发环境(IDE)通过远程调试技术,能够将源码管理、智能导航和图形化调试界面整合,极大提升学习与开发效率。Visual Studio凭借其强大的C++开发与跨平台调试能力,结合GDB远程调试协议,可以构建一个高效的混合开发环境。这使得开发者能够在熟悉的Windows IDE界面下,对运行在Linux

weixin_34214500的博客 306

Spring AI Alibaba实战训练营-16 NL2SQL (自然语言转 SQL)应用开发指南

本文介绍了一个基于AI的智能BI应用开发项目,主要实现自然语言转SQL(NL2SQL)功能,包含对话模块、MCP模块、向量数据管理模块。项目采用Spring AI Alibaba框架,集成通义千问大模型,支持内存向量库和AnalyticDB向量数据库两种存储方案。重点展示了chat模块的三个控制器实现:AnalyticNl2SqlController用于生产环境,SimpleChatController适用于开发测试,Nl2sqlForGraphController支持基于图的复杂对话流程。系统通过将业务知

program哲学 1572

【1】Python交叉编译到OpenHarmony标准系统运行(arm32位)

本文介绍如何Python语言如何在OpenHarmony标准系统运行,包括5.0r和4.1r以及4.0r,和未来版本的OpenHarmony版本上。 Python语言在OpenHarmony上使用,需要将Python解释器CPython移植到OpenHarmony标准系统。通过交叉编译的方式。

weixin_58069108的博客 918

一个简单多任务内核实例的分析【转】

转自:http://blog.csdn.net/rosetta/article/details/8933228 一个简单多任务内核实例的分析 转载请注明出处:http://blog.csdn.net/rosetta 简介 Linux-0.00是由LinusTorvalds写的Linux最初版本(未发布),只是打印AAA和BBB而没有更多的功能,比...

weixin_33756418的博客 100

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Bochs源码分析 - 17:分析Bochs对于int指令的实现

前言 在《x86/x64编程体系探索及编程》的第207页,其举了一个使用中断服务例程的例子,我们现在来分析其源码以及探究bochs是如何实现的(重点探究int指令)。 代码分析 其首先设置好调用set_user_interrupt_handler来调用中断向量,内容如下: mov esi, SYSTEM_SERVICE_VECTOR // 0x40 mov edi, system_service // lib ...

WriteAnything_的博客 631

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Bochs源码分析 - 6: bochs的物理内存初始化

前言 上一篇文章,我们走马观花地介绍了bochs从启动到CPU执行流程的大体流程,里面相关数据结构没详细分析。这篇文章我们尝试来详细分析一下bochs的物理内存初始化,首先有个概念需要理清(相信来看bochs源码的人肯定会知道):bochs只负责处理物理内存,而虚拟内存是运行在bochs中运行的OS来负责的,我们只需要关注物理内存。 找到内存初始化函数 在上篇文章中,我们提到过一个比较重要的函数bx_init_hardware(),该函数负责初始化各种硬件(内存,Io...

WriteAnything_的博客 941

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

bochs的安装、配置和运行(《操作系统真象还原》第1章实验)

一、搭建环境

南七行者的博客 3479
上一篇: Bochs源码分析 - 0 文章集合
下一篇: Bochs源码分析 - 3: 同步到github上
WriteAnything_
博客等级 码龄5年 66粉丝 39原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值