Linux引导启动顺序

1.所有的__init函数在区段.initcall.init中还保存了一份函数指针,在初始化时内核会通过这些函数指针调用这些__init函数,并在整个初始化完成后,释放整个init区段(包括.init.text,.initcall.init等)。注意,这些函数在内核初始化过程中的调用顺序只和这里的函数指针的顺序有关,和这些函数本身在.init.text区段中的顺序无关。在2.4内核中,这些函数指针的顺序也是和链接的顺序有关的,是不确定的。在2.6内核中,initcall.init区段又分成7个子区段,如下:,数字越小越先调用,数字越大越后调用。

.initcall1.init
.initcall2.init
.initcall3.init
.initcall4.init
.initcall5.init
.initcall6.init
.initcall7.init

数字越小越先被调用,include/linux/init.h文件中,包括各种常见的包装:

#define pure_initcall(fn)          __define_initcall(fn, 0)

#define core_initcall(fn)          __define_initcall(fn, 1)
#define core_initcall_sync(fn)     __define_initcall(fn, 1s)
#define postcore_initcall(fn)      __define_initcall(fn, 2)
#define postcore_initcall_sync(fn) __define_initcall(fn, 2s)
#define arch_initcall(fn)          __define_initcall(fn, 3)
#define arch_initcall_sync(fn)     __define_initcall(fn, 3s)
#define subsys_initcall(fn)        __define_initcall(fn, 4)
#define subsys_initcall_sync(fn)   __define_initcall(fn, 4s)
#define fs_initcall(fn)            __define_initcall(fn, 5)
#define fs_initcall_sync(fn)       __define_initcall(fn, 5s)
#define rootfs_initcall(fn)        __define_initcall(fn, rootfs)
#define device_initcall(fn)        __define_initcall(fn, 6)
#define device_initcall_sync(fn)   __define_initcall(fn, 6s)
#define late_initcall(fn)          __define_initcall(fn, 7)
#define late_initcall_sync(fn)     __define_initcall(fn, 7s)

 

2. Linux内核启动流程

进入子系统初始化时,在内核init进程中进行设备初始化,最为复杂、诡异的机制莫过于do_initcalls()函数调用,该函数完成了所有需要静态加载模块的初始化,需要进行静态加载的内核模块,需要使用一些特定的宏进行处理,

3.1.linux内核中initcalls机制

  先来看看do_initcalls()函数原型:该部分是一个函数指针调用,遍历_initcall_start~_initcall_end范围,逐个调用这里面的函数指针指向的函数。

需要注意的是:在Linux4.9内核的linux/module.h中将module_init()宏定义为1级,级别相当高!

时间: 2024-10-09 20:12:31

Linux引导启动顺序的相关文章

Linux 开机启动顺序及一些常见无法开机情况排错(centos6)

Linux开机启动顺序 这个图就很完整的介绍了Linux的开机启动顺序下面我就跟大家详细介绍下开机的一个启动流程第一步,加载BIOS当你打开计算机电源的时候,计算机就会首先加载BIOS信息,也就是所谓的加电自检.由此可见BIOS信息是如此的重要,计算机必须首先就找到它.这是因为BIOS中包含了CPU的相关信息.硬盘信息.内存信息.时钟信息.PnP特性等等.加电自检主要由硬件的部分来完成,BIOS被设计为用来初始化硬件组成,POST作为BIOS的组成部分,用于检验电脑硬件基本功能是否正常.如果PO

Linux开机启动顺序简述

Linux的开机启动顺序 第一步:当然是加电了 第二步:加载BIOS设置,选择启动盘.这是因为因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬盘信息.内存信息.时钟信息.PnP特性等等.在此之后,计算机心里就有谱了,知道应该去读取哪个硬件设备了.在BIOS将系统的控制权交给启动硬盘第一个扇区之后,就开始由Linux来控制系统了. 第三步:加载磁盘中MBR中的grub MBR(Master Boot Record):即主引导分区,是启动盘的前512字节,里面存放了预启动信息和分区信息.前

Linux引导启动程序 - boot

主要描述 boot/目录中的三个汇编代码文件,见列表 3-1 所示.正如在前一章中提到的,这三个 文件虽然都是汇编程序,但却使用了两种语法格式.bootsect.s 和 setup.s 采用近似于 Intel 的汇编语言语法,需要使用 Intel  8086 汇编编译器和连接器 as86 和ld86,而 head.s 则使用 GNU 的汇编程序格式,并且运行在保护模式下,需要用 GNU 的 as 进行编译.这是一种 AT&T 语法的汇编语言程序. 使用两种编译器的主要原因是由于对于 Intel 

linux驱动启动顺序

首先,我们可以查看Linux内核编译完成后的System.map文件,在这个文件中我们可以看到macb(dm9161驱动模块)链接到了dm9000驱动之前,如下所示: c03b6d40 t __initcall_tun_init6 c03b6d44 t __initcall_macb_init6 c03b6d48 t __initcall_dm9000_init6 c03b6d4c t __initcall_ppp_init6 c03b6d50 t __initcall_ppp_async_in

linux修改启动顺序,登录后提示,启动级别

修改启动顺序 # vim  /etc/inittab ....... d:3:initdefault: #找到这一行,d:3:initdefault:最小化启动 d:5:initdefault:图形界面启动 #去掉开机等待的5s vi /boot/grub/menu.lst timeout=5    #设置开机选项描述,默认为5秒 设置登录成功之后的提示信息 /etc/motd文件设置成功登录后的提示信息,默认情况下,此文件里是没有内容的. 成功登录后立刻显示/etc/motd文件里的所有内容,

<linux是怎么跑的?>傻瓜视角看linux引导启动过程

每天开机关机,除了“等”之外,你得了解你的操作系统开机的时候真正做了什么? 一. 书上都是这么讲的 CPU自身初始化:硬件初始工作,以PC/IP寄存器跳转到BIOS首地址为结束标志. ->加电自检(Power On Self Test):硬件检测,内存检测,系统总线检测,以开始从总线读取第一段程序为结束标志. ->加载内核引导程序:这里是由BIOS确定了引导设备之后,从设备的第一个扇区启动的程序,GRUB的工作就是属于这个过程,以选择完一个启动的系统为结束标志. ->主引导程序:由操作系

linux开机启动顺序

1.加载BIOS 2.读取MBR 3.Boot Loader(引导程序加载) 4.加载内核 5.依据inittab文件来设定运行等级  0:关机 1:单用户模式 2:无网络支持的多用户模式 3:有网络支持的多用户模式 4:保留,未使用 5:有网络支持有X-Window支持的多用户模式 6:重新引导系统,即重启 6.init进程执行rc.sysinit 设定PATH.设定网络配置(/etc/sysconfig/network).启动swap分区.设定/proc 7.启动内核模块 8.执行不同运行级

linux的启动顺序

http://sunjiehui.blog.51cto.com/

3、linux启动顺序以及grub.conf文件详解

本节课主要讲解了linux的启动顺序以及grub.conf文件的详细讲解,后期的课程会更详细讲解linux的启动过程. 更多视频试听课程:http://yunpan.cn/cVSrHAk8ExAd9  访问密码 aa19