• linux0.11学习笔记技术铺垫简单AB任务切换程序(1)实现一个简单的bootloader


    直接看代码,即使已经理解了代码,但是还是会有种没有学到手的感觉.真正的掌握来自实践,来自己动手做出来.“简单AB任务切换程序”系列文章的目的是,在bochs下,实践出简单AB两个任务的切换.

    1. bochs安装或者编译参考

    Ubuntu10.04搭建linux-0.11编译环境(1.bochs安装和使用)

    Ubuntu10.04搭建linux-0.11编译环境(2.bochs编译)

    2. 实现一个最简单的bootloader

    (1)bootloader,顾名思义boot + loader,我们现在只实现boot,loader其实就是简单bios中断调用,后面接触.

    (2)此处使用汇编语言,汇编和连接器分别为as86和ld86,ubuntu下sudo apt-get install bin86即可

    (3)代码boot.s

    .globl begtext,begdata,begbss,endtext,enddata,endbss                                                                                    
    .text
    begtext:
    .data
    begdata:
    .bss
    begbss:
    .text
    BOOTSEG = 0x07c0

    entry start
    start:
        jmpi go,BOOTSEG

    go:
        mov ax,cs
        mov ds,ax
        mov es,ax

        mov ax,#0x0600
        mov cx,#0x0000
        mov dx,#0xFFFF
        int 0x10

        mov cx,#20
        mov dx,#0x0000
        mov bx,#0x000c
        mov bp,#msg1
        mov ax,#0x1301
        int 0x10

    loop0: jmp loop0

    msg1: .ascii "Loading system ..."
          .byte 13,10

    .org 510
        .word 0xAA55

    (4)分析

    .globl begtext,begdata,begbss,endtext,enddata,endbss                                                                                    
    .text
    begtext:
    .data
    begdata:
    .bss
    begbss:
    .text

    以上几句告诉汇编器和连接器要声明的全局符号,同时说明程序的所有段都从一个基地址开始.

    BOOTSEG = 0x07c0

    entry start
    start:
        jmpi go,BOOTSEG

    go:

    entry start告诉汇编器程序的入口是start符号

    因为我们这段是引导代码,引导代码在引导盘的指定位置处,bios会默认读出来放到内存0x7c00:0x0处,所以所有的段基地址其实都是0x7c00.

    jmpi do,BOOTSEG是跳转到0x7c00:go处执行,go其实是个相对当前jmpi do,BOOTSEG这条指令的一个偏移,假设是5,这句话其实是跳到了0x7c00:0x5处执行,同时一个作用是隐含地设置了cs为0x7c00,这句话可以不用直接替换后边的mov ax,cs:

    mov ax,#BOOTSEG或者mov ax,0x7c00

        mov ax,cs
        mov ds,ax
        mov es,ax

    以上几句设置了ds和es段与cs保持相同,因为程序中声明了代码数据附加段都是一个基地址的

        mov ax,#0x0600
        mov cx,#0x0000
        mov dx,#0xFFFF
        int 0x10

    以上几句调用bios的0x10中断,清屏.关于bios中断不用了解许多,知道用法能查手册即可,手册网络上有很多.

        mov cx,#20
        mov dx,#0x0000
        mov bx,#0x000c
        mov bp,#msg1
        mov ax,#0x1301
        int 0x10

    以上几句调用了bios的0x10中断,显示一个字符串msg1

    loop0: jmp loop0

    看以看出来是无限循环

    msg1: .ascii "Loading system ..."
          .byte 13,10

    定义字符串

    .org 510
        .word 0xAA55

    在510位置后定义0xAA55,启动扇区标志.

    3.编译调试bootloader

    前边说过使用的as86汇编器和ld86连接器,使用bochs模拟器.

    bochs支持虚拟的软盘和硬盘,因为软盘简单一些,所以我们把程序编译后少些到软盘上即可启动了.

    (1)编译boot.s

    as86 -0 -a -o boot.o boot.s

    boot.s是源码,boot.o是编译输出

    (2)链接boot.o

    ld86 -0 -s -o boot boot.o

    boot.o是(1)的输出,boot是链接输出

    (3)制作虚拟软盘

    dd bs=32 if=boot of=boot.img skip=1

    因为boot前32字节是文件头,所以要跳过不写,把后边的所有内容写进boot.img

    至此boot.img就是做好的可启动的虚拟软盘了


    4. 运行与bochs调试

    (1)bochs配置

    bochs配置文件bochsrc.txt如下:

      config_interface: textconfig

      romimage: file=/usr/local/share/bochs/BIOS-bochs-latest 

      megs: 16

      vgaromimage: file=/usr/local/share/bochs/VGABIOS-lgpl-latest

      floppya: 1_44="boot.img", status=inserted

      boot: a

      vga_update_interval: 300000

      keyboard_paste_delay: 100000

      keyboard_serial_delay: 200

      cpu: count=1, ips=1000000

      mouse: enabled=0

      private_colormap: enabled=0

      fullscreen: enabled=0

      screenmode: name="sample"

      i440fxsupport: enabled=0

    (2)运行

    当前目录下执行bochs

    (3)bochs调试命令

    c - 继续

    pb 0x7c00 - 在0x7c00处设置断点

    n - 执行下一步

    u 0x10000 - 反汇编0x10000区域


    本文完.

  • 相关阅读:
    获取发布的头条的url,避免点击打开新的页面
    下载图片 保存至本地 返回路径
    线程运行的3个状态
    程序并发执行所需付出的时空开销
    web metrics dashboard 数据分析工具 看板 从可视化发现问题 避免sql重复写 调高效率
    Binary safe
    simple dynamic string
    a
    a
    从业务角度 减少代码执行的时间 和 因长时间执行的而带来的代码复杂性 日志恢复数据
  • 原文地址:https://www.cnblogs.com/linucos/p/2428262.html
Copyright © 2020-2023  润新知