pub fn equs()->&'static str{
"
;该文件中定义了boot和loader程序中所用到的宏
%ifndef _INFO_
%define _INFO_
LOADER_START_SECTOR equ 10 ;loader程序所在磁盘的起始扇区号
LOADER_ALL_SECTORS equ 90 ;loader程序总扇区数
LOADER_CACHE_ADDRESS equ 0x7e00 ;loader程序被加载到内存缓冲区地址
LOADER2_START_SECTOR equ 100 ;loader 64位部分程序所在磁盘的起始扇区号
LOADER2_ALL_SECTORS equ 100 ;loader 64位部分程序总扇区数
LOADER2_CACHE_ADDRESS equ 0x100000 ;loader 64位部分程序被加载到内存缓冲区地址
FOUR_PAGE_ADDRESS equ 0x200000 ;临时4级头表位置
THRER_PAGE_ADDRESS_FIRST equ 0x200000+0x1000 ;临时第一个页目录指针表位置
TWO_PAGE_ADDRESS_FIRST equ 0x200000+0x1000+0x1000 ;临时第一个页目录表的位置
KERNEL_START_SECTOR equ 200 ;内核程序所在磁盘的起始扇区号
KERNEL_ALL_SECTORS equ 19
KERNEL_CACHE_ADDRESS equ 0xA00000 ;内核映像被加载到物理地址0xA00000处,线性地址10M处
%endif
"
}
pub fn lba28()->&'static str{
"
;该文件封装了LBA28读取一个扇区的汇编过程
%ifndef _LBA28_
%define _LBA28_
;参数说明:eax为起始扇区号,ds:ebx为缓冲区地址
read_one_sector:
push eax
push ebx
push ecx
push edx
push esi
mov esi,eax
mov al,1
mov dx,0x1f2 ;向端口0x1f2写入读取的扇区数
out dx,al
mov eax,esi
inc dx
out dx,al ;向端口0x1f3写入起始扇区号0-7位
inc dx
shr eax,8
out dx,al ;向端口0x1f4写入起始扇区号8-15位
inc dx
shr eax,8
out dx,al ;向端口0x1f5写入起始扇区号16-23位
inc dx
shr eax,8
or al,0xe0
out dx,al ;向端口0x1f6写入起始扇区号24-31位
inc dx
mov al,0x20
out dx,al ;向端口0x1f7写入磁盘读取命令0x20
.waits:
in al,dx
and al,0x88
cmp al,0x08
jne .waits
mov cx,256
mov dx,0x1f0
.read_word:
in ax,dx ;循环读取512字节
mov [ebx],ax
add ebx,2
loop .read_word
pop esi
pop edx
pop ecx
pop ebx
pop eax
ret
%endif
"
}