从你的u盘启动:30天自制操作系统第四天u盘启动学习笔记
暑假学习小日本的那本书:30天自制操作系统
qq交流群:122358078 ,更多学习中的问题、资料,群里分享
developing environment:ubuntu
关于u盘启动自己做的操作系统的原因:
我想大部分分的学习者和写Os的人都有这样的想法,为什么现在大部分的教程都是拿软盘来说做仿真,我们的电脑上面也没有软盘,搞来搞去的系统,到头来只能仿真,没有什么意思。能在真机上跑跑自己写的系统才是有意思的事情。当然,这也是我自己的想法。
想在真机上跑,就需要一台slave机(另一台做实验的电脑),这有点交叉编译的感觉了。如果在slave上有硬盘,可以把我们开发的系统写到slave机的硬盘上,但是这样很麻烦,每次改个程序,想看效果,都需要把程序搞到slave机的硬盘上,这样也不太实际。所以这样想来,真正开发操作系统的工程师应该还在用仿真器,因为这样快,只有到了一个操作系统有实质变化的时间,工程师才会把开发的操作系统写到slave机的硬盘上,然后进行真机测试。而且为了保证可以直接把开发的操作系统文件直接复制到硬盘上,硬盘上面应该早就有grub这样的bootloader,直接指定我们操作系统的文件在哪里,就可以启动了。这里我也想了想,我们30天的开发的操作系统,能不能用grub来复制到内存,然后启动。但是这是后面的研究。也就是把grub写到u盘上,然后在slave机上插好u盘,读取我们写的操作系统的文件到内存,然后运行就可以了。把搬运操作系统的工作交给了grub这样的bootloader,开发操作系统的人员就可以考虑操作系统是如何被引导到内存的。所以现在的操作系统文件如elf文件,中就包含自己的代码要在内存的哪里运行的地址。grub读取到这个内核要在哪里运行,然后把代码部分copy到指定的ram地址就可以了。
对于我们只是学习和玩,把开发的操作系统内核写到slave机的硬盘上,显然是不太可能的,除非你家有一台完全闲置的机器。这样才能可能让你随便玩弄,包含硬盘在内。所以我们需要从u盘启动30天自制操作系统的代码,在真机上跑起来完全是自己写的代码,感觉是不一样的。一个字,爽。花了一天的时间,查资料,带猜测的对u盘的读取做了一些实验。终于把第四天的代码修改的可以从u盘启动了。在开发,学习的过程中,深感ubuntu的强大好用。
下面是从u盘启动真机运行的图片:
下面大体讲解一下从u盘启动的研究过程。
1:大家都知道要从u盘启动,就是怎么读U盘,其实和读软盘差不多,还是用int0x13中断来读u盘,只是此时的dl寄存器代表的 驱动器号有所不同。
但是我们怎么知道我们的电脑从u盘启动时,dl=多少呢,因为u盘是后于floppy出现的产生,所以老的bios机器是不支持从u盘启动的。u盘是模拟成从硬盘或是软盘启动。
但是有一种方法可以从u盘启动时,知道你的dl=??,因为当你把bios设置成u盘启动时,u盘的前512字节就复制到0x7c00外了,注意好好理解这里,bios把u盘的前512字节复制到内存,所以当bios把控制权刚交给0x7c00处代码时,dl中的值是一个有效的值,就是我们需要知道的值, 从u盘启动的驱动器号。所以我写了个512字节的程序,用来显示寄存器的数值到显示器,当从u盘启动时,这512字节的程序被bios加载到内存后,我马上将dx的值显示到screen。这样一来我们就知道了dl是多少了。后来想想,也没有必要显示dl,只要保存到内存中就行了,读取u盘后面扇区时,再从内存读到dl.
2:还有一点,也是非常重要的一点,我们知道软盘的大小的组织方式: 80cylinders x 2heads x 18sectors x 512 bytes
但是我们u盘随便一个就比软盘容量大不少,但是u盘也是用chs来寻找扇区的。所以我们要知道我们自己的u盘有有多少个cylinders,heads,sectors x512bytes
还是利用bios提供的一个中断,可以将我们u盘有多少个cyliners and heads and sectors显示出来,这个中断服务程序是 int 0x13 /ah=0x08 ,如果你要读u盘的容量组织情况
dl 赋值第一步得到的值。然后调用int 0x13就行了。关于u盘的chs的值都保存在寄存器中,所以我写的显示寄存器的程序又起作用了。调用了int 0x13 /ah=0x08之后,就可以根据寄存器的值算出你的u盘的chs了。
我的u盘的信息如图: 从下图可以看到,我们主要关心cx,dx寄存器,u盘的chs信息就在这两个寄存器了。
得到了u盘的chs,得到了读u盘的dl号,把u盘上的想要的内容读到内存就不是什么难事了。在30天的代码中小做修改就可以了,下面是我修改的部分,其它部分基本没有变。
push dx mov si,msg ;helloworld
call puts mov si,cpmsg ;start copying to sdram
call puts mov ax,0x0800
mov es,ax
pop dx mov ch,0
mov dh,0
mov cl,1 readloop
mov si,0
retry: mov bx,0 call cp2ram
jnc next ;copy sucessfully add si,1 ;copy failed
cmp si,5
jae error mov ah,0x00 ;reset disk
;mov dl,0x00 ;bootfrom floppy
;mov dl,0x80 ;bootfrom usb
int 0x13
jmp retry next:
mov ax,es
add ax,0x0020
mov es,ax add cl,1 ;sector++
cmp cl,63
jbe readloop mov cl,1 ;sector 是从扇区1形始
add dh,1 ;head++
cmp dh,61
jb readloop ;mov dh,0
;add ch,1 ;cylinder++
;cmp ch,CYLS ;这里用了一个宏定义
;jb readloop
mov [0x0ff0],ch ;把10cylineder保存到内存0x0ff0位置处
jmp ok
可以看到:
因为我的u盘是1014cylinders x 60heads x63sectors x512bytes,所以主要是把cl, dh,这些值改了下,然后把生成的镜像dd到U盘上就可以了,享受自己动手的乐趣吧。
有问题留言讨论or join our qq group.
从你的u盘启动:30天自制操作系统第四天u盘启动学习笔记的更多相关文章
- 30天自制操作系统第八天学习笔记(u盘软盘双启动版本)
暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078 ,更多学习中的问题.资料,群里分享 environment:开发环境:ubuntu 第八天的学习思考: 关于鼠标是怎么 ...
- 30天自制操作系统第九天学习笔记(u盘软盘双启动版本)
暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078 ,更多学习中的问题.资料,群里分享 environment:开发环境:ubuntu 第九天的课程已学完,确实有点不想写 ...
- 关于U盘启动操作系统《30天自制操作系统》
原本的启动是从img启动的,并且这个img是用FAT12文件系统进行格式化的(详细去搜索FAT12文件格式,这里给大家推荐一篇http://www.doc88.com/p-646605198560.h ...
- 《30天自制操作系统》笔记(03)——使用Vmware
<30天自制操作系统>笔记(03)——使用Vmware 进度回顾 在上一篇,实现了用IPL加载OS程序到内存,然后JMP到OS程序这一功能:并且总结出下一步的OS开发结构.但是遇到了真机测 ...
- 《30天自制操作系统》笔记(02)——导入C语言
<30天自制操作系统>笔记(02)——导入C语言 进度回顾 在上一篇,记录了计算机开机时加载IPL程序(initial program loader,一个nas汇编程序)的情况,包括IPL ...
- 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!
<30天自制操作系统>笔记(01)——hello bitzhuwei's OS! 最初的OS代码 ; hello-os ; TAB=4 ORG 0x7c00 ; 指明程序的装载地址 ; 以 ...
- 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!【转】
转自:http://www.cnblogs.com/bitzhuwei/p/OS-in-30-days-01-hello-bitzhuwei-OS.html 阅读目录(Content) 最初的OS代码 ...
- 30天自制操作系统(三)进入32位模式并导入C语言
1 制作真正的IPL IPL(Initial Program Loader),启动程序装载器,但是之前并没有实质性的装载任何程序,这次作者要开始装载程序了. 虽然现在开发的操作系统啥功能也没有,作者说 ...
- 《30天自制操作系统》软盘 -> VMware虚拟机
书名叫做30天自制操作系统,按照学校课设答辩的时间来看,估计得把书名改成<一周自制操作系统>,太卷了哈哈哈 我们可以使用qemu来模拟物理机 make run第二天制作的操作系统 可以看到 ...
随机推荐
- Asp.net mvc中整合autofac
创建Asp.net MVC并引入Autofac 首先,创建一个MVC站点,为方便起见,选初始带HomeController和AccountController的那种.然后通过NuGet或到Autofa ...
- 通过autofac教你彻底明白依赖解耦(二)理论结合实践 - 大侠.Net
上节说了一下基本的理论知识,例子可能不太好,不过无所谓了,目的是要让大家明白啥是依赖倒置和依赖注入,目的就达到了,简单一句话,这2玩意都是用来解耦合的. 不过依赖倒置这个词哥哥真不敢苟同,哥哥来个颠覆 ...
- 编程精粹:编写高质量的C语言代码———笔记一
第一章 假想的编译程序 要记得对空语句进行处理,最好使用NULL使其明显可见 char * strcpy(char* pchTo, char* pchFrom) { char* pchStart = ...
- Base-Android快速开发框架(四)--网络操作之FastJson以及AsyncHttpClient
Android的展示数据,除了上章所讲的本地存储外,大部分数据都来自于网络.首先介绍一下Android APP开发常见的网络操作方式.从网络层面上有底层的tcp/ip,也就是我们常见的socket套接 ...
- wuzhicms页面报错 Notice 错误,如何关闭错误显示!
错误类型类似: PHP Notice: Use of undefined constant E_DEPRECATED - assumed 'E_DEPRECATED' in D:\freehost\3 ...
- 【Linux 命令】Linux系统下强制用户下线——who,pkill
[日期]2014年11月18日 [平台]Centos 6.5 [工具]who pkill [步骤] 1)准备工作 以root身份登录. 2)执行who命令,查看有哪些用户已登录到当前主机
- XMPP的Stanzas
客户端需要使用JID作为身份标石 : [user "@"]domain["/"resource]加域名可以区别重名的用户user,resource可以区分用户登 ...
- php透明合并png与jpg图片
源 <?php $png = imagecreatefrompng('./mark.png'); $jpeg = imagecreatefromjpeg('./image.jpg'); list ...
- ABAP开发基础知识:内表(Internal Table)
http://www.cnblogs.com/foxting/archive/2012/03/19/2406830.html 内表与结构体基本类似,它同样是程序运行中被临时创建的一个存储空间,它是一个 ...
- hdoj 1799 循环多少次?
循环多少次? Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...