前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux源码学习笔记day4 操作系统怎么把自己弄到内存里的?

Linux源码学习笔记day4 操作系统怎么把自己弄到内存里的?

作者头像
用户1072003
发布2023-02-23 17:07:26
1.1K0
发布2023-02-23 17:07:26
举报
文章被收录于专栏:码上读书码上读书

上次已经学到了 CPU为访问内存做好了准备,把一些重要寄存器的值都设置好了。

今天我们主要一起学习,操作系统是如何把自己从硬盘给弄到内存里的?

现在的状态已经把ds,es,cs设置好了,从CPU的角度看,已经知道如何访问内存了。

其它的操作系统代码

我们接着看下面的代码

代码语言:javascript
复制
load_setup:
	mov	$0x0000, %dx		# drive 0, head 0
	mov	$0x0002, %cx		# sector 2, track 0
	mov	$0x0200, %bx		# address = 512, in INITSEG
	.equ    AX, 0x0200+SETUPLEN
	mov     $AX, %ax		# service 2, nr of sectors
	int	$0x13			# read it
	jnc	ok_load_setup		# ok - continue
	mov	$0x0000, %dx
	mov	$0x0000, %ax		# reset the diskette
	int	$0x13
	jmp	load_setup

这里除了mov 和 jmp,还有一种新的指令:int。 这个int 指令是代表中断, int 0x13 就是 发起0x13号中断

中断之前 先把ax,bx,cx,dx 这四个寄存器都赋上值了。 因为中断程序需要这四个寄存器作为参数。 还有另一种传参方式,通过栈来传递参数。

所谓中断,就是打断原有的指令执行的顺序,让我们去处理这个中断信息,上面这个案例是13号中断,那13号中断程序的段地址和偏移量怎么获得呢?又需要到中断向量表里来查找。

具体可以查看 《汇编语言》

好,简单介绍了中断后,我们继续回到代码上来看。 发起13号中断后,就会去中断向量表找到13号中断程序的地址,然后跳转过去执行,感觉有点像执行一个函数

13号中断程序是BIOS写好的,就是读取硬盘的函数。随着我们阅读越来越多的代码,也会接触到更多的中断程序,各模块会注册自己的中断处理程序。

结合注释看出这段代码的作用: 从硬盘的第2个扇区开始,把数据加载到内存的0x90200处(正好跳过 上一节说的那512个字节),加载4个扇区。

大致如下图所示:

这里可能是加载古老的软盘的逻辑,因为软盘早已消失在历史的长河里了,所以就当作硬盘来看吧!

再往下看就是2个跳转指令jnc和jmp。 成功了就跳转到 ok_load_setup 去执行。 失败的话就继续跳转到 load_setup 标签执行,就是失败重试。

那我们接着看成功的逻辑

代码语言:javascript
复制
	.equ SETUPSEG, 0x9020		# setup starts here
	.equ SYSSEG, 0x1000		# system loaded at 0x10000 (65536).

ok_load_setup:
    ……
	mov	$SYSSEG, %ax
	mov	%ax, %es		# segment of 0x010000
	call	read_it
	call	kill_motor
    ……
    ljmp	$SETUPSEG, $0

这里只留下了几行核心逻辑的代码。 就是从 把硬盘的第6个扇区到240个扇区,加载到内存0x10000处。 和上面从硬盘复制是一样的。

等操作系统的代码都加载到内存中后, 又通过ljmp 0x9020,0 跳转到0x90200处,也就是第二扇区开始的地方。

这里的内容就是 setup.s 这个文件了。

编译过程

在看setup.s之前,先回顾下操作系统的编译过程: 通过Makefile和build.c达到这样的目的:

  1. 把bootsect.s编译成bootsect 并放到硬盘的1扇区。
  2. 把setup.s编译成setup并放到硬盘2-5扇区。
  3. 把剩下的代码编译成system,并放在硬盘的随后的240个扇区。
  1. 我们接下来要看的0x90200处的代码就是第二扇区的setup二进制文件的内容。 期待下一次与你一起揭开setup.s的神秘面纱。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-02-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码上读书 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 其它的操作系统代码
  • 编译过程
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档