您的位置:首页 > 运维架构 > Linux

Linux 0.11内核代码笔记

2008-05-04 16:16 190 查看
主存中顶部分配给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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: