ospre/bootloader/common/
mod.rs

1
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}