b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

技巧:从USB闪存驱动器启动:第四天USB闪存驱动器学习笔记需要30天的自制操作系统

电脑杂谈  发布时间:2020-10-26 14:01:32  来源:网络整理

30天自制操作系统 u盘_30天自制操作系统 u盘

开发环境:ubuntu

关于在U盘上引导自己制作的操作系统的原因:

我认为大多数学习者和OS编写者都有这个想法,为什么现在大多数教程都将软盘用作模拟,而我们的计算机上却没有软盘。最后只能对系统进行仿真,这是没有意义的。能够在真实机器上运行自己编写的系统很有趣。当然,这是我自己的想法。

如果要在真实计算机上运行,​​则需要一台从属计算机(用于实验的另一台计算机),这感觉有点交叉编译。如果从属服务器上有硬盘,则可以将我们开发的系统写到从属计算机的硬盘上,但这很麻烦。每次更改程序并想查看效果时,都需要将该程序放在从属计算机的硬盘上。不太实用。因此,以这种方式考虑,真正开发操作系统的工程师仍应使用,因为它是如此之快。仅当操作系统发生重大变化时,工程师才会将开发的操作系统写入从属设备的硬盘,然后继续。真实机器测试。并且为了确保可以将开发的操作系统文件直接复制到硬盘上,硬盘上应该有一个引导程序,例如grub,您可以直接指定我们操作系统文件的位置,然后可以开始。在这里我也考虑了一下,是否可以使用grub将我们开发了30天的操作系统复制到内存中,然后启动它。但这是以后的研究。也就是说,将grub写入USB闪存驱动器,然后将USB闪存驱动器插入从机,读取我们写入内存的操作系统文件,然后运行它。通过将处理操作系统的工作交给grub之类的引导程序,开发操作系统的人员可以考虑如何将操作系统引导到内存中。因此,当前的操作系统文件(例如elf文件)包含应运行其代码的内存地址。 grub读取内核要运行的位置,然后将代码部分复制到指定的ram地址。

30天自制操作系统 u盘_30天自制操作系统 u盘

对于我们来说,为了学习和玩耍,除非您在家中有完全空闲的计算机,否则显然不可能将开发的操作系统内核写入从计算机的硬盘中。这将使您可以玩耍,包括硬盘驱动器。因此,我们需要从USB磁盘引导我们自己的操作系统的代码30天。它是完全在真实机器上运行的自行编写的代码,感觉有所不同。一个字,很酷。花了一天的时间检查信息,并通过猜测的方式对读取USB磁盘进行了一些实验。最后,可以修改第四天的代码以从USB磁盘启动。在发展和学习的过程中,我深刻感受到了ubuntu的强大和便捷。

以下是从USB闪存驱动器运行的真实计算机的图片:

30天自制操作系统 u盘

以下是从USB闪存驱动器启动的研究过程的一般说明。

30天自制操作系统 u盘_30天自制操作系统 u盘

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字节

30天自制操作系统 u盘_30天自制操作系统 u盘

但是我们的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信息位于这两个寄存器中。

30天自制操作系统 u盘_30天自制操作系统 u盘

30天自制操作系统 u盘

获取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

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...