ospre/bootloader/common/
mod.rs1
2pub fn equs()->&'static str{
3 "
4
5 ;该文件中定义了boot和loader程序中所用到的宏
6
7 %ifndef _INFO_
8 %define _INFO_
9
10 LOADER_START_SECTOR equ 10 ;loader程序所在磁盘的起始扇区号
11 LOADER_ALL_SECTORS equ 90 ;loader程序总扇区数
12 LOADER_CACHE_ADDRESS equ 0x7e00 ;loader程序被加载到内存缓冲区地址
13
14 LOADER2_START_SECTOR equ 100 ;loader 64位部分程序所在磁盘的起始扇区号
15 LOADER2_ALL_SECTORS equ 100 ;loader 64位部分程序总扇区数
16 LOADER2_CACHE_ADDRESS equ 0x100000 ;loader 64位部分程序被加载到内存缓冲区地址
17
18 FOUR_PAGE_ADDRESS equ 0x200000 ;临时4级头表位置
19 THRER_PAGE_ADDRESS_FIRST equ 0x200000+0x1000 ;临时第一个页目录指针表位置
20 TWO_PAGE_ADDRESS_FIRST equ 0x200000+0x1000+0x1000 ;临时第一个页目录表的位置
21
22 KERNEL_START_SECTOR equ 200 ;内核程序所在磁盘的起始扇区号
23 KERNEL_ALL_SECTORS equ 19
24 KERNEL_CACHE_ADDRESS equ 0xA00000 ;内核映像被加载到物理地址0xA00000处,线性地址10M处
25
26 %endif
27
28
29
30 "
31}
32
33pub fn lba28()->&'static str{
34 "
35 ;该文件封装了LBA28读取一个扇区的汇编过程
36
37 %ifndef _LBA28_
38 %define _LBA28_
39 ;参数说明:eax为起始扇区号,ds:ebx为缓冲区地址
40 read_one_sector:
41 push eax
42 push ebx
43 push ecx
44 push edx
45 push esi
46
47 mov esi,eax
48
49 mov al,1
50 mov dx,0x1f2 ;向端口0x1f2写入读取的扇区数
51 out dx,al
52
53 mov eax,esi
54
55 inc dx
56 out dx,al ;向端口0x1f3写入起始扇区号0-7位
57
58 inc dx
59 shr eax,8
60 out dx,al ;向端口0x1f4写入起始扇区号8-15位
61
62 inc dx
63 shr eax,8
64 out dx,al ;向端口0x1f5写入起始扇区号16-23位
65
66 inc dx
67 shr eax,8
68 or al,0xe0
69 out dx,al ;向端口0x1f6写入起始扇区号24-31位
70
71 inc dx
72 mov al,0x20
73 out dx,al ;向端口0x1f7写入磁盘读取命令0x20
74
75 .waits:
76 in al,dx
77 and al,0x88
78 cmp al,0x08
79 jne .waits
80
81 mov cx,256
82 mov dx,0x1f0
83
84 .read_word:
85 in ax,dx ;循环读取512字节
86 mov [ebx],ax
87 add ebx,2
88 loop .read_word
89
90 pop esi
91 pop edx
92 pop ecx
93 pop ebx
94 pop eax
95
96 ret
97
98
99 %endif
100
101
102 "
103}