开发环境:ubuntu
关于在U盘上引导自己制作的操作系统的原因:
我认为大多数学习者和OS编写者都有这个想法,为什么现在大多数教程都将软盘用作模拟,而我们的计算机上却没有软盘。最后只能对系统进行仿真,这是没有意义的。能够在真实机器上运行自己编写的系统很有趣。当然,这是我自己的想法。
如果要在真实计算机上运行,则需要一台从属计算机(用于实验的另一台计算机),这感觉有点交叉编译。如果从属服务器上有硬盘,则可以将我们开发的系统写到从属计算机的硬盘上,但这很麻烦。每次更改程序并想查看效果时,都需要将该程序放在从属计算机的硬盘上。不太实用。因此,以这种方式考虑,真正开发操作系统的工程师仍应使用,因为它是如此之快。仅当操作系统发生重大变化时,工程师才会将开发的操作系统写入从属设备的硬盘,然后继续。真实机器测试。并且为了确保可以将开发的操作系统文件直接复制到硬盘上,硬盘上应该有一个引导程序,例如grub,您可以直接指定我们操作系统文件的位置,然后可以开始。在这里我也考虑了一下,是否可以使用grub将我们开发了30天的操作系统复制到内存中,然后启动它。但这是以后的研究。也就是说,将grub写入USB闪存驱动器,然后将USB闪存驱动器插入从机,读取我们写入内存的操作系统文件,然后运行它。通过将处理操作系统的工作交给grub之类的引导程序,开发操作系统的人员可以考虑如何将操作系统引导到内存中。因此,当前的操作系统文件(例如elf文件)包含应运行其代码的内存地址。 grub读取内核要运行的位置,然后将代码部分复制到指定的ram地址。
对于我们来说,为了学习和玩耍,除非您在家中有完全空闲的计算机,否则显然不可能将开发的操作系统内核写入从计算机的硬盘中。这将使您可以玩耍,包括硬盘驱动器。因此,我们需要从USB磁盘引导我们自己的操作系统的代码30天。它是完全在真实机器上运行的自行编写的代码,感觉有所不同。一个字,很酷。花了一天的时间检查信息,并通过猜测的方式对读取USB磁盘进行了一些实验。最后,可以修改第四天的代码以从USB磁盘启动。在发展和学习的过程中,我深刻感受到了ubuntu的强大和便捷。
以下是从USB闪存驱动器运行的真实计算机的图片:
以下是从USB闪存驱动器启动的研究过程的一般说明。
1:每个人都知道如何从USB闪存驱动器开始,即如何读取USB闪存驱动器。实际上,它类似于读取软盘。 int0x13中断用于读取USB闪存驱动器,但是dl寄存器表示的驱动器编号此时不同。
但是,我们如何知道计算机从USB闪存驱动器启动时的dl =?由于USB闪存驱动器是在软盘之后生成的,因此旧的BIOS计算机不支持从USB闪存驱动器引导。模拟U盘是从硬盘或软盘启动。
但是有一种方法可以知道您的dl =?从USB闪存驱动器引导时,因为将BIOS设置为从USB闪存驱动器引导时,USB闪存驱动器的前512个字节将从0x7c00中复制出来,请注意,此操作将由bios复制将USB闪存驱动器存储到内存中,因此当BIOS将控件交给代码0x7c00时,dl中的值是有效值,这是我们需要从USB闪存驱动器中知道的。因此,我编写了一个512字节的程序,以将寄存器的值显示给监视器。从USB闪存驱动器启动时,BIOS将512字节的程序加载到内存中后,我立即在屏幕上显示dx的值。这样,我们知道dl是什么。仔细考虑之后,只要将其保存在内存中就不需要显示dl,而在读取U盘的后扇区时,则要从内存中读取dl。
2:还有一点,这也很重要。我们知道软盘的大小是如何组织的:80圆柱x 2头x 18扇区x 512字节
但是我们的USB磁盘比软盘具有更大的容量,但是USB磁盘也使用chs查找扇区。所以我们需要知道我们自己的U盘有多少个柱面,磁头,扇区x512bytes
或使用BIOS提供的中断来显示我们的U盘有多少个圆柱,磁头和扇区。中断服务程序为int 0x13 / ah = 0x08。如果要阅读u盘的容量组织
dl分配在第一步中获得的值。然后只需调用int 0x13。 USB闪存驱动器上的chs值存储在寄存器中,因此我编写的用于显示寄存器的程序可以再次使用。调用int 0x13 / ah = 0x08后,您可以根据寄存器的值计算USB闪存驱动器的chs。
我的USB闪存驱动器的信息如下图所示:从下图可以看到,我们主要关心cx和dx寄存器。 USB闪存驱动器的chs信息位于这两个寄存器中。
获取USB闪存驱动器的chs和dl编号以读取USB闪存驱动器。将USB闪存驱动器上的所需内容读取到内存中并不难。只需对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
您可以看到:
因为我的USB闪存驱动器是1014圆柱x 60头x63扇区x512字节,所以我主要更改了cl,dh的这些值,然后将生成的图像dd放在USB闪存驱动器上。享受自己做的乐趣。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/sanxing/article-328785-1.html
台湾如果敢宣布独立