文章转载自 http://blog.csdn.net/h397916230/article/details/9732425
暑假学习小日本的那本书:30天自制操作系统
更多学习中的问题、资料,群里分享
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天的代码中小做修改就可以了,下面是我修改的部分,其它部分基本没有变。
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,10 jbe 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盘上就可以了,享受自己动手的乐趣吧。
相关推荐
《30天自制操作系统——用U盘启动自制系统》是一本旨在指导读者亲手构建操作系统的教程,通过30天的学习和实践,使读者能够理解操作系统的基本原理并掌握其开发技术。在这个过程中,使用U盘作为启动介质是实现自定义...
以下是对“用U盘(优盘)安装操作系统图文教程”的深入解析,旨在帮助用户掌握这一实用技能。 #### 装系统前的准备 在正式开始安装之前,确保手头拥有以下两项关键要素: 1. **操作系统的镜像文件**:这是你想要...
手写一个X86操作系统实战:从零开始构建一个U盘启动的自制操作系统 这个标题可能有点大了:-) 一个操作系统至少应该有自己的文件系统和进程机制,不过我们的最终目标应该是这个~ 无论如何,看完本文,你应该可以...
通过上述步骤,你可以成功地在索尼笔记本上设置U盘启动,进而使用U盘来安装新的操作系统。记得在完成系统安装后,再次进入BIOS将启动方式设置回硬盘启动,以保证正常启动新安装的操作系统。在整个过程中,如果遇到...
这时就需要让电脑从全能优盘启动了】要让电脑开机从U盘启动,就像用光盘给电脑装系统要让电脑从光盘启动一样,必须在电脑开机时进行设置,因为电脑主板的差异所以设置的方法也是各不相同,要设置从U盘启动大部电脑都...
U盘启动系统是一种便捷的方法,用于在电脑遇到问题或需要重装操作系统时,通过USB设备进行启动和系统恢复。这种方法避免了使用光盘驱动器,更适应了现代计算机硬件的发展趋势,因为许多新电脑不再配备光驱。下面将...
这个工具的主要功能是将优盘转换为能够引导计算机进入DOS系统的设备,这对于进行系统恢复、老式硬件维护或安装低级别的操作系统非常有用。 DOS,全称Disk Operating System,是磁盘操作系统,是早期个人计算机上...
U盘启动盘制作是指使用专门的工具软件将操作系统安装到U盘中,使其具有启动功能,从而实现移动式的操作系统解决方案。该技术广泛应用于计算机系统的安装、维护和修复等领域。 本次实验报告的主要内容是使用U盘启动...
### 优盘安装操作系统的全攻略 #### 一、引言 随着科技的进步和个人电脑的普及,使用优盘安装操作系统已成为一种便捷且高效的方式。本文将深入探讨如何使用优盘来安装操作系统,包括详细的步骤说明、注意事项以及...
【USB启动Ghost】指的是将Ghost软件集成到U盘启动盘中,使得用户可以直接从U盘启动电脑,然后运行Ghost进行系统备份、恢复或者克隆操作。这对于系统维护人员来说非常实用,因为Ghost可以在不依赖现有操作系统的情况...
在日常工作中,我们经常需要用到U盘启动盘来进行系统的安装、修复或是进行一些特殊的维护操作。而利用U盘启动大师这样的工具可以非常方便地完成这一过程。接下来,我们将详细介绍如何使用U盘启动大师来制作U盘启动盘...
### U盘PE启动安装操作系统的详细指南 在数字化时代,笔记本电脑成为了商务人士与学生群体不可或缺的工具,但随之而来的问题是便携性与性价比之间的矛盾。为了满足那些追求极致便携性的用户需求,市场上出现了大量...
U盘启动是一种便捷的系统安装或修复方法,它允许用户将系统镜像文件存储在U盘上,通过设置电脑从U盘启动,进行系统的安装或故障排查。本教程将详细解释如何设置U盘启动,特别针对特定型号的电脑,但请注意,不同电脑...
第一步 让你的U盘启动DOS 格式化软件有很多种 USBOOT HPUSBFW FIASHBOOT是用的最多的三种 HPUSBFW作的HDD启动盘兼容性最好/Flahboot作的ZIp启动盘最好 我比较喜欢用Flashboot 因为启动后盘符为A: 打开FLASHBOOT ...
### Linux制作UEFI启动的系统盘U盘知识点详解 #### 一、背景介绍与预备知识 在当前的技术环境中,UEFI (Unified Extensible Firmware Interface) 已经成为现代计算机硬件的标准固件接口,逐渐取代了传统的BIOS。...
U盘安装龙芯服务器操作系统B20的两种方法 在本文中,我们将讨论如何使用U盘安装龙芯服务器操作系统B20的两种方法。首先,我们需要了解龙芯服务器操作系统的镜像文件和U盘的相关信息。 龙芯服务器操作系统镜像文件 ...