第0天-制作软盘开机往屏幕上打印Hello, OS world!
2013-07-03 21:14
176 查看
实验目的:
通过自己动手实践, 了解计算机的启动流程, 为理解操作系统奠定基础
实验器材:
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组合做相应的状态转换, 输出不同的控制信号。
通过自己动手实践, 了解计算机的启动流程, 为理解操作系统奠定基础
实验器材:
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组合做相应的状态转换, 输出不同的控制信号。
相关文章推荐
- 使用TCP协议编写一个网络程序,设置服务器端的监听端口是8002,当与客户端建立连接后,服务器端向客户端发送数据“Hello, world”,客户端收到数据后打印输出。
- Linux 设备驱动helloworld.ko的制作过程
- 操作系统实践之第一章(Hello OS world)
- 第一个Hello,OS World操作系统
- 深入剖析printf函数(上):如何不借助第三方库在屏幕上输出"Hello World"?
- 自己动手写操作系统--"Hello, OS world!"
- 开始第一个小程序,打印“hello,world”
- 入门 打印出“hello, world”
- if里加入内容让其打印出Hello,World
- run helloworld on s3c2410 using skyeye without OS
- 自己动手写操作系统--"Hello, OS world!"http://blog.csdn.net/zieckey/archive/2007/05/15/1609908.aspx
- JNI:Java调用C函数打印hello,world
- 深入剖析printf函数(上):如何不借助第三方库在屏幕上输出"Hello World"?
- run helloworld on s3c2410 using skyeye without OS
- eclipse下jni初学,调用helloworld.dll,打印字串”Hello world!”
- 在Java程序中调用C函数--打印"HelloWorld"
- 自己动手写操作系统--"Hello, OS world!"
- Hello OS world!
- 在MacOSX的Vmare Fusion中添加虚拟软驱和制作虚拟软盘
- 使用TCP协议编写一个网络程序,设置服务器端的监听端口是8002,当与客户端建立连接后,服务器端向客户端发送数据“Hello, world”,客户端收到数据后打印输出。