码迷,mamicode.com
首页 > 系统相关 > 详细

linux内核设计的艺术--载入内核代码

时间:2017-05-23 21:51:16      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:结束   bio   boot   entry   系统   跳转   linux   lin   init   

在BIOS触发0x19中断将磁盘的第一个扇区(512B)载入到内存中后。计算机才真正開始运行磁盘上的程序。而这512B的程序就是bootsect.s,此时处理器还处于实模式内存寻址的最大范围是1M(0x0000-0xFFFF),接下来我们看看在bootsect.s的第一批代码中做了些什么?

</pre><pre name="code" class="cpp">SYSSIZE = 0x3000                        //内核程序的大小
SETUPLEN = 4				//要载入的setup程序长度单位为扇区数
BOOTSEG  = 0x07c0			//启动扇区被BIOS载入的位置,也就是如今所在的位置
INITSEG  = 0x9000			//bootsect.s即将移动到的位置
SETUPSEG = 0x9020			//setup程序要被载入的開始位置
SYSSEG   = 0x1000			//kernel载入的起始位置
ENDSEG   = SYSSEG + SYSSIZE		//kernel的结束位置
ROOT_DEV = 0x306                        //根文件系统的设备号


上述代码声明了给一系列变量赋值,用于内存规划

</pre><pre name="code" class="cpp">entry start
start:
	mov	ax,#BOOTSEG             //
	mov	ds,ax                   //
	mov	ax,#INITSEG             //这段代码是将bootsect的代码从0x07C0
	mov	es,ax                   //拷贝到0x9020处
	mov	cx,#256                 //
	sub	si,si                   //
	sub	di,di                   //
	rep                             //
        movw                            //

</pre>由于在后面的程序中,bootsect之前所在的位置会被其它程序覆盖。所以须要将bootsect程序的位置移动至0x90200处<p></p><p></p><p>复制完毕之后。紧接着运行</p><p></p><pre code_snippet_id="403621" snippet_file_name="blog_20140623_7_6144482" name="code" class="cpp">	jmpi	go,INITSEG
go:	mov	ax,cs
	mov	ds,ax


这句指令的意思是,跳转到新复制的bootsect处的go继续运行

这个时候。開始载入setup(setup.s)程序到内存中了

还是老样子,载入setup,仅仅只是这次通过寄存器指定了一系列信息方便中断服务程序訪问磁盘


load_setup:
	mov	dx,#0x0000		//指定磁头为第0个
	mov	cx,#0x0002		//指定在第2个扇区。第0个磁道
	mov	bx,#0x0200		//setup在磁盘中的物理地址
	mov	ax,#0x0200+SETUPLEN	//指定结束的位置
	int	0x13			//中断读取磁盘
	jnc	ok_load_setup		//载入完毕,运行ok_load_setup
	mov	dx,#0x0000
	mov	ax,#0x0000		//重置磁盘
	int	0x13
	j	load_setup


然后调用read_it载入system也就是kernel模块了

	mov	ax,#SYSSEG      //指定system模块载入在内存中的位置
	mov	es,ax		
	call	read_it
	call	kill_motor


到了这一步。bootsect的工作也就算完毕了。这时候,内核的代码已经载入到了内存中,可是在离直接运行内核程序的时候另一段路要走,下一篇将介绍怎样为内核代码运行做准备

linux内核设计的艺术--载入内核代码

标签:结束   bio   boot   entry   系统   跳转   linux   lin   init   

原文地址:http://www.cnblogs.com/jzdwajue/p/6895928.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!