linux 3.6 启动源码分析(二) start_kernel

本文详细解析Linux 3.6内核启动过程中的start_kernel函数,涉及体系结构初始化、异常向量表设定、中断处理、调度器与时钟中断、串口控制台初始化、内存管理和进程间通信机制的初始化等关键步骤。重点讨论了setup_arch函数、内存管理初始化以及内核启动参数的处理。
摘要由CSDN通过智能技术生成
在构架相关的汇编代码运行完之后,程序跳入了构架无关的内核C语言代码:init/main.c中的start_kernel函数,在这个函数中Linux内核开始真正进入初始化阶段,

进行一系列与内核相关的初始化后,调用第一个用户进程-init 进程并等待用户进程的执行,这样整个 Linux 内核便启动完毕。该函数所做的具体工作有:

1) 调用 setup_arch()函数进行与体系结构相关的第一个初始化工作;

对不同的体系结构来说该函数有不同的定义。对于 ARM 平台而言,该函数定义在arch/arm/kernel/Setup.c。它首先通过检测出来的处理器类型进行处理器内核的初始化,然后通过 bootmem_init()函数根据系统定义的 meminfo 结构进行内存结构的初始化,最后调用paging_init()开启 MMU,创建内核页表,映射所有的物理内存和 IO空间。

2) 创建异常向量表和初始化中断处理函数;

3) 初始化系统核心进程调度器和时钟中断处理机制;

4) 初始化串口控制台(serial-console);

5) 创建和初始化系统 cache,为各种内存调用机制提供缓存,包括;动态内存分配,虚拟文件系统(VirtualFile System)及页缓存。

6) 初始化内存管理,检测内存大小及被内核占用的内存情况;

7) 初始化系统的进程间通信机制(IPC)

asmlinkage void __init start_kernel(void)
{
	char * command_line;
	extern const struct kernel_param __start___param[], __stop___param[];
	/*这两个变量为地址指针,指向内核启动参数处理相关结构体段在内存中的位置(虚拟地址)。
	声明传入参数的外部参数对于ARM平台,位于 include\asm-generic\vmlinux.lds.h*/
	/*
	 * Need to run as early as possible, to initialize the
	 * lockdep hash:
	 lockdep是一个内核调试模块,用来检查内核互斥机制(尤其是自旋锁)潜在的死锁问题。
	 */
	lockdep_init();//初始化内核依赖的关系表,初始化hash表
	smp_setup_processor_id();//获取当前CPU,单处理器为空
	debug_objects_early_init();//对调试对象进行早期的初始化,其实就是HASH锁和静态对象池进行初始化

	/*
	 * Set up the the initial canary ASAP:
	 初始化栈canary值
	 canary值的是用于防止栈溢出攻击的堆栈的保护字 。
	 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值