从你的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第二天制作的操作系统 可以看到 ...
随机推荐
- 【转】eclipse新建项目,报错“Error: workspace\appcompat_v7\res\values-v21\styles_base.xml No resource found that matches the given name”
原文网址:http://www.cnblogs.com/mbp-study/p/5268478.html 新建项目报错,不知道为什么,以前从未出现过的错误,把sdk更新之后,出现莫名错误,自己也是一知 ...
- 【转】Git详解之一:Git起步
原文网址:http://blog.jobbole.com/25775/ 原文:<Pro Git> 起步 本章介绍开始使用 Git 前的相关知识.我们会先了解一些版本控制工具的历史背景,然后 ...
- 【转】protobuf2.5.0在<delete [] elements_;>crash的问题。
背景 项目中使用protobuf作为网络传输协议,最开始在项目中直接使用源代码编译,在真机上测试一直是正常的,直到某天开始在 CPU是64 bit的设备上发现protobuf导致crash了,于是就开 ...
- Codeforces 633 C Spy Syndrome 2 字典树
题意:还是比较好理解 分析:把每个单词反转,建字典树,然后暴力匹配加密串 注:然后我就是特别不理解,上面那种能过,而且时间很短,但是我想反之亦然啊 我一开始写的是,把加密串进行反转,然后单词正着建字典 ...
- hadoop cdh 4.5的安装配置
春节前用的shark,是从github下载的源码,自己编译.shark的master源码仅支持hive 0.9,支持hive 0.11的shark只是个分支,不稳定,官方没有发布release版,在使 ...
- jQuery.Autocomplete实现自动完成功能
一.http://www.w3c.com.cn/jquery-plugin-autocomplete-参数及实例 二.jQuery plugin: Autocomplete 参数 minChars: ...
- leetcode@ [126] Word Ladder II (BFS + 层次遍历 + DFS)
https://leetcode.com/problems/word-ladder-ii/ Given two words (beginWord and endWord), and a diction ...
- 全栈式框架的选择:MEAN or MEANS?
说明:个人博客地址为edwardesire.com,欢迎前来品尝.本博客作为备份和引流 这两个月一直在进行sails后端开发,其中遇到的问题不断.放在研究用户访问控制矸例程上的时间太多,最后也没用弄出 ...
- 【C语言】- 数据输出-printf( )和putchar( )
格式化输出函数printf( ) printf( )功能: 向系统指定输出设备按指定的格式输入任意个任意类型的数据,并返回实际输出的字符数.若出错,将返回负数. printf( )使用形式: prin ...
- [五]SpringMvc学习-Restful风格实现
1.Restful风格的资源URL 无后缀资源的访问(csdn用法) 2.SpringMvc对Rest风格的支持 2.1将 /*.do改为/ 2.2 3.@PathVariable获取Url变量 @R ...