linux-0.11分析:boot文件 bootsect.s 第一篇随笔

boot文件 bootsect.s 第一篇随笔

参考 [github这个博主的][ https://github.com/sunym1993/flash-linux0.11-talk ]

bootsect.s

开机后会主动把由硬件设置好的主动把第一磁盘扇区212字节的内容读取到内存中

1、boot文件

bootsect.s

  1. 第一段指令代码,只是把开机从磁盘读取的这段bootsect.s代码复制到了另一片区域,还设置了栈顶

    mov	ax,#BOOTSEG		;BOOTSEG  = 0x07c0	
    mov	ds,ax
    mov	ax,#INITSEG		;INITSEG  = 0x9000
    mov	es,ax
    mov	cx,#256
    sub	si,si
    sub	di,di
    rep
    movw	;rep movw字 就是 es:si = ds:di	然后si+1	di+1;这样循环执行256(cx)次,每次移动一个字
    jmpi	go,INITSEG	;INITSEG  = 0x9000
    go:	
    mov	ax,cs
    mov	ds,ax
    mov	es,ax
    
    mov	ss,ax
    mov	sp,#0xFF00		
    

  2. 继续从磁盘加载setup.s这段代码的内容到内存中

    load_setup:
    	mov	dx,#0x0000		; 驱动器0,磁头0
    	mov	cx,#0x0002		; 从扇区2开始读,轨道0
    	mov	bx,#0x0200		; 地址=512,在INITSEG中
    	mov	ax,#0x0200+SETUPLEN	; 服务2,需要读的扇区数量 SETUPLEN = 4
    	int	0x13			; 阅读它
    
  3. 第三步就是把系统的内存读取到内存中,顺便在显屏上打印一下东西

    ok_load_setup:
    
    ; 获取磁盘驱动器参数,特别是扇区/磁道的数量
    	......
    ; 打印msg1处的内容
    	mov	ah,#0x03		; 读取光标位置
    	xor	bh,bh
    	int	0x10
    	mov	cx,#24
    	mov	bx,#0x0007		; 第0页,属性7(正常)
    	mov	bp,#msg1
    	mov	ax,#0x1301		; 写入字符串,移动光标
    	int	0x10
    	
    ; 好的,我们现在已经写了消息
    ; 我们希望加载系统(0x10000)
    	mov	ax,#SYSSEG	; SYSSEG   = 0x1000
    	mov	es,ax		; segment of 0x010000
    	call	read_it
    	call	kill_motor
    	.......
    

  4. bootsect.s主要做了哪些事情了?需要和Makefile和build.c配合完成

posted @ 2022-07-26 22:21  水三丫  阅读(160)  评论(0编辑  收藏  举报