第0天-制作软盘开机往屏幕上打印Hello, OS world!
来源:互联网 发布:花生壳注册免费域名 编辑:程序博客网 时间:2024/06/05 12:03
实验目的:
通过自己动手实践, 了解计算机的启动流程, 为理解操作系统奠定基础
实验器材:
1. vmware, 里面装linux机器使用dd命令方便制作软盘
2. bochs, 模拟物理机器的模拟器 , 运行我们制作好的软盘
3. nasm, 使用它来编写开机启动的代码
实验步骤:
1. 软件安装
1.1 到buchs官网下载bochs安装, 用其启动里面的dllinux验证其安装是否正确
1.2 安装nasm,将其bin目录添加到环境变量PATH中
2. 机器指令生成
2.1 用编辑器编写如下代码,然后将其命名为boot.asm:
org 07c00h // 向nasm指示代码将会被加载到07c00h, nasm 会根据这个数字调整后面指令中对内存地址的引用
mov ax, cs
mov ds, ax
mov es, ax //数据段和扩展数据段寄存器指向代码段
call PrintMsg //调用PrintMsg打印消息
jmp $ //无限循环, $代表当前指令的内存地址
PrintMsg:
mov ax, BootMessage //
mov bp, ax //字符串的地址
mov cx, 16 //字符串的长度
mov ax, 01301h //AH = 13( 功能号), AL=01(显示模式)
mov bx, 000ch
mov dl, 0
int 10h //进入10号中断
ret
BootMessage: db "Hello, OS world!"
times 510 - ($ - $$) db 0 //times表示指令或数据重复被编译, $表示当前指令地址, $$当前段的开始地址。表示填充0 一直到地址499
dw 0xaa55 //在最后两个字节填上 55 aa。
2.2 使用命令 nasm boot.asm -o boot.bin 将汇编代码编译成机器指令码
3. 生成软盘映像
3.1 将boot.bin拷贝到linux中的/tmp 目录
3.2 运行以下命令生成软盘映像boot.img
3.2.1 dd if=/dev/zero of=diska.img bs=512 count=2880 //bs 指定读写块的大小, count 指定要写入软盘的块数,软盘的结构为2面, 80道/面
//18扇区/道, 512字节/扇区, 所以 512 * (2 *18 * 80 = 2880) = 1474560 = 1440 KB
3.2.2 dd if=/tmp/boot.bin of=boot.img bs=512 count=1
3.3.3 dd if=diska.img of=boot.img skip=1 seek=1 bs=512 count=2879
4. 配置生成的软盘镜像到bochs中
4.1 在bochs安装目录下建立 helloos文件夹, 将生成的boot.img复制到其中,再将dllinux中的bochsrc.bxrc和run.bat也复制到该文件夹中,打开bochsrc.bxrc
将flopyya 配置成boot.img, 并将启动方式改成floppy. 保存文件
4. 2 运行run.bat将虚拟机启动, 会看到如下画面:
至此, 实验完成。
实验总结:
1. 计算机中存在两种程序指令, 一种是我们平常所写的应用转化成的二进制指令, 这些程序不能自己执行, 它们必须依靠那些处于比他们更低层次的基础软件
在收到用户的指示或者在特定的事件发生的时候将其调用, 只有通过这种方式, 它们才得以被执行。 另一种就是我们这次实验中所写的程序了, 它们在计算
机启动时, 被调入到内存特定地址处, 然后立刻被执行(计算机在启动的时候会将启动设备上第一个扇区的内容读取到内存中,然后从第一条指令
开始执行。
2. 源代码文件与目标机器指令文件里面存储的都是二进制组成的内容, 不同之处是, 源码文件里存储的二进制内容是与人类的能识别的符号一一对应的,
它们被发送到显示器上后被显示器转化为人能识别的符号, 而目标机器指令文件里面存储的二进制内容则是CPU能识别的0,1 组合, 这些内容一般不发送到显示
设备, 而只是发送给CPU, CPU根据这些0,1组合做相应的状态转换, 输出不同的控制信号。
- 第0天-制作软盘开机往屏幕上打印Hello, OS world!
- [Rx86OS-I] 计算机开机从软盘启动显示字符串Hello World
- java打印 Hello World!
- 打印 Hello World!
- 打印Hello World
- 制作软盘上运行的FreeBSD系统
- 第一篇:Hello World!
- Hello World第一篇
- 第一篇 hello world
- mips汇编打印 hello world
- 打印Hello World,填空题
- 宏定义打印Hello World
- 使用C++打印hello world
- 多种语言打印Hello World
- setitimer和sigaction函数写的每隔5秒在循环屏幕打印hello world
- 在 mac os 上运行 kotlin native 的第一个程序:hello world
- Java第一天Hello,world
- OC第一节课,Hello World
- ttnhd
- Oracle 常见的33个等待事件
- eclipse远程调试Tomcat方法
- Effective Javascript (类型转换原理)
- file_get_contents和fread的性能差别
- 第0天-制作软盘开机往屏幕上打印Hello, OS world!
- iOS创建线程的三种方式
- ZOJ Problem Set - 1049 I Think I Need a Houseboat
- 实验五:Linux操作系统是如何工作的?
- module_init,module_exit
- eclipse中开发hadoop
- 一次谷歌面试趣事
- 字符串匹配算法总结
- Hibernate