主存中顶部分配给ROM BIOS(256KB-2MB),640KB-1MB的空间留作其他用途.包括显示缓冲区,ROM BIOS映射区...
BIOS启动过程:从内存的oxFFFFFFF0开始,这个地址有一条JMP命令跳到Flash ROM中的BIOS程序中执行,将其中的64KB代码复制到内存oxF0000-ox100000作为ROM BIOS映射区,并从这里开始进入实模式工作.
CMOS(互补金属氧化物半导体)存储器容量很小,用于存储实时钟信息和系统硬件配置信息.
as86汇编编译器用以编译引导扇区程序bootsect.s和配置程序setup.s.其它源代码由GNU as汇编和gcc编译.
处理器的系统寄存器包括标志寄存器,内存管理寄存器(GDTR,IDTR,LDTR,TR),控制寄存器(CR0,CR1,CR2,CR3).
段寄存器(CS,DS,ES,SS,FS,GS),EIP寄存器中存放段内偏移地址,所以CS:[EIP]表示要执行的代码逻辑地址.
80x86将逻辑地址根据分段规则转为线性地址,再将线性地址根据分页规则转为物理地址.
rep表示在CX不为0的情况下,不断循环.
movw表示移动一个字
jmpi go,INITSEG 表示间接跳转.
seg 取段地址
ah=0x08 int 0x13 表示取磁盘驱动器参数
.word 0 表示定义值为0的变量
总结:ROM BIOS (0x7c00) ->bootsect.S移动到0X90000执行,setup.S移动到0x90200, System模块移动到0x10000 -> setup.S再执行->System模块移动到0x00000->执行head.S
main.c的主要功能:
1.读取head.S执行后的系统配置参数,分配内存空间
2.trap_init() 设置陷阱门
3.blk_dev_init() 块设备初始化
4.chr_dev_init() 字符设备初始化
5.tty_init() tty初始化
6.time_init() 系统时间初始化
7.sched_init() 进程调度初始化
8.buffer_init() 缓冲区初始化
9.hd_init() 硬盘初始化
10.floppy_init() 软盘初始化
11.sti() 开启中断
12.move_to_user_mode() 转到用户模式
13.fork() 创建进程0,如果创建成功转init()函数
14.init()函数中读取硬盘信息setup(***),打开tty0,创建子进程用以打开rc和sh,再创建子进程以setsid().
总结:main.c的主要工作是:分配内存->初始化->开启中断->转到用户模式(保护模式)->创建进程0,1以读取硬盘信息,打开rc和sh.
//////////
asm.s的主要功能是:处理硬件中断
C函数地址入栈->中断返回地址与C函数地址交换入栈->寄存器入栈->出错码入栈->
trap.c的主要功能:初始化陷阱门,asm.s中的中断处理在trap.c中,主要是显示出错的位置,寄存器...
////////////////////////
system_call.s
总结:system_call.s主要功能是实现系统调用,还包括时钟中断,硬盘中断,软盘中断,并行中断,其它底层...
_syscall0宏调用system_call.s->system_call.s根据中断号到sys.h中的system_call_table数组中找->找到后对应函数在sys.c中
所以添加用户系统调用的步骤应该在sys.c中定义新函数->将新函数声明到sys.h及unstd.h中->system_call.s中修改系统调用的总数(+1)
////////////
mktime.c的主要功能是计算从1970.1.1到开机时间所经过的秒数
////////////
sched.c 的主要功能是进程调度算法,还有其它的一些程序,如软驱程序,sleep_on... , 根据从就绪状况的进程中,选取signal->count最大的优先,同时重新计数全部的signal->count=signal->count/2+signal->priority