bootsect

*/-->

pre.src {background-color: Black; color: White;}

bootsect

全局变量
SYSSIZE = 0x3000 # nr of clicks (16 bytes) to be loaded. 0x3000 is 0x30000 bytes = 196kB
SETUPLEN = 4 # nr of setup-sectors setup.s
SETUPSEG = 0x9020 # setup starts here setup.s
BOOTSEG = 0x07c0 # original address of boot-sector bootsect 一开始的位置
INITSEG = 0x9000 # we move boot here - out of the way bootsect 后来的位置
SYSSEG = 0x1000 # system loaded at 0x10000 (65536) kernel 被加载的位置
ENDSEG = SYSSEG + SYSSIZE # where to stop loading kernel 的终止位置
ROOTDEV = 0x306 # 根文件系统设备 设置为第二个硬盘第一个分区

为什么要移动 bootsect.s 到别的地方:因为加载 bootsect.s 后,BIOS 还会继续提取 系统数据,如果不移动会覆盖 bootsect 所在的部分区域

实模式下的内存规划

bootsect 要完成的功能有:

  1. 复制自己 bootsect.s 的内容从 0x07C00 到 0x9000
  2. 使用 jmpi go, INITSEG 指令,使 CS 指向内存 0x9000 (INITSEG),IP 指向 go 标签对应的指令
  3. 调整因为复制自己之后,所改变的 ds,ex 寄存器的值
  4. 在 0x9000 开一个栈,栈底是 0xFF00,也就是 位于 0x9FF00
  5. 加载 setup

    load_setup:
         mov     dx,#0x0000              ! drive 0, head 0
         mov     cx,#0x0002              ! sector 2, track 0
         mov     bx,#0x0200              ! address = 512, in INITSEG
         mov     ax,#0x0200+SETUPLEN     ! service 2, nr of sectors
         int     0x13                    ! read it
         jnc     ok_load_setup           ! ok - continue
         mov     dx,#0x0000
         mov     ax,#0x0000              ! reset the diskette
         int     0x13
         j       load_setup
    
  6. 加载 system 模块
时间: 2024-10-10 21:28:13

bootsect的相关文章

bootsect.s

1 ! 2 ! SYS_SIZE is the number of clicks (16 bytes) to be loaded. 3 ! 0x3000 is 0x30000 bytes = 196kB, more than enough for current 4 ! versions of linux 5 ! 6 SYSSIZE = 0x3000 7 ! 8 ! bootsect.s (C) 1991 Linus Torvalds 9 ! 10 ! bootsect.s is loaded

bootsect及setup

BIOS和bootsect CPU加电即进入16位实模式 硬件逻辑设计为加电瞬间强行设置:CS=0xF000,IP=0xFFF0,CS:IP=0xFFFF0 而BIOS程序的入口地址即0xFFFF0,是计算机上电后CPU执行的第一条指令的地址 BIOS程序在内存中加载中断向量表和中断服务程序 调用INT 0x19中断,将软盘第一扇区(0面0磁道1扇区)的512字节即bootsect.s加载到内存0x07C00处 bootsect.s将自身复制到0x90000~0x90200,ds:si -> e

操作系统开发之——一个简单的Bootsect

先吓唬一下读者朋友呵呵,直接发代码:(这是UOS操作系统的Bootsect)(有兴趣的朋友能够增加我们,联系方式在最后) ;------------------------------ ;文件名称:Bootsect.asm ;文件创建者:@Imcjy ;文件參与编辑者:@Imcjy ;文件编码:UTF-8 ;状态:O ;Build:3 ;文件创建日期:2015年7月24日 ;文件最后改动日期:2015年8月12日 ;备注:本文件为Nasm ;凝视等级:LV2 ;-----------------

linux0.12内核bootsect.S

这个文件就是0.12内核的主引导扇区代码,他的作用就是加载操作系统内核. 计算机加电,自检完毕后,BOIS就将启动设备的第一扇区加载到内存0x7c00(31KB)处,并开始从这里执行,若启动设备是硬盘的话,加载的即为该硬盘0磁道0柱面1扇区的内容,共512字节,以0xAA55为结束标志,这就是硬盘的MBR(master boot recorder). linux0.12内核bootsect.S中的代码编译后,将会写入启动设备的MBR中,它的主要工作加载操作系统内核的初始化程序setup.S和操作

Linux内核0.11 bootsect文件说明

一.总体功能介绍 这是关于Linux-kernel-0.11中boot文件夹下bootsect.s源文件的说明,其中涉及到了一些基础知识可以参考这两篇文章. 操作系统启动过程 软盘相关知识和通过BIOS中断访问软盘 bootsect.s 代码是磁盘引导块程序,存储在磁盘的第一个扇区中(0面0道1扇区),在计算机上电BIOS自检后,BIOS 会吧引导扇区代码bootsect加载到内存0x90000处开并运行. bootsect代码主要完成以下几项工作: 加载从磁盘第二个扇区开始的4个扇区的内容(由

linux学习(一)--启动文件bootsect.s

 这是linux由BIOS加载后执行的第一段的启动程序代码,即文件 boot/bootsect.s 1 .globl begtext, begdata, begbss, endtext, enddata, endbss 2 .text 3 begtext: 4 .data 5 begdata: 6 .bss 7 begbss: 8 .text 9 10 //规划内存,由BIOS执行 11 SETUPLEN = 4 ! nr of setup-sectors 12 BOOTSEG = 0x07c0

linux0.11的bootsect.s和setup.s

 1.计算机的启动 1.首先计算机的工作原理可以简单的概述为取指,执行:再取指,再执行:以此类推的过程,cpu就是一个不停取指执行不会休息的机器.  2.那么x86结构的计算机上电后是是怎么工作的呢?其实上电后(未加载操作系统代码之前)会先执行内存中一段为BIOS固化的区域,这段区域是每次开机都必须执行的,正常情况下不被我们所控,主要作用是对一些硬件环境做出检测,是否有硬件损坏.这段期间cpu处在实模式下工作.在BIOS代码执行完毕后,cpu会去磁盘的0磁道0扇区读取512字节到内存地址的0x7

操作系统--第一模块 bootsect.s

---------------------- 操作系统的第一段代码是 汇编代码,而不是C代码.C代码需要编译.编译中会产生很多乱七八糟的代码,int  i 也不可以控制在内存中的位置.而汇编语言可以. DS:SI    ES:DI  段寄存器一个是形不成地址的   rep movw 移动字,移动256个字,也就是512个字节,是把7C00处的代码移动到9W这个位置.腾出这段空间. jmpi    表示把go--->ip ,  INSERT--->CS BIOS  10 号中断. 在屏幕 rea

调试bootsect和setup和head到main

<bochs:1> b 0x0:0x7c00 <bochs:2> c (0) Breakpoint 1, 0x7c00 in ?? () Next at t=16165613 (0) [0x00007c00] 0000:7c00 (unk. ctxt): mov ax, 0x7c0             ; b8c007 <bochs:3> b 0x90200 <bochs:4> c (0) Breakpoint 2, 0x90200 in ?? () N