zoukankan      html  css  js  c++  java
  • 操作系统开发系列—9.Loader

    一个操作系统从开机到开始运行,大致经历“引导—>加载内核入内存—>跳入保护模式—>开始执行内核”这样一个过程。也就是说,在内核开始执行之前不但要加载内核,而且还有准备保护模式等一系列工作,如果全都交给引导扇区来做,512字节很可能是不够用的,所以不妨把这个过程交给另外的模块来完成,我们把这个模块叫做Loader。引导扇区负责把Loader加载入内存并且把控制权交给它,其他工作放心地交给Loader来做,因为它没有512字节的限制,将会灵活得多。

    为了操作方便,把软盘做成FAT12格式。这样对Loader以及今后的Kernel(内核)的操作将会非常简单易行。

    引导扇区是整个软盘的第0个扇区,FAT12格式如下:

    loader源码:

    org	0100h
    
    	mov	ax, 0B800h
    	mov	gs, ax
    	mov	ah, 0Fh				; 0000: 黑底    1111: 白字
    	mov	al, 'L'
    	mov	[gs:((80 * 0 + 39) * 2)], ax	; 屏幕第 0 行, 第 39 列
    
    	jmp	$				; 到此停住
    

    然后执行命令

    nasm boot.asm -o boot.bin

    nasm loader.asm -o loader.bin

    先用bximage生成一个软盘映像,然后在linx下这样做,因为我的linux里只有/mnt/hgfs/

    dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc

    sudo mount -o loop a.img /mnt/hgfs/

    sudo cp loader.bin /mnt/hgfs/ -v

    sudo umount /mnt/hgfs/

    运行结果如下:

    看到了字符“L”。

    如果把前面学习的时钟中断程序按照上面的方法来运行也可以,如下

    可以在虚拟机上运行,说明已经突破了512字节限制。

    那么现在我们假设已经有了一个内核,Loader肯定要加载它入内存,而且内核开始执行的时候肯定已经在保护模式下了,所以,Loader要做的事情至少有两件:

    1.加载内核入内存

    2.跳入保护模式

    一个码农的日常 

    源码

  • 相关阅读:
    重踏学习Java路上_Day04(java 基础上,选择结构,循环结构,转跳)
    重踏学习Java路上_Day03(java 基础上,运算符,IF等)
    float数据在内存中是怎么存储的
    PL/SQL Developer使用技巧(转)
    【Hibernate】总结(二)(转)
    SessionFactory.getCurrentSession与openSession的区别(转)
    解决"No CurrentSessionContext configured"错误(转)
    彻底删除db2(转)
    JPA与Hibernate(转)
    【Hibernate】概述(一)
  • 原文地址:https://www.cnblogs.com/joey-hua/p/5392376.html
Copyright © 2011-2022 走看看