zoukankan      html  css  js  c++  java
  • 一步一步实现一个简单的OS(简单的让boot载入setup)

    这次直接写用boot载入setup模块。

    文件系统就先不弄了,以后再说,

    咱先整个转简单的载入器。

    我把软盘引导改成硬盘了,由于硬盘的读扇区函数简单一些。

    这里没有做硬盘的mbr区,我认为在如今我的这个系统里面,mbr区还不是必须的。

    好了,不废话了,贴代码。

    这个是bootasm.S的代码:


        .globl start
    start:   # 入口地址
        .code16
    
        cld     # 字符串运算方向,(详细的,百度吧,基础)
    
        # 初始化各个段寄存器
        xorw    %ax, %ax
        movw    %ax, %ds
        movw    %ax, %es
        movw    %ax, %ss
    
        movw    $start, %sp
    
        # 保存引导驱动器号
        movb    %dl, (bootdrv)
    
        # 清屏
        movw    $0x02, %ax
        int     $0x10
    
        # 显示信息
        movw    $str, %si
        call    puts
    
        # 读第二个扇区。到内存的0x80000(0x8000:0x0000)处, 两个扇区
        movl    $1, %eax    # 扇区号
        movw    $2, %cx     # 扇区数
        movw    $0x8000, %bx    # buffer 地址
        movw    %bx, %es
        xorw    %bx, %bx
        call    readdisk
    
        # 跳转到刚刚载入到内存中的SETUP模块
        ljmp     $0x8000, $0x0000
    
    #
    # 字符串显示函数(这个网上不少。自己看着理解吧)
    # 输入:
    #       ds:si = 字符串地址
    #
    puts:
        movw     $0x07, %bx
        movb     $0x0E, %ah
    1:
        lodsb
        orb      %al, %al
        jz       1f
        int      $0x10
        jmp      1b
    1:
        ret
    
    #
    # 读磁盘扇区(这个是用0x13的0x42号扩展中断。详细的中断參数,自己百度去吧。。

    。) # # 输入: eax = 要读LBA扇区号 # cx = 扇区数(一次读入的字节数不能大于64KB) # es:bx = 数据缓存区 # readdisk: pushal movb (bootdrv), %dl pushl $0 pushl %eax pushw %es pushw %bx pushw %cx pushw $0x0010 movb $0x42, %ah movw %sp, %si int $0x13 addw $0x10, %sp popal ret bootdrv: # 这个定义了一个byte型的变量,用来保存当前引导驱动器号 .byte 0 str: # 这个是字符串,昨天看linux源代码发现的, .string "in the boot code "


    然后是setupasm.S的代码

        .globl start
    start:   # 入口地址
        .code16
    
        cld     # 字符串运算方向,(详细的,百度吧,基础)
    
        # 初始化各个段寄存器
        movw    %cs, %ax
        movw    %ax, %ds
        movw    %ax, %es
        movw    %ax, %ss
    
        movw    $start, %sp
    
        # 显示信息
        movw    $str, %si
        call    puts
    
        # 死循环,停机
    1:
        hlt
        jmp     1b
    
    #
    # 字符串显示函数
    # 输入:
    #       ds:si = 字符串地址
    #
    puts:
        movw     $0x07, %bx
        movb     $0x0E, %ah
    1:
        lodsb
        orb      %al, %al
        jz       1f
        int      $0x10
        jmp      1b
    1:
        ret
    
    str:
        .string "in the setup code!!!
    
    "
    

    setup模块如今写的非常easy,主要就是用来測试boot的载入代码写的是否正确。

    。。

    下一节会对setup模块进行填充完好,详细做什么功能我想大家也知道了。

    就不多说了。。。。。。

    详细的构建文件和源代码在群里面,我会传上去的。。。。。

  • 相关阅读:
    STM32学习(I2C SPI)
    STM32学习2(GPIO EXTI SYSTICK 通信基本概念)
    STM32学习1(RCC时钟树)
    C语言学习日记8
    C语言学习日记7
    C语言学习日记6
    C语言学习日记5
    C语言学习日记4
    java-课程设计-彩票购买抽奖程序
    java-课程设计-彩票购买抽奖程序(个人部分)
  • 原文地址:https://www.cnblogs.com/llguanli/p/8622847.html
Copyright © 2011-2022 走看看