标签:结束 bio boot entry 系统 跳转 linux lin init
</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
这个时候。開始载入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
标签:结束 bio boot entry 系统 跳转 linux lin init
原文地址:http://www.cnblogs.com/jzdwajue/p/6895928.html