小D的小作品

来源:互联网 发布:淘宝在哪搜索店铺名称 编辑:程序博客网 时间:2024/04/29 00:29

 

尝试了一把《一个操作系统的实现》里面的实验。成功的完成了两个内容。一个是:Hello,OS world!第二个是保护模式下的运行环境。
很明显,这两个实验都很简单。但是,因为我刚刚入手,因此显得困难重重。但是花了两个晚上,从无到有,我很满意,因此把这个给大家分享以下。附件是我的源代码,以及截图,最重要的是我的bochsrc配置文件,大家可以看看这个文件是不是这样的(我有点怀疑)。接下来是我在做的过程中遇到的一些小困难以及解决方法。
1.(前天5.10)
Event type: PANIC
Device: [MEM0 ]
Message: ROM: couldn't open ROM image file '/usr/share/bochs/BIOS-bochs-latest'.
大家都用过Bochs,因此肯定都知道这个错误的原因,没错。路径错误。于是,很智能化的,我的榆木脑子迅速联想到了我们正在做的labs的配置文件,问题得到解决。
2.
========================================================================
Bochs is exiting with the following message:
[KMAP ] Can not stat keymap file '/usr/share/bochs/keymaps/x11-pc-us.map'.
========================================================================
这是我的bochsrc文件左后一行写错而产生的错误,原因很简单,就是这个路径很本不存在。解决方法和上面一样。
3.(也就是昨天,5.11,大概自习回来10点钟的样子)
此时我很茫然,不知道接下来改干什么。因为同时做了两个实验的内容。但是都不成功(在终端下的报错,以及panic都没有记录)。于是我怀疑是不是bochs的配置文件,也就是configure的时候出了问题。接着我花了不少时间去查看bochs文件夹有关configure和Make的文件。但是没发现什么错误。
4.这个时候,我想放弃了,,,,
于是,google。 
。。。。
看到网上有很多资料,于是我便看了几个。至少在当时觉得比较不错的。
    第一个是bximage的使用。开始我并不知道这个怎么用的。但是我一看有条指令是man bximage。我就恍然大悟。于是乎
  -------------------------------------------------------------------------------------------------------------------------------
  dark@ubuntu:~/new/oos/chapter1/a$ bximage
========================================================================
                                bximage
                  Disk Image Creation Tool for Bochs
        $Id: bximage.c,v 1.34 2009/04/14 09:45:22 sshwarts Exp $
========================================================================

Do you want to create a floppy disk image or a hard disk image?
Please type hd or fd. [hd] fd

Choose the size of floppy disk image to create, in megabytes.
Please type 0.16, 0.18, 0.32, 0.36, 0.72, 1.2, 1.44, 1.68, 1.72, or 2.88.
 [1.44]
I will create a floppy image with
  cyl=80
  heads=2
  sectors per track=18
  total sectors=2880
  total bytes=1474560

What should I name the image?
[a.img]

Writing: [] Done.

I wrote 1474560 bytes to a.img.

The following line should appear in your bochsrc:
  floppya: image="a.img", status=inserted
------------------------------------------------------------------------------------------------------------------------------------
上面的代码就顺理成章。大家应该能明白。  这个软盘映像就是我们要用的。现在解决了一部分。现在的问题是:第一个实验不能显示东西,第二个还有问题。
5.回头看第一个,也就是显示Hello,OS world!这个很简单的程序,我仔细检查了代码,以及bochsrc配置文件。没错阿!!我xxx
于是:N次在终端下输入:bochs后,我的榆木脑子终于开窍了:没有执行,也就是最简单的:C..我晕死。
6.解决了这个,接下来就是freedos的问题。好吧,去网上下载。下了3个,全是ISO。我再晕。居然没有.img文件。。。
7.再看看书上的内容:“一个是写引导扇区,可以读取我们的程序并运行它,就好像这程序是个操作系统的内核,这个方法对目前的我们难度大了些。不过可以把别人的引导扇区借来用下,也是可以的。“
   所以
  继续google
 ...

这时才发现原来bochs官方网站上就有下载。看来还得相信书本阿!!!
顺利下载。解压。启动。格式化B盘。改代码。重新编译。

到复制到虚拟软盘的适合就出问题了。。
dark@ubuntu:~/new/oos/chapter3/a$ sudo mount -o loop pm.img /mnt/floppy
mount: 挂载点 /mnt/floppy 不存在

不存在,那就创建把。
在mnt目录下:
sudo mkdir floppy
ok!!问题解决。
接着,mount ...cp...umount...
启动。运行。实验成功。


这两个实验的原理很简单。但是收获颇丰。
1.因为现在就在学习汇编语言,所以这次很轻松的就明白了以前不是很明白的代码。发现了其中的各种细节。也终于弄明白系统刚刚运行的时候,数据是怎么在内存和cpu中来回跑动的。
2.对GDT,GDTR理解的加深。
3.刚刚才明白A20的真正含义。
4.。。

。。。

发现这个还挺有意思的。
就向后面做把。也就是保护模式的进阶。

 

这张图是显示‘P’的。

左上角的hello,os world.

格式化B盘。

 


###############################################################
# Configuration file for Bochs
###############################################################

# how much memory the emulated machine will have
megs: 32

# filename of ROM images
romimage: file=$BXSHARE/BIOS-bochs-latest
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest

# what disk images will be used
floppya: 1_44=freedos.img, status=inserted
floppyb: 1_44=pm.img,status=inserted
boot:a
# choose the boot disk.
#boot: floppy

# where do we send log messages?
log: bochsout.txt

# disable the mouse
mouse: enabled=0

# enable key mapping, using US layout as default.
##keyboard_mapping: enabled=0, map=
####这是我的bochsrc文件

 

;=====================================
;pmtest1.asm
; 编译方法:nasm pmtest1.asm -o pmtest1.bin
;====================================


%include"pm.inc" ;常量,宏,以及一些说明

org0100h
jmpLABEL_BEGIN
[SECTION .gdt]
;GDT
; 段基址, 段界限, 属性
LABEL_GDT: Descriptor 0, 0, 0 ;空描述符
LABEL_DESC_CODE32: Descriptor 0, SegCode32Len-1, DA_C+DA_32 ;非一致代码段
LABEL_DESC_VIDEO: Descriptor 0B8000h, 0ffffh, DA_DRW ;显存首地址
;GDT

GdtLenequ$-LABEL_GDT;GDT长度
GdtPtrdwGdtLen-1;GDT界限
dd0;GDT基地址

;GDT 选择子
SelectorCode32equLABEL_DESC_CODE32-LABEL_GDT
SelectorVideoequLABEL_DESC_VIDEO-LABEL_GDT
;END of [SECTION .gdt]

[SECTION .s16]
[BITS 16]
LABEL_BEGIN:
movax,cs
mov ds,ax
moves,ax
movss,ax
mov sp,0100h

;初始化32位代码段描述符
xoreax,eax
movax,cs
shleax,4
addeax,LABEL_SEG_CODE32
movword [LABEL_DESC_CODE32+2],ax
shreax,16
movbyte [LABEL_DESC_CODE32+4],al
movbyte [LABEL_DESC_CODE32+7],ah

;为加载GDTR做准备

xoreax,eax
movax,ds
shleax,4
addeax,LABEL_GDT;eax<-gdt基地址
movdword [GdtPtr+2],eax;[GdtPtr+2]<-gdt基地址

;加载GDTR

lgdt[GdtPtr]

;关中断
cli

;打开地址线A20

inal,92h
oral,00000010b
out92h,al

;准备切换到保护模式

moveax,cr0
oreax,1
movcr0,eax

;真正进入保护模式

jmpdword SelectorCode32:0;执行这一句会把SelectorCode32装入cs,并跳转到Code32Selectorz;0 处
;END of [SECTION .s16]

[SECTION .s32] ;32位代码段,由实模式跳入
[BITS 32]

LABEL_SEG_CODE32:
movax,SelectorVideo
movgs,ax;视频段选择子(目的)

movedi,(80*11+79)*2;视频第11行,第79列。
movah,0ch ;0000:黑底 1100:红字
moval,'p'
mov [gs:edi],ax

;到此停止

jmp$

SegCode32Lenequ$-LABEL_SEG_CODE32
;;;;;;END of [SECTION .s32]


;;;这是我的petest1.asm文件 。

 

原创粉丝点击