提交 6b25e051 创建 作者: 宋海霞's avatar 宋海霞

Initial commit

上级
/*.img
/bochs
/Debug
/Release
/sdk
*.bak
*.lst
*.o
\ No newline at end of file
EOS 核心源代码协议
允许所有人复制和发布本协议文件的完整版本,但不允许对它进行任何修改。
该协议用于控制与之配套的软件,并且管理您使用遵守该协议软件的方法。下面授予
您的各项权利受限于该协议。只有当您是合格的教育机构并且从北京英真时代科技有限
公司购买了该软件授权时才能够享有这些权利。
在您的教育机构中,您可以为了任何非商业的目的来使用、修改该软件,包括制作合理
数量的拷贝。非商业的目的可以是教学、科研以及个人的实验行为。您可以将拷贝发布
到机构内部安全的服务器上,并且可以在合格用户的个人主机上安装。
您可以在研究论文、书籍或者其他教育资料中使用该软件的代码片断,或者在以教学和
研究为目的的网站、在线公共论坛中发布该软件的代码片断。在您使用的单个代码片断
中源代码的数量不能超过 50 行。如您想使用该软件中的大量源代码,
请联系 support@tevation.com。
您不能为了商业目的使用或者分发该软件以及从该软件衍生出的任何形式的任何产品。
商业目的可以是经营、许可、出售该软件或者为了在商业产品中使用该软件而分发该软件。
如果您希望将您的与该软件有关的产品商业化,或者希望与工业伙伴合作研究,您需要
联系 sales@tevation.com 来咨询商业授权协议。
您可以为了非商业的目的分发该软件并且修改该软件,但是只能是对于其他该软件的合法
用户(例如,将修改的版本分发给其他大学的学生或者教授进行联合学术研究)。只有从
北京英真时代科技有限公司购买了该软件授权的合格教育机构,才是合法用户。您不能为
该软件或者该软件的衍生产品授予比该协议所提供的更加广泛的权利。
您还必须遵守下面的条款:
1. 您不会从该软件中移除任何版权信息或者布告,也不会对该软件中的二进制部分进行
逆向工程或者反编译。
2. 无论您以任何形式分发该软件,您都必须同时分发该协议。
3. 如果您修改了该软件或者创造了该软件的衍生产品,并且分发了修改后的版本或者衍生
产品,您需要在被修改文件中的显著位置添加布告来说明您修改的内容和修改日期,这样
接收者就会知道他们收到的不是原始的软件。
4. 该软件没有任何担保,包括明示的、暗喻的。在适用法律所允许的最大范围
内,北京英真时代科技有限公司或其供应商绝不就因使用或不能使用本“软件”所引起的或
有关的任何间接的、意外的、直接的、非直接的、特殊的、惩罚性的或其它任何损害赔偿
(包括但不限于因人身伤害或财产损坏而造成的损害赔偿,因利润损失、营业中断、商业
信息的遗失而造成的损害赔偿,因未能履行包括诚信或相当注意在内的任何责任致使隐私
泄露而造成的损害赔偿,因疏忽而造成的损害赔偿,或因任何金钱上的损失或任何其它损失
而造成的损害赔偿)承担赔偿责任,即使北京英真时代科技有限公司或其任何供应商事先被
告知该损害发生的可能性。即使补救措施未能达到预定目的,本损害赔偿排除条款将仍然有
效。
5. 您不能使用该软件来帮助开发任何为下列目的而设计的软件程序: (a) 对计算机系统有害
的或者故意干扰操作的,包括计算机系统中的任何数据和信息;(b) 秘密获取或者维持对计算
机系统高级访问权限,有自我繁殖能力,能够在不被发现的情况下执行,包括但不限于所谓
的 "rootkit" 软件程序,病毒或者蠕虫。
6. 如果您以任何方式违背了此协议,此协议赋予您的权利就会立即终止。
7. 北京英真时代科技有限公司保留在此协议中明确授予您的权利之外的所有权利。
版本: 2008.09.16
(C) 2008 北京英真时代科技有限公司(http://www.engintime.com)。保留所有权利。
;***
;
; Copyright (c) 2008 北京英真时代科技有限公司。保留所有权利。
;
; 只有您接受 EOS 核心源代码协议(参见 License.txt)中的条款才能使用这些代码。
; 如果您不接受,不能使用这些代码。
;
; 文件名: boot.asm
;
; 描述: 引导扇区。
;
;
;
;*******************************************************************************/
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; boot.asm
;
; PC 机加电后,CPU 进入实模式,分段管理内存,最多访问 1M 地址空间(没
; 有打开 A20 的情况下)。CPU 首先执行 BIOS 程序,在 BIOS 完成设备检测等工
; 作后,如果 BIOS 被设置为从软盘启动,则 BIOS 会将软盘的引导扇区(512 字节)
; 加载到物理地址 0x7C00 - 0x7DFF 处,然后将 CPU 的 CS 寄存器设置为 0x0000,
; 将 IP 寄存器设置为 0x7C00,接下来 CPU 就开始执行引导扇区中的程序。
; 由于段界限为 64K,所以在不修改段寄存器的情况下只能访问 0x0000 到 0xFFFF
; 的地址空间,软盘引导扇区就被加载到了此范围内,所以在软盘引导扇区程序中一般
; 不需要修改段寄存器。
; 此时的物理内存应该是下面的样子:
;
; +-------------------------------------+----------------------
; 0x0000 | |
; | BIOS 中断向量表 (1K) |
; | BIOS Interrupt Vector Table |
; | |
; +-------------------------------------+
; 0x0400 | BIOS 数据区 (512 Bytes) |
; | BIOS Data Area |
; +-------------------------------------+
; 0x0600 | |
; | |
; | 用户可用(1) | 常规内存 (640K)
; | | Conventional Memory
; | |
; +-------------------------------------+
; 0x7C00 | 软盘引导扇区 (512 Bytes) |
; | Floppy Boot Sector |
; +-------------------------------------+
; 0x7E00 | |
; | |
; | 用户可用(2) |
; | |
; | |
; +-------------------------------------+----------------------
; 0xA0000 | |
; | |
; | 系统占用 (384K) | 上位内存 (384K)
; | | Upper Memory
; | |
; +-------------------------------------+----------------------
; 0x100000 | |
; | | 扩展内存(只有进入保护模式才能访问)
; | 不可用 | Extended Memory
; Z Z
; | |
; 物理内存结束 | |
; +-------------------------------------+----------------------
;
; EOS 的软盘引导扇区程序选择将 Loader.bin 从第一个用户可用区域的 0x1000 处开始
; 加载,即从 0x1000 到 0x7BFF,所以 Loader 最大只能为 0x7C00 - 0x1000 = 0x6C00
; 个字节。如果在保护模式中按照 4K 大小进行分页,则 Loader 就在一个页面的开始处。
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
org 0x7C00
jmp short Start
nop ; 这个 nop 不可少
LOADER_ORG equ 0x1000 ; Loader.bin 的起始地址
Start:
; 初始化 CPU 的段寄存器为 CS 的值(0),堆栈从 64K 向下增长
mov ax, cs
mov ds, ax
mov es, ax
mov ss, ax
xor sp, sp
mov bp, sp
; 初始化屏幕
mov ax, 0x0600 ; AH = 0x06, AL = 0x00
mov bx, 0x0700 ; 黑底白字(BH = 0x07)
xor cx, cx ; 左上角: (列号 0, 行号 0)
mov dx, 0x184F ; 右下角: (列号 79, 行号 24)
int 0x10
; 软驱复位
xor ah, ah
xor dl, dl
int 0x13
; 将floppy.img中第2~5扇区(loader)的内容加载到0x1000处,共4个扇区
mov bx, LOADER_ORG ; es:bx 指向 0:0x1000
mov al, 4 ;读取的扇区数(拟定loader占用4个扇区)
mov ch, 0 ;磁道
mov cl, 2 ;扇区号(读第二个扇区)
mov dl,0 ;软驱A
mov dh, 0 ;0面
mov ah,2 ;读扇区
int 13h
; 文件读取完毕,关闭软驱马达
mov dx, 0x03F2
xor al, al
out dx, al
; Loader.bin 加载完毕,跳转到 Loader.bin 执行
jmp 0:LOADER_ORG
;
; 引导扇区代码结束,填充剩下的空间,使生成的二进制代码恰好为 512 字节
;
times 510-($-$$) db 0
dw 0xaa55 ; 引导扇区激活标志
<?xml version="1.0" encoding="gb2312"?>
<OSLProject Version="1.00" Name="kernel" ProjectType="kernel" SubjectID="1580a23c-aa04-4cf3-8cca-488dc577df8d" IncrementalUpload="-1">
<Configurations>
<Configuration Name="Debug" ConfigurationType="1" DebuggerFlavor="1" RemoteMachine="2" PreDebugCommand="">
<Tool Name="PreBuildEventTool"/>
<Tool Name="CustomBuildTool"/>
<Tool Name="GCCCompilerTool" PreprocessorDefinitions="_I386;_DEBUG;_KERNEL_;" GenerateDebugInformation="-1" CompileAs="1"/>
<Tool Name="NASMAssemblerTool" PreprocessorDefinitions="_DEBUG"/>
<Tool Name="PreLinkEventTool"/>
<Tool Name="GCCLinkerTool" OutputFile="$(OutDir)\kernel.dll" AdditionalDependencies="" IgnoreStandardLibraries="-1" EntryPointSymbol="_KiSystemStartup" BaseAddress="0x80010000"/>
<Tool Name="PostBuildEventTool" CommandLine="md sdk&#xA;md sdk\inc&#xA;md sdk\bin&#xA;md sdk\bin\debug&#xA;copy eosdef.h sdk\inc\eosdef.h&#xA;copy error.h sdk\inc\error.h&#xA;copy eos.h sdk\inc\eos.h&#xA;copy &quot;$(OutDir)\boot.bin&quot; sdk\bin\debug\boot.bin&#xA;copy &quot;$(OutDir)\loader.bin&quot; sdk\bin\debug\loader.bin&#xA;copy &quot;$(TargetPath)&quot; &quot;sdk\bin\debug\$(TargetFileName)&quot;&#xA;copy &quot;$(TargetDir)lib$(TargetName).a&quot; &quot;sdk\bin\debug\lib$(TargetName).a&quot;&#xA;echo 正在制作引导软盘映像文件...&#xA;mkfloppy.exe &quot;$(OutDir)\boot.bin&quot; &quot;$(OutDir)\loader.bin&quot; &quot;$(TargetPath)&quot; &quot;Floppy.img&quot;" Description="正在创建 SDK 目录..."/>
</Configuration>
<Configuration Name="Release" ConfigurationType="1" DebuggerFlavor="1" RemoteMachine="5" PreDebugCommand="echo 制作软盘镜像...&#xA;echo 将引导扇区程序 boot.bin 写入软盘镜像...&#xA;FloppyImageEditor.exe Floppy.img /mbr &quot;$(OutDir)\boot.bin&quot;&#xA;echo 将加载程序 loader.bin 写入软盘镜像...&#xA;FloppyImageEditor.exe Floppy.img /copy &quot;$(OutDir)\loader.bin&quot; /y&#xA;echo 将 EOS 内核程序 $(TargetFileName) 写入软盘镜像...&#xA;FloppyImageEditor.exe Floppy.img /copy &quot;$(TargetPath)&quot; /y&#xA;">
<Tool Name="PreBuildEventTool"/>
<Tool Name="CustomBuildTool"/>
<Tool Name="GCCCompilerTool" PreprocessorDefinitions="_I386;_KERNEL_;" CompileAs="1"/>
<Tool Name="NASMAssemblerTool"/>
<Tool Name="PreLinkEventTool"/>
<Tool Name="GCCLinkerTool" OutputFile="$(OutDir)\kernel.dll" AdditionalDependencies="" IgnoreStandardLibraries="-1" EntryPointSymbol="_KiSystemStartup" BaseAddress="0x80010000"/>
<Tool Name="PostBuildEventTool" CommandLine="md sdk&#xA;md sdk\inc&#xA;md sdk\bin&#xA;md sdk\bin\release&#xA;copy eosdef.h sdk\inc\eosdef.h&#xA;copy error.h sdk\inc\error.h&#xA;copy eos.h sdk\inc\eos.h&#xA;copy &quot;$(OutDir)\boot.bin&quot; sdk\bin\release\boot.bin&#xA;copy &quot;$(OutDir)\loader.bin&quot; sdk\bin\release\loader.bin&#xA;copy &quot;$(TargetPath)&quot; &quot;sdk\bin\release\$(TargetFileName)&quot;&#xA;copy &quot;$(TargetDir)lib$(TargetName).a&quot; &quot;sdk\bin\release\lib$(TargetName).a&quot;" Description="正在创建 SDK 目录..."/>
</Configuration>
</Configurations>
<Files>
<Filter Name="bochs">
<File RelativePath=".\bochs\BIOS-bochs-latest" NoUpload="-1">
</File>
<File RelativePath=".\bochs\bochs.exe" NoUpload="-1">
</File>
<File RelativePath=".\bochs\bochsdbg.exe" NoUpload="-1">
</File>
<File RelativePath=".\bochs\bochsrc.bxrc" NoUpload="-1">
</File>
<File RelativePath=".\bochs\bochsrcdbg.bxrc" NoUpload="-1">
</File>
<File RelativePath=".\bochs\Hard Disk.vhd" NoUpload="-1">
</File>
<File RelativePath=".\bochs\VGABIOS-lgpl-latest" NoUpload="-1">
</File>
</Filter>
<Filter Name="boot">
<File RelativePath=".\boot.asm">
<FileConfiguration Name="Debug">
<Tool Name="NASMAssemblerTool" ObjectFile="$(OutDir)\$(InputName).bin" ObjectFormate="bin"/>
</FileConfiguration>
<FileConfiguration Name="Release">
<Tool Name="NASMAssemblerTool" ObjectFile="$(OutDir)\$(InputName).bin" ObjectFormate="bin"/>
</FileConfiguration>
</File>
<File RelativePath=".\loader.asm">
<FileConfiguration Name="Debug">
<Tool Name="NASMAssemblerTool" ObjectFile="$(OutDir)\$(InputName).bin" ObjectFormate="bin"/>
</FileConfiguration>
<FileConfiguration Name="Release">
<Tool Name="NASMAssemblerTool" ObjectFile="$(OutDir)\$(InputName).bin" ObjectFormate="bin"/>
</FileConfiguration>
</File>
</Filter>
<Filter Name="ke" Filter="h;hpp;hxx;inc;c;cpp;cxx;asm">
<File RelativePath=".\start.c">
</File>
</Filter>
<File RelativePath=".\Floppy.img">
</File>
<File RelativePath=".\License.txt">
</File>
</Files>
</OSLProject>
添加文件
;***
;
; Copyright (c) 2008 北京英真时代科技有限公司。保留所有权利。
;
; 只有您接受 EOS 核心源代码协议(参见 License.txt)中的条款才能使用这些代码。
; 如果您不接受,不能使用这些代码。
;
; 文件名: loader.asm
;
; 描述: 加载内核。
;
;
;
;*******************************************************************************/
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; loader.asm
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
; 计算机启动时,BIOS 把 512 字节的引导扇区加载到 0000:0x7C00 处并开始执行,然
; 后引导扇区再把 Loader.bin 加载到 0000:0x1000 处并开始执行。
; 程序功能是将硬盘第一个扇区的内容复制到缓冲区中,然后打印显示这个缓冲区
;
org 0x1000
jmp Start
buffer times 512 db 0 ;准备一个缓冲区
count dw 0 ;统计字数
ide_command_base_addr equ 01f0h ;IDE设备命令模块寄存器基地址
;***************************寄存器地址****************************************
; Port Read/Write Misc
; -------- ---------- ------------------------------------
; 1f0 r/w data register, the bytes are written/read here
; 1f1 r error register (look these values up yourself)
; 1f2 r/w sector count, how many sectors to read/write
; 1f3 r/w sector number, the actual sector wanted
; 1f4 r/w cylinder low, cylinders is 0-1024
; 1f5 r/w cylinder high, this makes up the rest of the 1024
; 1f6 r/w drive/head
; bit 7 = 1
; bit 6 = 0
; bit 5 = 1
; bit 4 = 0 drive 0 select
; = 1 drive 1 select
; bit 3-0 head select bits
; 1f7 r status register
; bit 7 = 1 controller is executing a command
; bit 6 = 1 drive is ready
; bit 5 = 1 write fault
; bit 4 = 1 seek complete
; bit 3 = 1 sector buffer requires servicing
; bit 2 = 1 disk data read corrected
; bit 1 = 1 index - set to 1 each revolution
; bit 0 = 1 previous command ended in an error
; 1f7 w command register
; commands:
; 50h format track
; 20h read sectors with retry
; 21h read sectors without retry
; 22h read long with retry
; 23h read long without retry
; 30h write sectors with retry
; 31h write sectors without retry
; 32h write long with retry
; 33h write long without retry
;
; Most of these should work on even non-IDE hard disks.
;*****************************************************************************
Start:
mov ax, cs ;全部置0
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 7c00h
mov dx,ide_command_base_addr+6 ;Drive and head port
mov al,0a0h ;Drive 0, head 0
out dx,al
mov dx,ide_command_base_addr+2 ;Sector count port
mov al,1 ;Write one sector
out dx,al ;扇区数
mov dx,ide_command_base_addr+3 ;Sector number port
mov al,1 ;Write to sector one
out dx,al
mov dx,ide_command_base_addr+4 ;Cylinder low port
mov al,0 ;Cylinder 0
out dx,al ;柱面的低8位
mov dx,ide_command_base_addr+5 ;Cylinder high port
mov al,0 ;The rest of the cylinder 0
out dx,al ;柱面的高8位
mov dx,ide_command_base_addr+7 ;Command port
mov al,20h ;Read with retry.
out dx,al
busy_wait:
in al,dx ;dx=ide_command_base_addr+7
test al,8 ;Wait for sector buffer ready.
jz busy_wait ;忙时则等待
mov cx,512/2 ;One sector /2
mov di,0x1003
mov dx,1f0h ;Data port - data comes in and out of here.
rep insw ;insw指令,将dx端口的内容读到es:di,每次一个字
;***************************打印缓冲区内容*********************************
ShowBuffer:
lea si,[buffer] ;显示buffer内容,即将规定扇区的内容输出到屏幕上
cld
mov bp,24 ;共24行
NextLine:
mov cx,22 ;每行显示16字节的内容
NextCh:
lodsb
push dx
push ax
shr al, 4 ;逻辑右移,显示ah中数据
mov bx, 0
mov ah, 0eh
call ToASCII
int 10h
pop ax ;显示al中的数据
mov ah, 0eh
call ToASCII
int 10h
mov al, ' ' ;输出空格
int 10h
mov dx, [count] ;当输出了512字节后,程序跳转到死循环
add dx, 1
mov [count], dx
cmp dx, 512
je over
loop NextCh ;循环
mov al, 0dh ;换行
int 10h
mov al, 0ah ;回车
int 10h
dec bp ;行数的循环
jnz NextLine
over:
pop dx
jmp over ;程序在这里死循环
ToASCII: ;将字符转换成ASCII码
and al,0fh
cmp al,10
jae Over10
add al,'0'
ret
Over10:
add al,'A'-10
ret
/***
Copyright (c) 2008 北京英真时代科技有限公司。保留所有权利。
只有您接受 EOS 核心源代码协议(参见 License.txt)中的条款才能使用这些代码。
如果您不接受,不能使用这些代码。
文件名: start.c
描述: EOS 内核的入口函数。
*******************************************************************************/
void
KiSystemStartup(
void* LoaderBlock
)
/*++
功能描述:
系统的入口点,Kernel.dll被Loader加载到内存后从这里开始执行。
参数:
LoaderBlock - Loader传递的加载参数块结构体指针,内存管理器要使用。
返回值:
无(这个函数永远不会返回)。
注意:
KiSystemStartup在Loader构造的ISR栈中执行,不存在当前线程,所以不能调用任何可
能导致阻塞的函数,只能对各个模块进行简单的初始化。
--*/
{
}
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论