linux0.11(cp linux)

Linux0.11main函数启动初始化(二)

在Linux0.11的初始化过程中,main函数起到关键的启动作用。首先,sti指令被调用,这表示中断功能的开启,模块初始化工作至此完成。

接着,move_to_user_mode()函数被执行,这标志着程序从内核模式切换至用户模式,即执行任务0,并通过iret指令实现切换。iret指令前,数据被压入堆栈,执行后,数据根据标志位被弹入相应的寄存器。这里需要理解GDT、LDT、GDTR、LDTR和保护模式寻址方式,具体可以参考相关教程。

在切换到用户模式后,所有的进程ss0寄存器被初始化为0x10,esp0则设置为PAGE_SIZE+(long)p。理解这一操作对后续学习至关重要。而cs选择子则分别为0x17和0x0f,分别对应ss和cs寄存器的初始化。cs选择子从ldt的第1项开始,即进程0的代码段。

进程0主要由ldt段表示,包括代码段的展开与详细内容分析。该段基址为地址0,段限长为636kb,DPL为3,说明优先级为用户。

接下来,进程0回到main函数。fork函数执行后,进程0回到main函数中。

init函数在main()中已经进行系统初始化,包括内存管理和硬件设备驱动程序等。init()函数运行在任务0第一次创建的子进程中,对bin/sh程序的环境进行初始化。

setup系统调用在目录kernel/blk_drv/hd.c中实现,对应函数为sys_setup()。此函数主要设置硬盘分区结构、RAMDISK,并挂载安装文件系统。

在执行/bin/sh后,shell程序启动,至此,Linux0.11的初始化过程完成。用户可通过控制台输入命令与内核交互。printf函数产生格式化信息并输出至标准输出设备stdout,即屏幕显示。接下来,将详细分析进程管理。

关于Linux-0.11内核_段页内存管理的问题

实际上,分段和分页在某种程度上有点沉余,因为它们都可以划分进程的物理地址空间:分段可以给每个进程分配不同的线性地址空间,而分页可以把同一线性地址空间映射到不同的物理空间。采用分页机制后,就没必要再将进程分配到不同的线性地址空间。但Linux-0.11版通过共享页目录和线性地址分段,利用了分段机制,即采用段页机制。0.99及以后的版本中不再共享页目录,不再对线性地址分段,使每个进程都拥有4GB线性空间,逻辑地址=线性地址,巧妙的“绕过了”分段机制,即采用分页机制。

Linux-0.11采用段页机制,具体如下:

内存物理地址0处开始放着一页页目录表和四页页表。这一个页目录表是所有进程共享的。其后的四页页表正好映射16M物理内存,是进程0的页表。以后创建进程时页表要从主内存区申请,而页目录项直接从页目录表中取。这样进程和页目录表页存在一一对应关系,任务号为nr的进程,对应页目录的第nr*16~(nr+1)*16一共16个目录项。共有1K*1K*4K=4G的线性空间。这4G的线性空间由64个进程共享,通过对线性地址进行分段,每个进程都有64MB的线性空间,这样每个进程都会有16个连续的页目录项。

Linux 0.11 内核和根文件系统

内核,作为操作系统的核心组件,实质上是一系列二进制代码,其安装通常始于磁盘的主引导记录(MBR)区域。值得注意的是,内核自身并非一个文件系统,它只是磁盘上一系列数据集合,需要通过寻址磁盘扇区的方式进行访问。

与此相对,根文件系统是一个包含了文件系统结构和所需文件的集合体。没有文件系统,文件的存储和访问将无法实现。根文件系统通常包含了操作系统运行所需的文件,例如shell脚本等,这些文件对于内核的正常运行至关重要。

内核与根文件系统之间的关系紧密。内核作为操作系统的核心,需要通过根文件系统来访问和管理其运行所需的文件和资源。根文件系统中包含了内核运行所需的文件系统结构和程序文件,为内核提供了执行环境,确保了操作系统的稳定性和功能性。

Linux 0.11内核与根文件系统的配合,是操作系统构建和运行的基础。内核作为底层控制层,通过与根文件系统的交互,实现了对硬件资源的管理和文件系统数据的处理,为用户提供了一个稳定、高效、可定制的操作环境。

总体而言,Linux 0.11内核与根文件系统的协作,是操作系统功能实现的关键所在。它们之间相互依存,共同构成了操作系统的核心功能框架,为用户提供了一个稳定、高效、可定制的运行环境。

阅读剩余
THE END