操作系统原理(3)

系统初始化
1.初始化各种模块
    内核的启动从入口函数 start_kernel() 开始,里面是各种各样初始化函数 XXXX_init。
初始化进程管理模块,通过set_task_stack_end_magic(&init_task)创建第一个进程,称为0号进程。这是唯一一个没有通过 fork 或者 kernel_thread 产生的进程,是进程列表的第一个。
调用trap_init(),里面设置了很多中断门(Interrupt Gate),用于处理各种中断。
调用mm_init() 来初始化内存管理模块。
调用ched_init() 初始化调度模块。
调用vfs_caches_init()初始化基于内存的文件系统 rootfs。为了兼容各种各样的文件系统,我们需要将文件的相关数据结构和操作抽象出来,形成一个抽象层对上提供统一的接口,这个抽象层就是 VFS(Virtual File System),虚拟文件系统。
调用是 rest_init()来做其他方面的初始化。
2.初始化 1 号进程
    rest_init ()调用 kernel_thread(kernel_init, NULL, CLONE_FS) 创建第二个进程,称为1号进程,它将运行一个用户进程。x86 提供了分层的权限机制,把区域分成了四个 Ring,将能够访问关键资源的代码放在 Ring0,称为内核态(Kernel Mode);将普通的程序代码放在 Ring3,称为用户态(User Mode)。
系统调用的过程:用户态 - 系统调用 - 保存寄存器 - 内核态执行系统调用 - 恢复寄存器 - 返回用户态,然后接着运行。
此时1号进程的启动过程在内核态,如何到用户态呢?利用执行init 文件的机会,从内核态回到用户态。首先加载 ELF 文件,接着设置用于保存用户态寄存器的结构体,最后返回进入用户态
ramdisk 的作用:Linux 访问存储设备,要有驱动才能访问。ramdisk是一个基于内存的文件系统,内存访问是不需要驱动的。/init 这个程序会先根据存储系统的类型加载驱动,有了驱动就可以设置真正的根文件系统了。有了真正的根文件系统,ramdisk 上的 /init 会启动文件系统上的 init。
3.创建 2 号进程
    rest_init()调用kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES)创建第三个进程,称为2号进程,这里的参数是函数 kthreadd,负责所有内核态的线程的调度和管理,是内核态所有线程运行的祖先。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值