加载rootfs是Linux启动过程中的一个主要步骤。Linux内核在启动时须要先加载rootfs,以便能够访问文件系统中的内容,例如可实行程序、配置文件等。
为什么kernel(内核)须要加载rootfs,用户空间进程才可以运行?内核是操作系统的核心部分,卖力管理打算机的硬件和软件资源,为用户空间进程供应支持和做事。但是内核本身并不包含用户空间进程,用户空间进程须要通过文件系统来获取实行文件和干系资源。因此,内核须要加载rootfs(根文件系统)才能让用户空间进程运行。
根文件系统是Linux系统的根目录,它包含了所有系统文件和目录,是用户空间进程的运行环境。当打算机启动时,内核首先加载自身,并初始化硬件设备,然后会考试测验挂载根文件系统,使得用户空间进程可以访问个中的文件和资源。
init进程在Linux系统中,init进程是系统中的第一个用户级进程,它的PID常日为1。init进程的紧张浸染是卖力系统的初始化和启动,它会在系统启动时自动启动,并按照指定的顺序依次启动其他进程和做事,包括加载文件系统、启动守护进程、挂载磁盘分区等。
init进程的启动过程常日可以分为以下几个步骤:
内核初始化。当Linux系统启动时,内核会被加载到内存中,并进行一系列初始化事情,包括初始化CPU、内存管理、设备驱动等。在内核初始化完成后,它会启动init进程作为系统的第一个用户级进程。加载init程序。在内核初始化完成后,init进程会被加载到内存中,并开始实行。init进程的代码常日存储在/sbin/init文件中,它会在启动时被实行。实行初始化脚本。在init进程启动后,它会按照预设的顺序实行初始化脚本,以完成系统的基本配置和启动做事。这些初始化脚本常日存储在/etc/init.d/目录下,它们会在系统启动时被自动实行。启动守护进程。在初始化脚本实行完毕后,init进程会启动一些守护进程,包括syslogd、klogd、crond等。这些守护进程会在后台运行,卖力系统的日志记录、定时任务等功能。挂载文件系统。在守护进程启动后,init进程会加载并挂载根文件系统。根文件系统是Linux系统的根目录,所有其他文件系统都必须挂载到根文件系统之下。在挂载文件系统之前,init进程会检讨文件系统的完全性,并进行修复和规复。启动用户登录。末了,init进程会启动一个getty进程,以供应用户登录界面。getty进程会等待用户登录,当用户登录成功后,它会将用户的终端连接到一个shell进程中,从而完成用户登录过程。内核映像文件内核映像文件(kernel image file)是Linux系统中内核的二进制文件,它包含了内核的所有代码和数据。在Linux系统启动时,内核映像文件被加载到内存中,并开始实行,以完成系统的初始化和启动。
内核映像文件常日存储在文件系统中的/boot目录下,其文件名一样平常为vmlinuz或bzImage,个中vmlinuz是经由gzip压缩的内核映像文件,而bzImage是经由bzip2压缩的内核映像文件。这些压缩办法可以减小内核映像文件的大小,从而更随意马虎传输和存储。
在Linux系统启动时,内核映像文件被加载到内存中,并进行一系列初始化事情,包括初始化CPU、内存管理、设备驱动等。内核会读取设备树文件,对硬件进行初始化,并加载并挂载根文件系统。在初始化完成后,内核会启动init进程作为系统的第一个用户级进程,init进程会依次启动其他进程和做事,以完成系统的启动和配置。
内核映像文件的天生常日须要进行编译和链接,个中编译过程须要利用交叉编译器,以将代码编译成适宜嵌入式系统的二进制格式。在编译完成后,可以利用一些工具将内核映像文件打包成镜像文件,例如uImage和zImage等,以便于传输和存储。
内核空间和用户态内核空间和用户态是打算机操作系统中的两个主要观点,它们紧张用来区分不同程序的运行环境和访问权限。
内核空间和用户态是两个不同的虚拟地址空间,操作系统内核运行在内核空间,运用程序运行在用户态。内核空间可以直接访问硬件资源和操作系统的所有功能,而用户态程序须要通过系统调用接口来要求内核的帮助。内核空间和用户态之间的切换是通过系统调用、中断、非常等办法实现的。当运用程序须要访问内核资源时,会触发相应的中断或非常,使CPU从用户态切换到内核态。内核空间和用户态之间的切换须要进行一定的高下文切换,包括保存和规复CPU的状态、切换虚拟地址空间、切换堆栈等操作,因此会带来一定的性能开销。内核空间和用户态的划分是为了保护系统的稳定和安全,内核空间具有更高的访问权限和更大的系统资源,但同时也带来了更高的风险和更大的任务。而用户态程序则更加灵巧和易于开拓和掩护,但其访问权限和系统资源受到一定限定。举个例子在Linux系统中,用户态程序可以通过系统调用接口要求内核的帮助来访问硬件资源或进行系统操作。例如,一个用户态程序想要读取文件,就可以调用系统调用接口open()和read()来要求内核打开文件并读取数据。在调用系统调用接口时,程序会触发一次从用户态到内核态的高下文切换,使得程序可以访问内核空间中的干系资源和功能。当系统调用结束后,程序再次切换回用户态,连续实行程序的逻辑。这样,用户态程序就可以通过系统调用接口来访问内核资源,而内核则可以保护系统的稳定和安全,防止用户态程序对系统造成危害。
内核模式和用户模式在打算机系统中,CPU(中心处理器)常日具有两种不同的运行模式,也称为特权级别或权限模式,分别是内核模式(也称为特权模式或系统模式)和用户模式(也称为非特权模式或用户态)。
内核模式是CPU的一种运行模式,常日是操作系统内核的运行模式。在内核模式下,CPU可以访问和掌握所有硬件资源和内存空间,包括处理器、内存、设备等等。内核模式具有更高的权限和特权,可以进行更加底层的操作,例如访问硬件设备、修正内存分页表等等。
用户模式是CPU的另一种运行模式,常日是用户空间程序的运行模式。在用户模式下,CPU只能访问自己的内存空间和一部分受操作系统授权的硬件资源,无法直接访问操作系统内核和系统资源。用户模式下的程序不能直接实行特权指令,只能通过系统调用等分外机制来向内核发出要求,从而访问操作系统内核和系统资源。
在实际运用中,操作系统内核常日运行在内核模式下,而用户空间程序则运行在用户模式下。当用户空间程序须要访问操作系统内核和系统资源时,须要通过系统调用等分外机制来向内核发出要求,从而进入内核模式实行特权操作。这种内核态和用户态的切换,可以担保操作系统的安全性和稳定性。
详细来说,当CPU实行代码时,会根据代码中指令的特权级别来判断当前指令所处的特权级别。如果指令的特权级别即是或高于当前的特权级别,那么CPU会实行这个指令,并且在实行过程中会保持当前的特权级别不变;否则,CPU会抛出非常或者中断,让操作系统处理。