提示:本系列文章重点学习Linux内核
Linux内核--系统调用/内核机制、进程
前言
提示:在这里先对Linux系统调用和Linux内核的任务做一个概述,以便大家能更好的理解:
嵌入式Linux系统调用是用户空间程序与内核空间之间进行交互的一种机制。在Linux系统中,用户空间和内核空间是两个独立的运行环境,系统调用是用户空间程序请求内核执行特定任务的途径之一。
Linux内核的任务
从技术层面讲,内核是硬件与软件之间的一个中间层。作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。
从应用程序的层面讲,应用程序与硬件没有联系,只与内核有联系,内核是应用程序知道的层次中的最底层。在实际工作中内核抽象了相关细节。
内核是一个资源管理程序。负责将可用的共享资源(CPU时间、磁盘空间、网络连接等)分配得到各个系统进程。
内核就像一个库,提供了一组面向系统的命令。系统调用对于应用程序来说,就像调用普通函数一样。
提示:以下是本篇文章将重点阐述Linux内核的系统调用/内核机制、进程
一、Linux系统调用
1.概念:
(1)用户空间(User Space):
用户空间是应用程序执行的环境,其中运行的程序可以访问有限的系统资源。这包括应用程序的代码、数据、堆栈等。用户空间的程序不能直接访问底层硬件,而是通过系统调用请求内核提供服务。
(2)内核空间(Kernel Space):
内核空间是操作系统内核执行的环境,它具有对系统硬件和资源的完全访问权限。内核负责管理系统的底层硬件、进程调度、内存管理等任务。
(3)系统调用(System Call):
系统调用是用户空间程序与内核空间进行通信的一种方式。它提供了一组接口,允许应用程序请求内核执行特权操作,如文件操作、网络通信等。
2.原理:
(1)用户空间到内核空间的切换:
当用户空间的程序需要执行一个系统调用时,它会通过软中断(软中断是一种通过软件触发的中断)或类似的机制触发内核空间的执行。这个切换的过程中,程序的执行流将从用户空间切换到内核空间。
(2)系统调用的执行:
一旦执行流进入内核空间,内核会根据系统调用的标识符找到相应的内核函数。这个内核函数执行特权操作,可能涉及底层硬件操作、资源管理等。执行完成后,结果返回给用户空间。
(3)系统调用的接口:
系统调用的接口通常是通过软中断号或指令来指定的。不同的系统调用有不同的标识符,内核根据这些标识符来确定要执行的具体操作。
(4)系统调用的参数传递:
用户空间向内核空间传递参数的方式通常是通过寄存器或堆栈。参数的传递方式取决于体系结构和具体的系统调用。
图解
总体来说,系统调用提供了一种安全可控的方式,使用户空间程序能够利用内核空间的功能,执行特权操作而不会直接危害系统的稳定性和安全性。了解这些概念和原理有助于理解嵌入式Linux系统中用户空间和内核空间之间的交互方式。
二、内核机制/进程
1.Linux内核的任务
从技术层面讲,内核是硬件与软件之间的一个中间层。作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。
从应用程序的层面讲,应用程序与硬件没有联系,只与内核有联系,内核是应用程序知道的层次中的最底层。在实际工作中内核抽象了相关细节。
内核是一个资源管理程序。负责将可用的共享资源(CPU时间、磁盘空间、网络连接等)分配得到各个系统进程。
内核就像一个库,提供了一组面向系统的命令。系统调用对于应用程序来说,就像调用普通函数一样。
2.内核实现策略
微内核:最基本的功能由中央内核(微内核)实现。所有其他的功能都委托给一些独立进程,这些进程通过明确定义的通信接口与中心内核通信。
宏内核:内核的所有代码,包括子系统(如内存管理、文件管理、设备驱动程序)都打包到一个文件中。内核中的每一个函数都可以访问到内核中所有其他部分。目前支持模块的动态装卸(裁剪)。Linux内核就是基于这个策略实现的。
3.内核机制使用
进程(在cpu的虚拟内存中分配地址空间,各个进程的地址空间完全独立;同时执行的进程数最多不超过cpu数目)之间进行通信,需要使用特定的内核机制。
进程间切换(同时执行的进程数最多不超过cpu数目),也需要用到内核机制。
进程切换也需要像FreeRTOS任务切换一样保存状态,并将进程置于闲置状态/恢复状态。
进程的调度。确认哪个进程运行多长的时间。
4.Linux进程
采用层次结构,每个进程都依赖于一个父进程。内核启动init程序作为第一个进程。该进程负责进一步的系统初始化操作。init进程是进程树的根,所有的进程都直接或者间接起源于该进程。
通过pstree命令查询。实际上得系统第一个进程是systemd,而不是init(这是因为现代Linux系统中,特别是使用systemd作为初始化系统(init系统)的系统,会出现不同的情况。systemd是一个功能强大的系统和服务管理器,它负责启动和管理系统上的所有进程。相较于传统的init系统,systemd提供了更先进的特性,例如并行启动、按需加载服务和更好的资源管理。由于它的广泛采用,现代Linux系统中很常见看到systemd作为第一个进程而不是传统的init。)
系统中每一个进程都有一个唯一标识符(ID),用户(或其他进程)可以使用ID来访问进程。