• 【日拱一卒行而不辍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!

     

  • 相关阅读:
    云原生之旅 - 4)基础设施即代码 使用 Terraform 创建 Kubernetes
    2020 CCF-CSP-S-第一轮-C++ 模拟试卷(五)--有答案
    【代码随想录】LC 27. 移除元素
    范式化和反范式对比
    Stable Diffusion 动画SD-Animatediff V2
    序章 调度系统架构设计总述
    TypeScript基础类型(day2)
    cka练习
    查看使用Android API接口创建的AppLinking链接的分析数据
    如何在 Spring Boot 中进行数据备份
  • 原文地址:https://blog.csdn.net/bear_miao/article/details/126958521