• 【日拱一卒行而不辍20220920】自制操作系统


    13号中断

    功能:读写磁盘的中断调用,将指定扇区的代码加载到内存的指定位置

    int 0x13

    1. AH=0x02----要读磁盘内容到内存
    2. AL=0x04----要读4个扇区
    3. CL=0x02----要读的磁盘扇区从2号扇区开始.
    4. CH=0x00----要读的磁盘扇区所在的柱面号为0
    5. DH=0x00----要读的磁盘扇区所在的磁头号为0
    6. DL=0x00----要读扇区所在的驱动号为0
    7. AH=0x08----可以获得每个磁道的扇区个数
    8. CL低6位----存放每个磁道的扇区个数

    如何把第二个扇区及后续扇区的内容加载入内存并执行?不能是只在第一扇区进行操作了。

    加载第二扇区

    采用如下代码加载第二扇区的代码pmtest2.S。

    1. 1 [BITS 16]
    2. 2 org 0x7C00
    3. 3 start:
    4. 4 ; This section of code is added based on Michael Petch's bootloader tips
    5. 5 xor ax,ax ; 为 DS 置 0 准备
    6. 6 mov ds,ax
    7. 7 mov bx,0x8000 ; 栈段可以是可用内存的任意一段
    8. 8 mov ss,bx ; 栈顶位于 0x80000.
    9. 9 mov sp,ax ; 设置 SP=0 ,使栈底位于 0x90000 下
    10. 10 cld ; 设置 DF 位为正向
    11. 11 mov ah, 0x02
    12. 12 mov al, 1
    13. 13 mov ch, 0
    14. 14 mov cl, 2
    15. 15 mov dh, 0
    16. 16 mov bx, new
    17. 17 mov es, bx
    18. 18 xor bx, bx
    19. 19 int 0x13
    20. 20 jmp new:0
    21. 21 data:
    22. 22 new equ 0x0500
    23. 23 times 510-($-$$) db 0
    24. 24 dw 0xaa55
    25. 25 sect2:
    26. 26 mov ax, cs
    27. 27 mov ds, ax ; 设置 CS=DS. CS=0x0500, 因此 DS=0x500
    28. 28 ; 如果变量已经在代码中设置,则要求
    29. 29 ; 正确地引用其内存地址
    30. 30 mov ax, 0xB800
    31. 31 mov es, ax
    32. 32 mov byte [es:420], 'H'
    33. 33 mov byte [es:421], 0x48
    34. 34 mov byte [es:422], 'E'
    35. 35 mov byte [es:423], 0x68
    36. 36 mov byte [es:424], 'L'
    37. 37 mov byte [es:425], 0x28
    38. 38 mov byte [es:426], 'L'
    39. 39 mov byte [es:427], 0x38
    40. 40 mov byte [es:428], 'O'
    41. 41 mov byte [es:429], 0x18
    42. 42 mov byte [es:430], '!'
    43. 43 mov byte [es:431], 0x58
    44. 44 hlt

    在sect2中,也就是第二扇区中编写了部分演示代码。前两个扇区的二进制文件如下所示。

    shell脚本如下所示runboot.sh,生成两个扇区的虚拟硬盘镜像

    1. 1 #!/bin/bash
    2. 2 rm os.raw
    3. 3 nasm -o boot pmtest2.S
    4. 4 bximage -mode=create -hd=60 -q os.raw
    5. 5 dd if=boot of=os.raw bs=1024 count=1
    6. 6 qemu-system-i386 os.raw

    最终运行结果如下所示,显示了第二扇区的彩色的HELLO!

     

  • 相关阅读:
    第8天:Django Admin高级配置
    设计模式:责任链模式的应用场景及源码应用
    卫语句-前端应用
    数字图像处理——实验三 形态学图像处理实验
    动态规划 八月八日
    burpsuite安装方法(抓包工具)
    ranger的只读(read)权限引起的
    Jetsonnano B01 笔记1:基础理解—网络配置—远程连接
    微信小程序前端生成动态海报图
    1524_AURIX TC275存储分布_下
  • 原文地址:https://blog.csdn.net/bear_miao/article/details/126958521