//大内核锁的API使用非常简单,按照以下方式使用就可以了://lock_kernel(); //对被保护的共享资源的访问 … unlock_kernel();//http://blog.csdn.net/universus/archive/2010/05/25/5623971.aspxlock_kernel();//初始化time ticket,时钟tick_init();//函数 tick_init() 很简单,调用 clockevents_register_...
start_kernel相当于kernel的main函数入口,主要是做rest_init函数里面的内容如:创建0号进程以及初始化内存子系统,调度子系统等其他子系统,创建kernel_init内核线程,kthread内核线程和idle进程,代码流程我就围绕创建kernel_init内核线程(PID = 1),kthread内核线程(PID = 2),idle进程(PID = 0)这三件事情展开来说。
smp_setup_processor_id()函数是直接获取对称多处理器的ID,而smp_processor_id()函数是获取变量保存的处理器ID,因此一定要调用初始化函数。 由于smp_setup_processor_id()函数不用调用初始化函数,可以放在内核初始化start_kernel函数的最前面使用,而函数smp_processor_id()只能放到setup_arch()函数调用的后面使用了。
我们这里主要关心的是初始化阶段(start_kernel)的事情,而从上电到初始化之前的事情直接忽略了。 start_kernel函数, 也是内核启动函数,位于init/main.c文件中,该函数中调用的函数都是一个大分支。 asmlinkage void __init start_kernel(void) { char * command_line; extern const struct kernel_param __start__...
在Linux内核的start_kernel函数中对函数计时可以通过以下步骤实现: 导入必要的头文件:#include <linux/time.h> 定义计时器变量:struct timeval start_time, end_time; 在start_kernel函数的开始处获取起始时间:do_gettimeofday(&start_time); 在需要计时的代码块执行完毕后获取结束时间:do_gettimeofday(&end...
start_kernel函数 如图4.6所示,内核的初始化过程由start_kernel函数开始,至第一个用户进程init结束,调用了一系列的初始化函数对所有的内核组件进行初始化。其中,start_kernel、rest_init、kernel_init、init_post等4个函数构成了整个初始化过程的主线。 (点击查看大图)图4.6 内核初始化...
解析start_kernel函数 上次我们写过了Linux启动详细流程,这次单独解析 start_kernel 函数。 如下请参考注释: Linux kernel-6.1/init/main.c __visible无效__init __no_sanitize_address start_kernel(无效) { 字符*command_line; 字符*after_dashes; set_task_stack_end_magic(&init_task);/*设置任务栈结束...
extern const struct kernel_param __start___param[], __stop___param[]; /* * Need to run as early as possible, to initialize the * lockdep hash: */ lockdep_init();/*内核调试模块,用于检查内核互斥机制潜在的死锁问题*/ smp_setup_processor_id();/* 指定当前的cpu的逻辑号,这个函数对应于...
启动init过程(创建第一个核心线程,调用init()函数,原执行序列调用cpu_idle() 等待调度,init()) 至此start_kernel()结束,基本的核心环境已经建立起来了。 asmlinkage void __init start_kernel(void) { char * command_line; unsigned long mempages;
在start_kernel函数中将调用proc_caches_init()函数,该函数用于为linux内核中的内核对象初始化slab缓存描述符。该函数定义如下(/kernel/fork.c): void__initproc_caches_init(void){sighand_cachep=kmem_cache_create("sighand_cache",sizeof(structsighand_struct),0,SLAB_HWCACHE_ALIGN|SLAB_PANIC|SLAB_DESTROY_...