首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux启动引导程序(GRUB)加载内核的过程

我们知道启动引导程序(Boot Loader,也就是 GRUB)会在启动过程加载内核,之后内核才能取代 BIOS 接管启动过程。如果没有启动引导程,那么内核是不能被加载的。...本节,我们就来看看启动引导程序加载内核的过程,当然 initramfs 这个虚拟文件系统也是要靠启动引导程序调用的。...GRUB加载内核的过程GRUB 的作用有以下几个:加载操作系统的内核;拥有一个可以让用户选择的的菜单,来选择到底启动哪个系统;可以调用其他的启动引导程序,来实现多系统引导。...那么 Linux 的解决办法是把 GRUB 的程序分成了三个阶段来执行。...接下来内核就可以接管启动过程,继续自检与加载硬件模块了。

23720

浅说驱动程序加载过程

不过因为加载到内核的程序通常是用一来操作硬件的,所以驱动程序的名字要更常见些。在以下的叙述中,我将主要使用“驱动程序”这个词。...本文不是对Rootkit细节的描述,但却介绍了通常Rootkit是如何将自己加载到内核的。在本文中,我将循序渐进的展示一个驱动程序的编译,加载,以及执行的过程。...以上所展示的是一个简单的驱动程序的编译过程,接下来我们编写加载驱动程序到内核的代码。 通常的方案是将驱动程序作为加载程序的一项资源,包括到加载程序中去,在加载程序运行的时候再将驱动程序释放出来。...我们如何在程序中释放资源呢?下面的代码是主要代码文件loader.c的一个片段,展示了如何从程序中获得资源并释放的过程。 ? 在以上的代码中,我故意省略掉若干错误处理代码以使代码显得紧凑。...这个参数在生成文件的时候会用到,但这并不是加载资源的过程本身所需要的步 骤。

2.8K90
您找到你想要的搜索结果了吗?
是的
没有找到

Linux 程序编译过程详解

本文所要介绍的将C/C++语言编写的程序转换成为处理器能够执行的二进制代码的过程即由编译器完成。...在linux中静态库是以.a为后缀的文件,共享库是以.so为后缀的文件。静态库和动态库的不同点在于代码被载入的时刻不同。静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。...共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。在Linux系统中,可以用ldd命令查看一个可执行程序依赖的共享库。...动态链接则是指链接阶段仅仅只加入一些描述信息,而程序执行时再从系统中把相应动态库加载到内存中去。...在Linux系统中,可以用ldd命令查看一个可执行程序依赖的共享库。

1.8K30

Linux 程序编译过程详解

本文所要介绍的将C/C++语言编写的程序转换成为处理器能够执行的二进制代码的过程即由编译器完成。...在linux中静态库是以.a为后缀的文件,共享库是以.so为后缀的文件。 静态库和动态库的不同点在于代码被载入的时刻不同。静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。...共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。在Linux系统中,可以用ldd命令查看一个可执行程序依赖的共享库。...动态链接则是指链接阶段仅仅只加入一些描述信息,而程序执行时再从系统中把相应动态库加载到内存中去。...在Linux系统中,可以用ldd命令查看一个可执行程序依赖的共享库。

1.7K30

Linux 程序编译过程的来龙去脉

本文所要介绍的将C/C++语言编写的程序转换成为处理器能够执行的二进制代码的过程即由编译器完成。...在linux中静态库是以.a为后缀的文件,共享库是以.so为后缀的文件。 静态库和动态库的不同点在于代码被载入的时刻不同。静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。...共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。在Linux系统中,可以用ldd命令查看一个可执行程序依赖的共享库。...动态链接则是指链接阶段仅仅只加入一些描述信息,而程序执行时再从系统中把相应动态库加载到内存中去。...在Linux系统中,可以用ldd命令查看一个可执行程序依赖的共享库。

2.9K30

加载过程

类的生命周期 类加载过程 加载 验证 准备 解析 初始化 卸载 类的生命周期 一个类的完整生命周期如下: 类加载过程 Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚拟机是如何加载这些...系统加载 Class 类型的文件主要三步:加载->连接->初始化。连接过程又可分为三步:验证->准备->解析。...加载加载过程的第一步,主要完成下面 3 件事情: 通过全类名获取定义此类的二进制字节流 将字节流所代表的静态存储结构转换为方法区的运行时数据结构 在内存中生成一个代表该类的 Class 对象,作为方法区这些数据的访问入口...初始化 初始化阶段是执行初始化方法 ()方法的过程,是类加载的最后一步,这一步 JVM 才开始真正执行类中定义的 Java 程序代码(字节码)。...即当程序创建一个类的实例对象。 当 jvm 执行 getstatic 指令时会初始化类。即程序访问类的静态变量(不是静态常量,常量会被加载到运行时常量池)。

56020

加载过程

类的生命周期 加载->连接->初始化->使用->卸载 其中连接包括:验证->准备->解析 类加载过程 Class文件需要加载到虚拟机之后才能运行。...加载和连接阶段的部分阶段是可以交叉执行的,加载阶段尚未结束,连接过程可能就开始了。 验证 文件格式验证。 元数据验证。 字节码验证。 符号引用验证。 准备 准备阶段为类变量分配内存并赋初始值的过程。...在程序实际运行过程中,只有符号引用是不够的,例如:在执行方法的时候,需要明确知道方法所在的位置。...初始化 初始化阶段是执行()的过程,是类加载的最后一步,在这一步JVM才开始执行字节码。...执行new会初始化类,即程序会创建一个类实例对象。 执行getstatic会访问类的静态变量。 执行setstatic会给类静态变量赋值 执行invokestatic会调用一个类的静态方法。

37710

Linux内核(内核模块)的加载过程(超详细)

GRUB 加载了内核之后,内核首先会再进行二次系统的自检,而不一定使用 BIOS 检测的硬件信息。这时内核终于开始替代 BIOS 接管 Linux 的启动过程了。...在多数 Linux 中,都会把硬件的驱动程序编译为模块, 这些模块保存在 /lib/modules 目录中。...如果 Linux 安装在 IDE 硬盘之上,并且采用的是默认的 ext3/4 文件系统,那么内核启动后加载根分区和模块的加载都没有什么问题,系统会顺利启动。...但是,如果 Linux 安装在 SCSI 硬盘之上,或者采用的是 LVM 文件系统,那么内核(内核载入内存是启动引导程序 GRUB 调用的,并不存在硬盘驱动不识别的问题)在加载根目录之前是需要加载 SCSI...它们的作用类似,可以通过启动引导程序加载到内存中,然后会解压缩并在内存中仿真成一个根目录,并且这个仿真的文件系统能够提供一个可执行程序,通过该程序加载启动过程中所需的内核模块,比如 USB、SATA.

26620

JAVA类加载过程

** 到现在为止,我们基本上对类加载机制处于整个程序运行的环节位置,还有类加载机制的概念有了基本的印象。...其实,类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM 规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载过程中遇到了.class 文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误...首先看的就是类加载机制的过程。 二、类加载过程 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。...它们的顺序如下图所示: 2.png 其中类加载过程包括了加载、验证、准备、解析、初始化五个阶段。...(3)字节码验证:这是整个验证过程最复杂的阶段,主要是通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的。

56174

Java 类加载过程

以下哪项不属于java类加载过程?...加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班地开始,而解析阶段则不一定:它在某些情况下可以在初始化阶段之后再开始,这是为了支持Java语言的运行时绑定(也称为动态绑定或晚期绑定...初始化 类初始化阶段是类加载过程的最后一步,到了初始化阶段,才真正开始执行类中定义的java程序代码。...在准备极端,变量已经付过一次系统要求的初始值,而在初始化阶段,则根据程序猿通过程序制定的主管计划去初始化类变量和其他资源,或者说:初始化阶段是执行类构造器()方法的过程....在类加载的时候会赋予初值的是类变量,而非对象成员。 选项C:这个会调用。可以用反射试验。 选项D:类方法解析发生在解析过程

64720

JVM加载过程科普

前言 我们知道一个 java 类想要被执行就必须被加载到内存中,而加载过程呢有大体可以分为 加载、连接、初始化、使用、卸载,五部分,下面,我们就一起看一下各个部分 JVM 都做了什么。.../jre/lib/rt.jar、resource.jar 或 sun.boot.class.path 路径下的内容 ),用于提供 JVM 自身需要的类 没有父加载器 为 加载扩展类和应用程序加载器 的父加载器...系统属性 java.ext.dir 或者 JDK安装目录 jre/lib/ext 应用程序加载器( 系统类加载器,AppClassLoader ) Java 语言编写,派生于 ClassLoader 类...,父类为 扩展类加载器 负责加载环境变量 classpath 或系统属性 java.class.path 下的类库 该类加载器是程序中默认的类加载器,一般来说,Java应用的类都是由它来完成加载 连接...校验的过程叫做 验证 验证 目的在于确保 Class 文件的字节流中包含信息符合当前虚拟机的要求,保证被加载类的正确性,不危害虚拟机自身的安全。

71820

JVM:类加载过程

image.png 加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,类型的加载过程必须按照这种顺序按步就班地开始,而解析阶段则不一定:它在某些情况下可以在初始化阶段之后再开始,这是为了支持Java...关于在什么情况下需要开始类加载过程的第一阶段"加载",《Java虚拟机规范》中并没有进行强制约束,这点可以交给虚拟机的具体实现来自由把握。...事实上这个操作只是在堆内存中开辟了一段连续的地址空间4byte*10 引用类的静态常量不会导致类的初始化 类加载过程 ClassLoder的主要职责是负责加载各种class文件到JVM中,ClasLoder...类的加载过程分为三个阶段,分别是"加载阶段"、"连接阶段"、"初始化阶段" ? 加载阶段 主要负责查找并且加载类的二进制数据文件(class文件)。...进行准备阶段时,变量已经赋值过一次系统要求的初始零值,而在初始阶段,则会根据程序员通过程序编码指定的主观计划去初始化类变量和其他资源。

76141

JVM - 类加载过程

程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、连接、初始化3个步骤来对该类进行初始化。...Java 在诞生的时候喊出了一个非常牛逼的口号:“Write Once, Run Anywhere”,为了达成这个目的,Sun 公司发布了许多可以在不同平台(Windows、Linux)上运行的 Java...类加载过程 JVM结束生命周期的几种情况: 执行了System.exit()方法 程序正常执行结束 程序执行过程中遇到异常或错误而异常终止 操作系统出现错误而导致JVM进程终止 Java 的类加载过程可以分为...加载.class的方式 从本地加载 从网络上加载(URLClassLoader(URL[] urls)) 从zip, jar等归档文件中加载.class文件 从专有数据库提取.class文件 将Java...示例 如下程序: ?

46020

JVM类加载过程

JVM类加载过程 1.概述 从类的生命周期而言,一个类包括如下阶段: 加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序进行,而解析阶段则不一定...类加载方式 这里的类加载不是指类加载阶段,而是指整个类加载过程,即类加载阶段到初始化完成。...加载阶段 加载是类加载过程中的一个阶段,不要将这2个概念混淆了。...5.1 clinit clinit指的是类构造器,主要作用是在类加载过程中的初始化阶段进行执行,执行内容包括静态变量初始化和静态块的执行。 注意事项: 1....卸载阶段 执行了System.exit()方法 程序正常执行结束 程序在执行过程中遇到了异常或错误而异常终止 由于操作系统出现错误而导致Java虚拟机进程终止 发布者

45220

加载加载Class文件的过程

加载加载Class文件的过程 jdk8和9有一些区别,这里以8为准,9作为最后的扩充 类加载器是用于加载class文件的,我们从这里开始介绍 前言 因为底层硬件的不同,如果在不同硬件上都要做一次适配化无疑是令人奔溃的...建议每次发布生产环境时分为 生产环境机器总数/8=发布总批次数 类加载过程 一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载 (Loading)、验证(Verification...其他流程顺序是固定的 接下来分别探究每一个过程分别做了什么 加载 1.根据类的全类名来获取定义此类的二进制字节流。...就是这个位置抛出的 初始化 Java虚拟机才真正开始执行类中编写的Java程序代码,将主导权移交给应用程序。...执行类构造器方法 类加载器 参考上一篇文章中 保证Java程序的稳定运作 它确保了内存中类的唯一性 先看层级结构 写代码验证 public class Main { public

1.1K20
领券