8.32位模式前期准备
===========+=======+=======+=================+=============
bootsector |fat #1 |fat #2 | root directory |data region |
fat12/16 only
=================================================================
注意事项:
1:hello.asm:jmp kernel.img kernel.img:org 0xc400
2:mount了floppy 之后要umount,不然运行qemu的时候要报错, /dev/loop0 mount -o loop os.img /tmp/floppy -o fat=12
mount的目的是把kernel.img放到软盘os.img中
3: 运行的过程:make ,make copy ,make u ,make run
4:用两个dd 产生一个合适的软盘镜像,不能用cat命令
=================================================================
虽然之前的hello.asm把floppy上面的2x10x18x512个字节的内容都复制到ram上面,有点浪费,而且不是通过找到文件,调用文件方法,是用jmp 0xc400这种硬编码的方式,调用kernel.img
,这样也是不太好的,但是这样是最简单的,可能后面会不停的改进,最后,就非常的不错了
16位模式:ax,cx用的方便,eax,ecx用的麻烦
32位模式:用eax,ecx方便,
两种模式下,机器语言还是不一样的。16位完全是为了兼容,所以有一天,所有的16的模式可能完全不要了。
因为两种模式下,机器语言不一样,所以同样的机器语言,解释的方法也不一样。所以16模式下运行的机器语言,在32位下是不能运行的。
但是32位模式下,可以使用的内存的容量远远大于1MB,cpu的自我保护能力在32位模式下是非常强大的,但是16位模式下是不能用的。正是有了32位的模式,才有linux的产生。
但是,32位模式也就不能调用bios的功能,因为bios的中断服务函数全是16位的机器语言写的。如果我们进入了32位模式后,想要干什么,都得靠自己。(当然从32位模式下返回到16位模式也是有方法的,但是非常的麻烦)
画面模式是320x200x8位的color mode,已经设置好了,现在还要利用bios得到键盘的状态,就是numlock=on or off这些类似的状态。所以要修改kernel.asm程序,得到状态。
kernel.asm中的程序是把
显示模式有关的数据320x200x8保存在内存中0x0ff0开始
内存 [0x0ff0] =CYLS ;10
[0X0ff1] =leds ;keyboard
[0X0ff2] =8 ;vmode
[0X0ff4] =320 ;scrx
[0X0ff6] =200 ;scry
[0X0ff8] =0x000a0000 ;vram
vram=vide ram
保存这些信息的目的,是为了以备后用。bootinfo
不同的模式下,vram的分配的地址是不一样的,因为不同的模式下,像素数是不一样的。
所以我们先把这个模式下的vram的地址保存起来,如果改变了模式,我们把新的vram地址还是写到0x0ff8,
这样我们就可以方便的在不同模式下,显示不同的内容。
在这种varm模式下,vram地址空间为0xa0000-0xaffff ;64kB
======================================
boot_info从0x0ff0开始存放
bootsector存放的位置为0x7c00-0x7dff
floppy的其它的扇区存放的位置:0x8200
kernel的位置在内存的0xc400
======================================
16位模式下,内存可用的只有640kB的低存储空间,但是从0开始的地址空间有中断向量表和中断服务程序,
只要地址不与中断服务程序发生冲突,都是ok的
9开始用c语言了。
直接切换到32位的模式,然后用c写程序吧。作者只说这一课为了调用c语言而写了100多行的汇编,给调用c语言做准备。而且说这100多行的程序太过复杂,现在讲了很难理解,而是等后面,我们学的东西多了,再讲,就会轻松多了。
这样是好还是坏呢,很多书都会讲32位保护模式,而且说的太生硬,这样也许是个好的方法。oranges书中对32位就花了好多文字去讲述。所以我们现在只把这100行的汇编拿来用吧,同时注意这100行汇编是进行32位的程序,而且为调用c做了准备,就Ok了
小日本用nasm写汇编也很蛋疼啊,现在的问题用c写的bootpack.c这个程序怎么和kernel.asm这个程序变成一个文件。
必须要找到osdev上面的那文章
现在有个麻烦的问题,每次要把c函数转换成nasm的汇编语言,再和kernel.asm进行链接,这是多么麻烦的事啊,
如果kenel.asm可以用gas编译,那就好了,不用借用nasm了。整个过程也就简单了。朝这个方向努力。
没有合适的资源?快使用搜索试试~ 我知道了~
30天自制os,完全ubuntu版本
共73个文件
c:8个
o:8个
d:8个
5星 · 超过95%的资源 需积分: 23 81 下载量 146 浏览量
2013-08-18
07:58:00
上传
评论 2
收藏 4.03MB ZIP 举报
温馨提示
完全的ubuntu版本,没有用作者说到那些太多的工具,只用了gcc,nasm,hexedit,qemu这些工具。代码有一定的改变。
资源推荐
资源详情
资源评论
收起资源包目录
6daylastone.zip (73个子文件)
6day
kernelname.png 16KB
kernelcontext.png 4KB
boot_info.xcf 60KB
pic.png 141KB
fat12structure.xcf 62KB
writeos-1.0-2.pdf 3.61MB
FAT12Description.pdf 140KB
color band.png 55KB
fat12infor.png 54KB
boot_info.png 76KB
fat12structure.png 13KB
read1
question
readme.txt 5KB
bochsout.txt 10KB
ascii 6KB
kernel
main.d 57B
screen.c 5KB
cobj.out 23KB
print.o 8KB
main.o 11KB
entry.out 2KB
entry.ld 598B
header.h 3KB
print.d 47B
cobj 10KB
fontascii.h 64KB
kernel 10KB
mmu.h 11KB
int.d 43B
font.d 45B
int.o 4KB
idtgdt.d 49B
main.cbackup 2KB
kernel.ld 432B
int.c 4KB
screen.o 8KB
screen.d 49B
cobj.asm 406KB
idtgdt.o 5KB
entry.o 3KB
print.c 3KB
asmint32.asmbackup 862B
font.h 120B
linux代码boot.s翻译 16KB
types.h 2KB
x86.h 8KB
font.c 23B
entry.d 23B
asmint32.d 23B
makefile 1KB
font.o 3KB
asmint32.S 489B
entry.S 6KB
asmint32.o 1KB
entry 10KB
main.c 2KB
idtgdt.c 2KB
entry.asm 29KB
boot.tar.gz 9KB
linux学习笔记 584B
fontmake 7KB
back
japankernel.asm 60B
os.img 365B
kernel.img 365B
kernel.asm 2KB
os.img 1.41MB
bootloader.asm 3KB
fontmake.c 311B
bootloader.img 512B
hello.c 6B
makefile 615B
bootloaderusb.asm 3KB
readme.txt 4KB
bochsrc 223B
共 73 条
- 1
资源评论
- pro_Ening12018-10-27自制操作系统,看看
- baidu_157276512014-06-03ubuntu菜鸟一个,但是不想用windows,加油学习中
米油
- 粉丝: 39
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功