操作系统高频(六)linux内核
1.内核态,用户态的区别⭐⭐⭐
内核态和用户态的区别主要在于权限和安全性。
- 权限:内核态拥有最高的权限,可以访问和执行所有的系统指令和资源,而用户态的权限相对较低,只能访问受限的指令和资源。内核态能够执行特权指令,如修改内存映射、管理硬件设备等,而用户态不能直接执行这些特权指令。
- 安全性:由于内核态具有较高的权限,错误的操作或滥用权限可能会导致系统崩溃或不安全。为了保护系统的稳定性和安全性,将操作系统的核心部分放在内核态下运行,限制用户态的权限。用户态的应用程序必须通过系统调用的方式向内核请求操作系统提供的服务和资源,这样可以有效地控制用户程序对系统的影响范围。
- 进入内核态的方式:进入内核态有三种方式,分别是系统调用、异常和设备中断。系统调用是应用程序主动向内核请求服务的方式;异常是由应用程序中的错误或异常情况触发的,如非法指令、内存访问越界等;设备中断是外部设备产生的中断信号,需要内核处理。
2.段页式内存管理有何优点?⭐⭐⭐
段页式内存管理结合了段式内存管理和页式内存管理的优点,提供了灵活性、保护性、共享性和虚拟化支持。
灵活性:
- 将内存划分为段和页的组合,既可以方便地管理不同类型的程序和数据,又可以细致地进行内存分配和利用。
保护性:
- 通过设置段和页的访问权限,可以对内存进行精细的访问控制,保护数据的安全性。
共享性:
- 段页式内存管理支持多个程序共享同一段或同一页面,减少内存重复存储,提高内存利用效率。
虚拟化支持:
- 通过页表和页面地址转换,实现虚拟地址到物理地址的映射,为虚拟内存提供支持,提高系统的内存容量和隔离性。
3.Linux内核的组成⭐⭐
- 进程管理:负责创建、管理和调度进程,包括进程的创建、销毁和调度等功能。
- 内存管理:负责管理内存资源,包括物理内存的分配与释放、虚拟内存的映射与管理等。
- 文件系统:提供对存储设备和文件的访问接口,支持各种文件系统格式。
- 设备驱动:提供对硬件设备的抽象和控制接口,支持各种设备驱动程序。
- 网络协议栈:实现了各种网络协议,提供网络通信的功能。
- 系统调用:提供用户空间程序与内核之间的接口,允许应用程序调用内核提供的功能和服务。
4.系统调用的作用⭐⭐
提供资源访问:
- 应用程序可以通过系统调用请求访问操作系统提供的资源,如文件的读写、网络通信和设备访问等。
实现用户态与内核态切换:
- 应用程序通常运行在用户态,而某些操作需要在内核态执行。通过系统调用,应用程序可以将控制权切换到内核态,让操作系统核心来完成特权操作。
提供操作系统服务:
- 系统调用封装了操作系统提供的各种服务和功能,如进程管理、内存管理、文件系统操作和网络通信等。应用程序可以通过系统调用使用这些服务。
实现进程间通信:
- 系统调用提供了进程间通信的机制,允许不同的应用程序进行数据交换和协作。应用程序可以通过系统调用进行消息传递、共享内存访问等操作。
5.系统调用read()/write(),内核具体做了哪些事情?⭐⭐⭐
- 用户空间发起read()/write()系统调用,并将参数传递给内核。
- 内核根据系统调用号找到相应的内核函数进行处理,如sys_read()/sys_write()。
- 内核根据文件描述符找到对应的文件对象,并执行读取或写入操作。
- 在读取操作中,内核将数据从文件或设备读取到内核空间,并通过页缓存层进行管理。
- 在写入操作中,内核将数据从用户空间拷贝到内核空间,并通过文件系统层将数据写入文件或设备。
- 内核可能会通过缓存管理、块设备管理和驱动程序等层次对数据进行处理和传输。
- 处理完成后,内核将结果返回给用户空间,并用户空间继续执行下一步操作。
6.bootloader内核和根文件的关系⭐
嵌入式Linux系统从软件角度可以分为四个主要部分:引导加载程序(Bootloader)、Linux内核、文件系统和应用程序。这些部分共同构成了完整的嵌入式系统。
- 引导加载程序(Bootloader):引导加载程序是系统启动的第一个执行代码,负责系统的引导和初始化。它可以包括固化在固件中的boot代码和Bootloader程序。引导加载程序的主要任务是初始化硬件、加载Linux内核、配置系统参数,并将控制权传递给内核。
- Linux内核:Linux内核是嵌入式系统的核心,负责管理系统的硬件资源、提供各种设备驱动程序和执行系统的核心功能。它提供了任务管理、内存管理、进程调度、设备管理等基本功能,并提供了丰富的系统调用接口供应用程序使用。
- 文件系统:嵌入式系统通常会有一个或多个文件系统。根文件系统是其中最重要的,它包含了操作系统所需的基本文件和目录结构。此外,嵌入式系统还可以建立在闪存或其他存储设备上的文件系统,用于存储应用程序、配置文件和数据等。
- 应用程序:应用程序是嵌入式系统中运行在用户空间的程序,利用Linux内核提供的服务和资源完成特定的功能需求。应用程序可以包括各种应用、服务和驱动程序,用于实现各种功能,如通信、控制、数据处理等。
7. Bootloader多数有两个阶段的启动过程。⭐⭐⭐
预引导阶段(Pre-boot Stage):
- 第一阶段:该阶段也被称为硬件初始化阶段。在此阶段,Bootloader负责进行硬件初始化和基本系统设置。这包括检测和初始化处理器、内存、时钟、总线和其他外设的操作。
- 第二阶段:在此阶段,Bootloader负责加载第二阶段的Bootloader代码。此代码位于存储介质上(例如闪存、硬盘等),并负责执行更高级的系统配置和初始化,包括加载文件系统驱动程序等。这一阶段还可以提供用户界面、bootloader配置和固件升级等功能。
操作系统加载阶段(Operating System Load Stage):
- 该阶段是引导加载程序加载并启动操作系统(通常是Linux内核)的阶段。Bootloader会加载操作系统内核的映像文件,并执行一系列操作,例如设置内核参数、初始化设备树等。然后,它将控制权转移到操作系统的入口点,使操作系统接管系统的控制和管理。
通过这两个阶段的启动过程,引导加载程序能够在启动过程中对硬件进行初始化和配置,并加载操作系统,以使嵌入式系统能够正常运行。这种分阶段的启动过程为系统提供了灵活性和可扩展性,使Bootloader能够在不同的硬件平台和应用场景中进行自定义配置和操作。
8.linux的内核是由bootloader装载到内存中的?⭐⭐⭐
Linux内核是由引导加载程序(Bootloader)装载到内存中的。在系统启动过程中,引导加载程序负责加载Linux内核,将其从存储介质(如磁盘或闪存)读取到内存中的指定位置。
具体的步骤如下:
- 引导加载程序首先初始化硬件环境,例如处理器、内存和外设等。
- 引导加载程序根据特定规则(如配置文件或参数)确定Linux内核的位置,通常是指定内核映像文件在存储介质上的位置。
- 引导加载程序从存储介质中加载Linux内核的映像文件到内存中的指定位置。这个过程涉及到读取映像文件的内容,并将其复制到内存中的指定位置。
- 引导加载程序还可能对内核进行一些预处理或修正,如设定内核启动参数、修改映像文件的头部信息等。
- 加载完成后,引导加载程序将控制权转移到Linux内核的入口点,以开始内核的执行。
9.为什么需要BootLoader⭐⭐
- 硬件初始化:Bootloader负责初始化嵌入式系统的硬件环境。它通过设置处理器、内存、时钟和外设等硬件的初值,确保它们处于正确的状态以便后续的系统操作。
- 加载操作系统:Bootloader的主要任务是加载操作系统,如Linux内核,将其从存储介质(如闪存、磁盘等)中读取到内存中。这个过程包括读取映像文件、解压缩(如果有必要)以及将内核映像文件复制到内存的指定位置。
- 系统配置和参数设置:Bootloader可以提供用户界面或配置文件,允许用户或系统管理员对系统进行配置和参数设置。这包括设置内核启动参数、设置设备树、选择启动选项等。通过这些配置和参数设置,Bootloader可以根据特定需求进行个性化定制。
- 多引导选择:在某些情况下(如双重引导或多系统引导),系统可能有多个可选的操作系统或内核映像文件。Bootloader可以提供菜单或交互界面,允许用户选择启动哪个操作系统或内核映像文件。这提供了灵活性和可扩展性,使系统能够根据需求选择不同的操作系统或配置。
- 系统维护和升级:Bootloader还可以用于系统维护和固件升级。它可以提供功能,如备份和还原系统、加载和更新固件等。通过这些功能,系统的维护和升级可以更加方便、安全和可靠。
10. Linux内核同步方式总结⭐⭐
- 中断屏蔽:通过屏蔽系统中断来避免竞态条件的发生,在进入临界区之前屏蔽中断,保证期间不会被其他进程或中断打断。
- 原子操作:执行过程中不会被其他代码路径中断的操作,确保对共享资源的访问是原子级别的,避免竞态条件。
- 自旋锁:用于保护临界区的同步机制,线程在获取自旋锁时循环自旋等待,直到成功获取锁为止。
- 读写自旋锁:优化的自旋锁,适用于读操作和写操作的并发访问场景,允许多个线程进行读操作,只有一个线程可以进行写操作。
- 顺序锁:保护共享数据的同步机制,适用于读操作频繁且写操作相对较少的场景,提供了更高效的读写操作。
- 信号量:用于线程间同步和互斥的机制,允许设置计数器,并提供等待(P)和释放(V)操作,控制同时访问共享资源的线程数量。
- 读写信号量:用于读操作和写操作的线程同步和互斥的机制,允许多个线程进行读操作,只有一个线程可以进行写操作。
- BKL(大内核锁):大粒度的内核锁,用于整个内核的互斥保护,但可能导致系统整体性能下降,逐渐被其他同步机制所替代。
- Seq锁:用于保护共享数据的同步机制,适用于并发读和单个写操作的场景,通过维护计数器并循环自旋等待实现读写同步。