标签:
本文为<x86汇编语言:从实模式到保护模式> 第11章笔记
以下图2, 图4和图5截自Intel手册
每个描述符占8字节, 下图中, 上面位高32位, 下面为低32位
下面是一段主引导区代码, 实验环境书中也有说, 我的资源中也有配书资源下载, 里面有说如何配置VirtualBox和Bochs, 这里说一下配置Bochs, 配书资源中关于配置Bochs中的
Disk&Boot --> ATA channel 0 --> First HD/CD on channel 0 --> Type of disk image这个选项是vpc, 我用2.6.2配置时选vpc无法启动, 得选flat才可以, 2.6.0貌似选vpc可以
mov ax, cs 02. mov ss, ax 03. mov sp, 0x7c00 04. 05. ; 计算GDT所在地址的逻辑段地址 06. mov ax, [cs:gdt_base + 0x7c00] 07. mov dx, [cs:gdt_base + 2 +0x7c00] 08. mov bx, 0x10 09. div bx 10. mov ds, ax ; 商为段地址 11. mov bx, dx ; 余数为偏移地址 12. 13. ; 全局描述符#0, 第一项必须为0 14. mov dword [bx + 0x00], 0x00000000 15. mov dword [bx + 0x04], 0x00000000 16. 17. ; 全局描述符#1, 代码段描述符 18. ; 线性基地址: 0x00007c00, 段界限: 0x01ff, 段界限在数值上等于段的长度 - 1, 因此该段的长度是0x200, 即512字节 19. ; 粒度位字节(G = 0), 属于存储器段(S = 1) 20. ; 32位的段(D/B = 1), 位于内存当中(P = 1) 21. ; 段的特权级位0(DPL = 00) 22. ; 只执行(TYPE = 1000) 23. mov dword [bx + 0x08], 0x7c0001ff 24. mov dword [bx + 0x0c], 0x00409800 25. 26. ; 全局描述符#2, 数据段描述符 27. ; 线性基地址: 0x000b8000, 段界限: 0xffff 28. ; 粒度位字节(G = 0), 属于存储器段(S = 1) 29. ; 32位的段(D/B = 1), 位于内存当中(P = 1) 30. ; 段的特权级位0(DPL = 00) 31. ; 可读可写, 向上扩展的数据段(TYPE = 0010) 32. mov dword [bx + 0x10], 0x8000ffff 33. mov dword [bx + 0x14], 0x0040920b 34. 35. ; 全局描述符#3, 栈段描述符 36. ; 线性基地址: 0x00000000, 段界限: 0x07a00 37. ; 粒度位字节(G = 0), 属于存储器段(S = 1) 38. ; 32位的段(D/B = 1), 位于内存当中(P = 1) 39. ; 段的特权级位0(DPL = 00) 40. ; 可读可写, 向下扩展的数据段, 在这里是栈段(TYPE = 0110) 41. mov dword [bx + 0x18], 0x00007a00 42. mov dword [bx + 0x1c], 0x00409600 43. 44. ; 初始化全局描述符表 45. mov word [cs:gdt_size + 0x7c00], 31 ; 全局描述符表界限(总字节数 - 1) 46. lgdt [cs:gdt_size + 0x7c00] ; 加载全局描述符表 47. 48. ; 开A20 49. in al, 0x92 50. or al, 0x02 51. out 0x92, al 52. 53. cli ; 保护模式下中断机制尚未建立, 关中断 54. 55. ; 打开保护模式, cr0寄存器0位置1 56. mov eax, cr0 57. or eax, 1 58. mov cr0, eax 59. 60. ; 进入保护模式, 详情参见本书P199 11.7 清空流水线并串行化处理器 61. ; 注意, 不管你用的是16位远转移, 还是32位远转移 62. ; 因为现在已经处于保护模式下, 处理器都将把第一个参数0x0008视为选择子 63. ; 而不是实模式下的逻辑段地址 64. jmp dword 0x0008:_ProtectMode 65. 66. [bits 32] 67. 68._ProtectMode: 69. ; 选择子00000000000_10_000B, 索引为2的描述符 70. mov ax, 0x10 71. mov ds, ax 72. 73. mov byte [0x00], ‘H‘ 74. mov byte [0x02], ‘e‘ 75. mov byte [0x04], ‘l‘ 76. mov byte [0x06], ‘l‘ 77. mov byte [0x08], ‘0‘ 78. mov byte [0x0a], ‘ ‘ 79. mov byte [0x0c], ‘O‘ 80. mov byte [0x0e], ‘n‘ 81. mov byte [0x10], ‘z‘ 82. mov byte [0x12], ‘.‘ 83. mov byte [0x14], ‘.‘ 84. mov byte [0x16], ‘.‘ 85. 86. hlt ; 因为关中断, 所以处理器不会被唤醒 87. 88.gdt_size dw 0 89.gdt_base dd 0x7e00 90. 91.times 510 - ($ - $$) db 0 92. dw 0xaa55
标签:
原文地址:http://www.cnblogs.com/Acg-Check/p/4269462.html