Linux:初探init.h

1. 简介

在Linux操作系统中,init.h是一个重要的头文件,它定义了与系统初始化和进程管理相关的函数和数据结构。了解init.h的内容将有助于我们深入理解Linux内核的初始化和进程管理机制。

2. init.h的作用

init.h定义了一些关键的函数和数据结构,主要用于系统初始化和进程管理。其中包括:

2.1. 系统初始化

init.h中定义了与系统初始化相关的函数和数据结构。其中,最重要的函数之一是start_kernel()。这个函数被视为Linux内核的起点,所有的初始化过程都从这里开始。在start_kernel()函数中,会依次进行内核的各种初始化操作,例如内存管理的初始化、设备驱动的注册等。

在start_kernel()函数中,还会调用其他一些重要的初始化函数,例如do_basic_setup()和do_initcalls()。其中,do_basic_setup()主要用于执行一些最基本的系统初始化操作,例如设置内核命令行参数、创建进程0(也就是init进程)等;而do_initcalls()用于执行一系列的初始化函数,这些函数会按照预定顺序在启动时被调用。

2.2. 进程管理

init.h中还定义了与进程管理相关的函数和数据结构。其中,最重要的数据结构之一是struct task_struct,它表示一个进程的控制块。每个进程都对应一个唯一的task_struct结构,它包含了进程的各种属性,例如进程ID、父进程ID、进程状态等。

在init.h中,还定义了一些用于进程管理的函数,例如init_task()和fork_init()。init_task()用于初始化进程0(也就是init进程)的task_struct结构;fork_init()用于初始化进程创建时的一些必要数据,例如设置进程ID、设置进程状态等。

3. 关键代码分析

3.1. start_kernel()函数

void __init start_kernel(void)

{

/* 省略部分代码 */

/* 基本系统初始化 */

do_basic_setup();

/* 系统初始化函数调用 */

rest_init();

/* 省略部分代码 */

}

在这段代码中,start_kernel()函数是Linux内核的起点。在该函数中,会首先调用do_basic_setup()函数,进行基本的系统初始化操作;然后调用rest_init()函数,执行系统初始化的其他操作。

3.2. do_basic_setup()函数

void __init do_basic_setup(void)

{

/* 设置内核命令行参数 */

setup_command_line();

/* 创建进程0 */

init_task[0] = &init_task;

current = &init_task;

task_thread_info(&init_task)->status |= TS_UNINTERRUPTIBLE;

task_thread_info(&init_task)->cpu = 0;

}

这段代码展示了do_basic_setup()函数的实现。在该函数中,首先调用setup_command_line()函数,设置内核命令行参数;然后通过对init_task结构进行设置,创建了进程0(也就是init进程)。

3.3. init_task结构

struct task_struct init_task

#ifdef CONFIG_ARCH_TASK_STRUCT_ON_STACK

__aligned(STACK_ALIGNMENT)

#endif

= {

.state = 0,

.stack = &init_stack [0],

.usage = ATOMIC_INIT(2),

.flags = PF_KTHREAD,

.prio = MAX_PRIO-20,

.static_prio = MAX_PRIO-20,

.normal_prio = MAX_PRIO-20,

.policy = SCHED_NORMAL,

.cpus_allowed = CPU_MASK_ALL,

.mm = &init_mm,

.active_mm = &init_mm,

.mm_users = ATOMIC_INIT(2),

.mm_count = ATOMIC_INIT(1),

.ptrace = &init_ptrace,

.set_child_tid = &init_set_child_tid,

.clear_child_tid = &init_clear_child_tid,

.utime = cputime_zero,

.stime = cputime_zero,

.gtime = cputime_zero,

.min_flt = 0,

.maj_flt = 0,

.cputime_expires = cputime_zero,

.policy = SCHED_NORMAL,

.sched_class = &fair_sched_class,

.se = {

.group_node = LIST_HEAD_INIT(init_task.se.group_node),

.fork_deadlock = SE_UNINITIALIZED,

},

.rcu = RCU_INITIALIZER(init_task),

.state = 0,

.on_rq = 0,

.on_cpu = -1,

.policy = 0,

.prev_cpu = -1,

.wake_entry = {

.entry = LIST_HEAD_INIT(init_task.wake_entry.entry),

.wake_flags = WF_SYNC,

},

.wakee_flips = 0,

.blkcg = {

.css = &init_css,

.refcnt = 1,

},

.plug_task = {

.next = &init_task,

.prev = &init_task,

},

#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE

.cputime_snap = cputime_zero,

#endif

#ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN

.last_vtime = 0,

#endif

};

这段代码展示了init_task结构的定义。init_task结构是进程0(也就是init进程)的task_struct结构,它包含了进程的各种属性。其中,.state表示进程状态,.mm表示进程使用的内存管理结构等。

4. 总结

通过初探init.h这个头文件,我们了解到它在Linux内核中扮演着非常重要的角色。它定义了与系统初始化和进程管理相关的函数和数据结构,为系统的启动和运行提供了必要的支持。

在init.h中,start_kernel()函数是内核的起点,它会执行一系列的初始化操作。其中,do_basic_setup()函数用于执行最基本的系统初始化操作,包括设置内核命令行参数、创建进程0等。

此外,init.h中还定义了进程控制块task_struct的结构,包含了进程的各种属性和状态。

通过对init.h的学习和理解,我们可以更深入地了解Linux内核的初始化和进程管理机制,为进一步研究和开发Linux系统奠定基础。

操作系统标签