linux内核调用( )为进程创建虚存区_Linux内核启动流程

全文参考原子Linux开发指南。


同U-boot一样,我们从Linux内核的链接脚本文件arch/arm/kernel/vmlinux.lds 开始分析内核的第一行程序是从哪里开始的。

vimlinux.lds中有ENTRY(stext),

我们去到arch/arm/kernel/head.S 的 stext 处,根据文件首部的注释,Linux内核的启动要求如下:

①、关闭 MMU。 ②、关闭 D-cache。 ③、I-Cache 无所谓。 ④、r0=0。 ⑤、r1=machine nr(也就 是机器 ID)。 ⑥、r2=atags 或者设备树(dtb)首地址。

代码功能: 设置CPU 处于 SVC 模式,关闭所有中断,读取处理器ID,调用函数 __create_page_tables 创建页表,将函数__mmap_switched 的地址保存到 r13 寄存器中。 __mmap_switched 定义在 文件 arch/arm/kernel/head-common.S,__mmap_switched 最终会调用 start_kernel 函数。调 用 __enable_mmu 函 数 使 能 MMU ,然后会调用到刚刚r13寄存器里的 __mmap_switched函数。

start_kernel函数:(init/main.c ):

start_kernel 通过调用众多的子函数来完成 Linux 启动之前的一些初始化工作,概括如下:

。。。太多了

最后调用 rest_init 函数(init/main.c ):

该函数中启动 RCU 锁调度器 ,,调用函数 kernel_thread 创建 kernel_init 进程,也就是大名鼎鼎的 init 内核进程。 init 进程的 PID 为 1。调用函数 kernel_thread 创建 kthreadd 内核进程,此内核进程的 PID 为 2。kthreadd 进程负责所有内核进程的调度和管理。 ,最后调用函数 cpu_startup_entry 来进入 idle 进程。当 CPU 没有事情做的时候就在 idle 空闲进程里面“瞎逛游”, idle 进程并没有使用 kernel_thread 或者 fork 函数来创建,因为它是有主进程演 变而来的。(使用ps -A看不到idle进程, 因为该进程是内核进程)。

大名鼎鼎的init进程,,kernel_init 函数就是 init 进程的执行函数( init/main.c ):

1. 该函数中有一个很重要的函数,,kernel_init_freeable 函数 ():

它调用了do_basic_setup 函数用于完成 Linux 下设备驱动初始化工作!非常重要。 do_basic_setup 会调用 driver_init 函数完成 Linux 下驱动模型子系统的初始化。 然后通过uboot 的 bootargs 环境变量来设置控制台和根文件系统

2. 如下图:

830fc2978493c2d1d865110cf2eed929.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值