nasm实现的用vmware运行自做的linux启动盘的引导代码

 更新时间:2013年04月24日 12:12:03   作者:  
这个小的代码的编写和运行还是能让自己对系统启动有一个更深的认识,不过有个不懂的就是怎么用ISO镜像文件启动,怎么将引导代码写入ISO镜像文件,依然没有找到很好的方法解决

当计算机电源被打开后,它会先进行加电自检(POST),然后寻找启动盘,如果是选择从软盘启动,计算机就会查找软盘的0面0磁道1扇区,如果发现它以0xAA55结束,则BIOS认为它是一个引导扇区,然后BIOS就会把引导扇区的前512字节的引导代码拷贝到内存的0000:7c00处并将控制器彻底交给这段引导代码。

简单的引导代码如下所示:

复制代码 代码如下:

org 07c00h ;告诉编译器加载到07c00h处

mov ax, cs
mov ds, ax
mov es, ax

call DispStr ;调用显示字符串函数

jmp $; 无限循环

DispStr:
mov ax, BootMessge
mov bp, ax
mov cx, 16
mov ax, 01301h
mov bx, 000ch
mov dl, 0
int 10h
ret
BootMessge: db "hello, OS world!"
times 510 - ($ - $$) db 0
dw 0aa55h


这段代码时用nasm写的,它类似于masm的语言。org 07c00h命令就是将命令后面的代码中的偏移地址都加上07c00h,这样程序就相当于在0000:7c00出执行了。按书中所讲的,用命令nasm bootsector.asm -o boot.bin生成引导代码boot.bin,然后将boot.bin写入软盘的0面0磁道1扇区就可以了。问题就来了,我没有软盘怎么搞,不过在wmware虚拟机中貌似可以用软盘的映像文件来启动,所以就想到自己制作一个映像文件来代替软盘来作为启动盘,不过怎么创建这个映像文件呢?

以前记得用linux下的dd命令做过linux的启动盘,dd应该是可以制作的,于是在网上找了下dd制作映像文件,果然是可以的,制作方法如下:

1 先制作一个空的软盘映像文件diska.img(1.44Mb的软盘映像文件):

dd if=/dev/zero of=diska.img bs=512 count=2880

2 制作一个包含boot.bin的映像文件boot.img:

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

3 将diska.img中1个扇区后面的数据拷贝到boot.img的后面

dd if=diska.img of=boot.img skip=1 seek=1 bs=512 count=2879

这样就做成了一个大小为1.44Mb的包含引导代码的映像文件。

后面的事就好办了,直接在wmware创建一个空的虚拟机,在设置中将Floppy的路径设置为上面制作的引导扇区的路径就ok了,如下图那样:

设置Floppy连接,断开CD/DVD连接,启动虚拟机就可以看到下面的画面了:

 

总结:这个小的代码的编写和运行还是能让自己对系统启动有一个更深的认识,不过有个不懂的就是怎么用ISO镜像文件启动,怎么将引导代码写入ISO镜像文件,依然没有找到很好的方法解决。

相关文章

  • 详解敏捷过程中的需求管理

    详解敏捷过程中的需求管理

    企业在做敏捷转型中,需求无法按时交付的困扰你是否也遇到过呢?
    2021-05-05
  • 分享Git常用7大技巧和命令

    分享Git常用7大技巧和命令

    Git 是一个非常强大的工具,它包含丰富的工具用以维护项目,我们在日期工作中会经常用到一些常用命令,本文先为大家介绍下面七个Git常用技巧和命令
    2018-09-09
  • 浅谈服务发现和负载均衡的来龙去脉

    浅谈服务发现和负载均衡的来龙去脉

    单机时代,传统软件大多是单体/巨石架构(Monolithic)。大家往一个代码仓库提交CODE,这会导致应用膨胀,以及扩展受限,无法按需伸缩等诸多问题。单体架构怎么解决多人合作的问题?模块化,按功能拆分,模块之间定义编程接口(API)。本篇文章带你详细了解。
    2021-05-05
  • 300行代码让外婆实现语音搜索购物功能

    300行代码让外婆实现语音搜索购物功能

    这篇文章主要介绍了300行代码让外婆实现语音搜索购物功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 浅谈迁移学习

    浅谈迁移学习

    迁移学习(Transfer Learning)是一种机器学习方法,是把一个领域(即源领域)的知识,迁移到另外一个领域(即目标领域),使得目标领域能够取得更好的学习效果
    2021-06-06
  • 浅谈如何降低软件复杂性

    浅谈如何降低软件复杂性

    软件的复杂性是我们程序员在日常开发中所必须面对的东西,学会如何 “弄清楚什么是软件复杂性,找到导致软件复杂的原因,并利用各种手法去战胜软件的复杂性” 是一门必备的能力。
    2021-05-05
  • Cordova插件实现JavaScript与Java的通信的详细过程

    Cordova插件实现JavaScript与Java的通信的详细过程

    本文将结合最常用的华为推送服务Cordova插件,介绍HMS Core用到的JS-Java消息交互方式,讲解在JS侧如何调用Java侧接口,最终实现HMS Core能力,感兴趣的朋友一起学习下吧
    2021-06-06
  • Pascal Move的用法

    Pascal Move的用法

    这篇文章主要介绍了Pascal Move的用法,需要的朋友可以参考下
    2021-11-11
  • 详解Python OpenCV数字识别案例

    详解Python OpenCV数字识别案例

    信用卡识别的案例用到了图像处理的一些基本操作,对刚上手CV的人来说还是比较友好的。
    2021-05-05
  • ascii码表(二进制 十进制 十六进制)详细介绍

    ascii码表(二进制 十进制 十六进制)详细介绍

    这篇文章主要介绍了ascii码表二进制 十进制 十六进制详细介绍的相关资料,需要的朋友可以参考下
    2017-01-01

最新评论