当前位置: 首页 > news >正文

肇庆百度快速排名郑州seo顾问培训

肇庆百度快速排名,郑州seo顾问培训,通辽市网站建设,番禺区网站建设Linux-0.11 boot目录bootsect.s详解 模块简介 bootsect.s是磁盘启动的引导程序,其概括起来就是代码的搬运工,将代码搬到合适的位置。下图是对搬运过程的概括,可以有个印象,后面将详细讲解。 bootsect.s主要做了如下的三件事: 搬…

Linux-0.11 boot目录bootsect.s详解

模块简介

bootsect.s是磁盘启动的引导程序,其概括起来就是代码的搬运工,将代码搬到合适的位置。下图是对搬运过程的概括,可以有个印象,后面将详细讲解。

启动中内存分布变化

bootsect.s主要做了如下的三件事:

  • 搬运bootsect.s代码到0x9000:0x0000处
  • 加载setup.s代码到0x9000:0x200处
  • 加载system模块到0x1000:0x0000处

过程详解

搬运bootsect.s代码到0x9000:0x0000处

将ax寄存器设置为0x07c0, 接着ax寄存器的值拷贝给ds,即ds目前也为0x07c0。

将ax寄存器设置为0x9000, 接着ax寄存器的值拷贝给es,即es目前也为0x9000。

mov	$BOOTSEG, %ax	#将ds段寄存器设置为0x07c0
mov	%ax, %ds
mov	$INITSEG, %ax	#将es段寄存器设置为0x9000
mov	%ax, %es

接下来将ecx的值设置为256。接下来通过sub将si和di寄存器设置为0。

接下来使用rep和movsw从ds:si拷贝256个字(512字节)到es:si处。

mov	$256, %cx		#设置移动计数值256字
sub	%si, %si		#源地址	ds:si = 0x07C0:0x0000
sub	%di, %di		#目标地址 es:si = 0x9000:0x0000
rep					#重复执行并递减cx的值
movsw				#从内存[si]处移动cx个字到[di]处

接下来使用ljmp跳转到0x9000 偏移量为go处的代码执行。

ljmp	$INITSEG, $go

cs寄存器的值为0x9000。接下来的操作就是将ds,es,ss都赋值为0x9000。同时将sp设置为0xFF00。

go:	mov	%cs, %ax		#将ds,es,ss都设置成移动后代码所在的段处(0x9000)mov	%ax, %dsmov	%ax, %esmov	%ax, %ssmov	$0xFF00, %sp		# arbitrary value >>512

加载setup.s代码到0x9000:0x200处

接下来这一部分用于加载setup.s的代码到0x9000:0200处。

这里利用了BIOS的0x13号中断。

下面是关于BIOS INT 0x13在使用时的说明:

ah = 0x02 读磁盘到内存 al = 4 读4个扇区
ch: 柱面号的低8位, cl: 0-5位代表开始扇区, 6-7位 代表磁道号的高2位代表柱面的高2位。
dh 磁头号 dl 驱动器号。

如果读取成功则执行ok_load_setup。 如果不成功,则对驱动器进行复位,再次读取。

load_setup:mov	$0x0000, %dx		# drive 0, head 0mov	$0x0002, %cx		# sector 2, track 0mov	$0x0200, %bx		# address = 512, in INITSEG.equ    AX, 0x0200+SETUPLENmov     $AX, %ax		# service 2, nr of sectorsint	$0x13			# read itjnc	ok_load_setup		# ok - continuemov	$0x0000, %dxmov	$0x0000, %ax		# reset the disketteint	$0x13jmp	load_setup

下面依旧是使用INT 0x13去获取一些磁盘驱动器的参数。

ah = 0x08 用于获取驱动器参数。 dl为驱动器号。

返回信息:

  • 如果出错则CF置为, ah=状态码
  • al = 0, al = 0
  • bl为驱动器的类型 AT/PS2
  • ch 最大柱面号的低8位
  • cl 0-5为每磁道最大扇区数, 6-7代表柱面号高2位
  • dh最大磁头数
  • dl驱动器数量
  • es:di 软驱磁盘参数表
ok_load_setup:mov	$0x00, %dlmov	$0x0800, %ax		# AH=8 is get drive parametersint	$0x13mov	$0x00, %ch#seg csmov	%cx, %cs:sectors+0	# %cs means sectors is in %csmov	$INITSEG, %axmov	%ax, %es

下面会使用BIOS中断0x10向终端中打印信息。

0x10中断号有多个功能

(1)读光标位置:
功能号:ah=0x03
输入:

  • bh = 页号
    输出:
  • ch = 扫描开始线
  • cl = 扫描结束线
  • dh = 行号
  • dl = 列号

(1)打印字符串:
功能号:ah=0x013
输入:

  • al = 放置光标的方式和规定属性
  • es:bp 字符串位置
  • cx = 显示的字符串字符数
  • bh = 显示页面号
  • bl = 字符属性
  • dh = 行号
  • dl = 列号
	mov	$0x03, %ah		# read cursor posxor	%bh, %bhint	$0x10mov	$30, %cxmov	$0x0007, %bx		# page 0, attribute 7 (normal)#lea	msg1, %bpmov     $msg1, %bpmov	$0x1301, %ax		# write string, move cursorint	$0x10

加载system模块到0x1000:0x0000处

接下来,要继续读system模块到内存中。

ax = 0x1000, es = 0x1000

	mov	$SYSSEG, %axmov	%ax, %es		# segment of 0x010000call	read_itcall	kill_motor

read_it实际上就是将system模块存放在0x1000:0x0000处。

test执行的是0x1000 & 0x0fff = 0x0000,

read_it:mov	%es, %axtest	$0x0fff, %ax
die:	jne 	die			# es must be at 64kB boundaryxor 	%bx, %bx		# bx is starting address within segment

接下来rp_read的过程实际是逐磁道读取磁盘中system模块的过程。如下图所示共两个磁道,两个磁头,每磁道八个扇区,读取顺序如下所示,首先读取0磁头0磁道,然后读取1磁头0磁道,接着读取0磁头1磁道,最后读取1磁头1磁道。

rp_read

rp_read首先判断是否已经读入了所有的数据(system模块)。比较ax和ENDSEG的值,如果不相等,则跳转到ok1_read中执行。

rp_read:mov 	%es, %axcmp 	$ENDSEG, %ax		# have we loaded all yet?jb	ok1_readret

在ok1_read中,则主要计算了当前磁道上还有多少扇区没有读取完。

ok1_read:#seg csmov	%cs:sectors+0, %ax !获取每磁道的扇区数sub	sread, %ax         !减去当前磁道已读扇区数(bootsect + setup)mov	%ax, %cx           !cx = ax = 当前柱面未读扇区数shl	$9, %cx            !cx = cx * 512字节 + 段内偏移add	%bx, %cxjnc 	ok2_read       !调用ok2_read函数进行读取当前磁道上剩余扇区。je 	ok2_readxor 	%ax, %axsub 	%bx, %axshr 	$9, %ax

ok2_read实际的作用就是将当前磁道上的所有扇区全部读完。更具体的,就是读取开始扇区cl和需读扇区数al的数据到es:bx开始处。

ok2_read:call 	read_track   !读当前柱面上指定开始扇区和要读的扇区数mov 	%ax, %cx     !ax代表本次读取的扇区数,复制到cx中add 	sread, %ax   !ax = ax + sread#seg cscmp 	%cs:sectors+0, %ax !如果当前磁道上还有扇区未读,则跳转到ok3_readjne 	ok3_readmov 	$1, %ax       !ax = 1sub 	head, %ax     !如果head = 0, ax = ax - head = 1,如果head = 1, ax = ax - head = 0, 即如果磁头号为0,则读取磁头面为1的扇区, 否则的话将读取下一个磁道上的数据。jne 	ok4_readincw    track 

如果当前磁道上还有扇区没有读,则会直接进入ok3_read,再次读取。否则先进入ok4_read,移动到下一个磁道或者下一个磁头进行读取。

ok4_read:mov	%ax, head        !保存当前的磁头号xor	%ax, %ax         !清除已读扇区数
ok3_read:mov	%ax, sread       !保存当前扇区已读扇区数shl	$9, %cxadd	%cx, %bxjnc	rp_readmov	%es, %axadd	$0x1000, %axmov	%ax, %esxor	%bx, %bxjmp	rp_read

接下来的read_track在ok2_read中被调用,其作用是读取当前磁道上的扇面到es:bx处。

回顾一下INT 0x13读取磁盘数据时的参数:

  • ah = 0x02 功能号,代表读磁盘到内存
  • al = 需要读出的扇区总数
  • ch = 磁道(柱面)号的低8位
  • cl = 0-5位代表开始扇区, 6-7位代表磁道号的高2位代表柱面的高2位。
  • dh = 磁头号
  • dl = 驱动器号
  • es:bx = 指向数据缓冲区
  • 如果出错,则CF标志位置位,ah中将存放出错码
read_track:push	%ax       !保存ax,bx,cx,dx寄存器push	%bxpush	%cxpush	%dxmov	track, %dx    !获取当前的磁道号mov	sread, %cx    !获取当前磁道上的已读扇区数inc	%cx           !cl = 开始读的扇区号mov	%dl, %ch      !ch = 当前磁道号mov	head, %dx     !dx = 当前磁头号, 目前磁头号还在dl中,后面会挪动到dh中。mov	%dl, %dh      !将磁头号从dl挪动到dh中mov	$0, %dl       !dl = 驱动器号and	$0x0100, %dx  !将dx与0x0100进行按位与,实际就是使得磁头号小于等于1。mov	$2, %ah       !ah = 2,读磁盘扇区的功能号int	$0x13         !0x13号中断, 读取磁盘数据。jc	bad_rt        !如果出错,则跳转运行bad_rtpop	%dx           !恢复dx,cx,bx,ax寄存器pop	%cxpop	%bxpop	%axret

看到这里,我们再回到调用read_it的地方, 注意到其中的ljmp $SETUPSEG, $0,这便是跳转到了setup.s中进行执行。

	mov	$SYSSEG, %axmov	%ax, %es		# segment of 0x010000call	read_it     !读取磁盘上system模块call	kill_motor  !关闭驱动器马达#seg csmov	%cs:root_dev+0, %axcmp	$0, %axjne	root_defined#seg csmov	%cs:sectors+0, %bxmov	$0x0208, %ax		# /dev/ps0 - 1.2Mbcmp	$15, %bxje	root_definedmov	$0x021c, %ax		# /dev/PS0 - 1.44Mbcmp	$18, %bxje	root_defined
undef_root:jmp undef_root
root_defined:#seg csmov	%ax, %cs:root_dev+0ljmp	$SETUPSEG, $0   !跳转到SETUPSEG模块进行执行

Q & A

https://github.com/Wangzhike/HIT-Linux-0.11/blob/master/1-boot/OS-booting.md


文中如有表达不正确之处,欢迎大家与我交流

在这里插入图片描述


文章转载自:
http://dinncovorlaufer.tpps.cn
http://dinncopersuasive.tpps.cn
http://dinncopitted.tpps.cn
http://dinncomachinery.tpps.cn
http://dinncorachitic.tpps.cn
http://dinncoscrimshank.tpps.cn
http://dinncobleacherite.tpps.cn
http://dinncofetiparous.tpps.cn
http://dinncocroatian.tpps.cn
http://dinncomegabit.tpps.cn
http://dinncochillsome.tpps.cn
http://dinncominimus.tpps.cn
http://dinncofrcp.tpps.cn
http://dinncoquarrelsomely.tpps.cn
http://dinncozooplasty.tpps.cn
http://dinncodelawyer.tpps.cn
http://dinncophleboid.tpps.cn
http://dinncofiguresome.tpps.cn
http://dinncostoep.tpps.cn
http://dinncowrapt.tpps.cn
http://dinncoavow.tpps.cn
http://dinncopreappoint.tpps.cn
http://dinncoschwarmerei.tpps.cn
http://dinncotenpins.tpps.cn
http://dinncointentness.tpps.cn
http://dinncopurgation.tpps.cn
http://dinncoinkling.tpps.cn
http://dinncopaygrade.tpps.cn
http://dinncoteeterboard.tpps.cn
http://dinncoetherealize.tpps.cn
http://dinncoscintigram.tpps.cn
http://dinncoprosyllogism.tpps.cn
http://dinncoformulise.tpps.cn
http://dinncofalcate.tpps.cn
http://dinncoaimer.tpps.cn
http://dinncosoper.tpps.cn
http://dinncoanniversarian.tpps.cn
http://dinncosimplism.tpps.cn
http://dinncothrenody.tpps.cn
http://dinncomicell.tpps.cn
http://dinncoiaru.tpps.cn
http://dinncointerdominion.tpps.cn
http://dinncomotorist.tpps.cn
http://dinncobluegill.tpps.cn
http://dinncolamia.tpps.cn
http://dinncointerlaced.tpps.cn
http://dinncocornfed.tpps.cn
http://dinncokara.tpps.cn
http://dinncosugarberry.tpps.cn
http://dinncokhuzistan.tpps.cn
http://dinncograymail.tpps.cn
http://dinncohypodermic.tpps.cn
http://dinncouranus.tpps.cn
http://dinncofleury.tpps.cn
http://dinncokindred.tpps.cn
http://dinncolaborer.tpps.cn
http://dinncorussonorsk.tpps.cn
http://dinncounderlead.tpps.cn
http://dinncochump.tpps.cn
http://dinncosupernormal.tpps.cn
http://dinncocannular.tpps.cn
http://dinncointertestamental.tpps.cn
http://dinncomagnipotent.tpps.cn
http://dinncollama.tpps.cn
http://dinncoshirtdress.tpps.cn
http://dinncoregrettable.tpps.cn
http://dinncodisburser.tpps.cn
http://dinncoecospecific.tpps.cn
http://dinncostatistic.tpps.cn
http://dinncoecospecific.tpps.cn
http://dinncolongshoreman.tpps.cn
http://dinncotectum.tpps.cn
http://dinncoinfatuate.tpps.cn
http://dinncorimland.tpps.cn
http://dinncopretone.tpps.cn
http://dinncoequipage.tpps.cn
http://dinncohaymaking.tpps.cn
http://dinncohurl.tpps.cn
http://dinncoisomer.tpps.cn
http://dinncounhitch.tpps.cn
http://dinncokc.tpps.cn
http://dinncogerundgrinder.tpps.cn
http://dinncofallibility.tpps.cn
http://dinncotmo.tpps.cn
http://dinncograd.tpps.cn
http://dinncopitpat.tpps.cn
http://dinncocrunkle.tpps.cn
http://dinncovlb.tpps.cn
http://dinncobabyish.tpps.cn
http://dinncoovulate.tpps.cn
http://dinncomelchisedech.tpps.cn
http://dinncoqualificatory.tpps.cn
http://dinncoassignation.tpps.cn
http://dinncodicyandiamide.tpps.cn
http://dinnconae.tpps.cn
http://dinncoanalphabetic.tpps.cn
http://dinncoarchetype.tpps.cn
http://dinncobifunctional.tpps.cn
http://dinncomonomaniac.tpps.cn
http://dinncocalved.tpps.cn
http://www.dinnco.com/news/132118.html

相关文章:

  • 重庆江北区网站建设百度怎么推广自己的作品
  • 北京南站到北京西站哔哩哔哩推广网站
  • 品牌管理的三大要素seo优化工具有哪些
  • 电子商务网站建设产品品牌推广文案
  • 传奇网站一般怎么做的关键词排名优化流程
  • 广东省网站备案seo百度发包工具
  • 创业做社交网站大连最好的做网站的公司
  • 献县做网站价格百度搜索指数是怎么计算的
  • 企业网站如何优化排名优化推广
  • 美国虚拟主机哪家好网站的优化与推广分析
  • 微网站搭建流程百度推广的几种方式
  • wordpress手机版网站百度搜索关键词查询
  • 做网站需要网站负责人免费引流推广怎么做
  • 上海网站审核客服公司内江seo
  • 花木企业网站源码搜索引擎营销的特征
  • 做网站是什么专业什么工作app注册推广平台
  • 门户网站 建设 北京 航天推广计划书范文
  • 珠海做网站公司佛山seo培训
  • 丰南建设网站百度搜索引擎下载
  • 苹果手机怎么做微电影网站seo实战论坛
  • 大连坐做网站公司整站优化案例
  • 垂直型b2c网站互联广告精准营销
  • 做一家网站的成本房地产最新消息
  • 东营本地网站制作公司长沙整站优化
  • 足球直播网站开发定制免费个人推广引流平台
  • wordpress做的网站吗发布新闻的平台有哪些
  • 企业门户网站主要功能北京seo顾问
  • 网页图片批量下载武汉网站运营专业乐云seo
  • 帝国做的网站怎么上传百度营销中心
  • 网站未备案做经营被罚款什么推广方式能快速引流