Linux内核简介

本文深入探讨Linux内核架构,讲解内核特点、任务、组成及机制,涵盖进程、线程、地址空间、系统调用、设备驱动、网络与文件系统等关键概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                           

大纲:

理解Linux内核最好预备的知识点
Linux内核的特点
Linux内核的任务
内核的组成部分
哪些地方用到了内核机制?
Linux进程
 Linux创建新进程的机制
Linux线程
 内核线程
地址空间与特权级别
        虚拟地址与物理地址
        特权级别(Linux的两种状态)
        系统调用
设备驱动程序、块设备和字符设备
网络
文件系统

模块和热插拔

注:本文为《深入Linux内核架构》 的学习笔记


理解Linux内核最好预备的知识点:

  • 懂C语言
  • 懂一点操作系统的知识
  • 熟悉少量相关算法
  • 懂计算机体系结构


Linux内核的特点:

结合了unix操作系统的一些基础概念


Linux内核的任务:

1.从技术层面讲,内核是硬件与软件之间的一个中间层。作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。
2.从应用程序的层面讲,应用程序与硬件没有联系,只与内核有联系,内核是应用程序知道的层次中的最底层。在实际工作中内核抽象了相关细节。
3.内核是一个资源管理程序。负责将可用的共享资源(CPU时间、磁盘空间、网络连接等)分配得到各个系统进程。

4.内核就像一个库,提供了一组面向系统的命令。系统调用对于应用程序来说,就像调用普通函数一样。


内核实现策略:

1.微内核。最基本的功能由中央内核(微内核)实现。所有其他的功能都委托给一些独立进程,这些进程通过明确定义的通信接口与中心内核通信。

2.宏内核。内核的所有代码,包括子系统(如内存管理、文件管理、设备驱动程序)都打包到一个文件中。内核中的每一个函数都可以访问到内核中所有其他部分。目前支持模块的动态装卸(裁剪)。Linux内核就是基于这个策略实现的。


内核的组成部分:

1.用户空间(在“地址空间与特权级别”小节会详细介绍):
 应用程序:
 C库


2.内核空间(在“地址空间与特权级别”小节会详细介绍):
 核心内核
 设备驱动程序

 硬件

详细可参考图1


图1 Linux内核组成部分


哪些地方用到了内核机制?

1.进程(在cpu的虚拟内存中分配地址空间,各个进程的地址空间完全独立;同时执行的进程数最多不超过cpu数目)之间进行通   信,需要使用特定的内核机制。
2.进程间切换(同时执行的进程数最多不超过cpu数目),也需要用到内核机制。
    进程切换也需要像FreeRTOS任务切换一样保存状态,并将进程置于闲置状态/恢复状态。

3.进程的调度。确认哪个进程运行多长的时间。


Linux进程

1.采用层次结构,每个进程都依赖于一个父进程。内核启动init程序作为第一个进程。该进程负责进一步的系统初始化操作。init进程是进程树的根,所有的进程都直接或者间接起源于该进程。
2.通过pstree命令查询。实际上得系统第一个进程是systemd,而不是init(这也是疑问点)

3.系统中每一个进程都有一个唯一标识符(ID),用户(或其他进程)可以使用ID来访问进程。

  • Linux创建新进程的机制;
        1.使用fork函数。
 功能:创建当前进程的一个副本。父进程和子进程只有PID(进程ID)不同。父进程的内容被复制。(写时复制:可以了解下这个概念)


        2.使用exec函数。

 功能:将一个新程序加载到当前进程的内存中并执行。旧程序的内存页将刷出,其内容替换为新的数据。然后开始执行新程序。


Linux线程

进程可以看成是一个正在执行的程序,而线程则是与主程序并行运行的程序函数或例程。

  • Linux创建新线程 

        采用clone方法创建线程。

  • 内核线程
        特点:
 1.不与任何特定的用户空间进程相关联。
 2.与中断上下文运转的内核相比,内核线程可以进入睡眠状态,也可以像系统中的普通进程一样被调度器跟踪。

 用途:
 1.从内存和块设备之间的数据同步。
 2.帮助调度器在CPU上分配进程。

 如何查看内核线程:
 命令:ps fax   方括号内的就是内核线程。


地址空间与特权级别

在正式介绍之前先介绍几个单位:

KiB  2^10字节
MiB  2^20

GiB  2^30

  • 地址空间

    虚拟地址与物理地址:

        虚拟地址:在计算机的专用术语中是指标识一个虚拟(非物理地址)的实体地址。

        物理地址:切切实实存在的地址。在存储器里以字节为单位存储信息,为正确地存放或取得信息,每一个字节单元给以一个唯一的存储器地址,称为物理地址。

        映射关系:
            用页表为物理地址分配虚拟地址
    注意:未必虚拟地址的所有页都映射到某个页帧。
    原因:
  1.页没有内存可以使用
  2.数据尚不需要使用而没有载入内存。
  3.页已经换出硬盘,需要时再换回内存。


    页帧:物理内存页
    页:专指虚拟地址空间中的页。
    页表:将虚拟地址空间映射到物理地址空间的数据结构。
    多级分页:建立虚拟地址到物理地址映射的一种方法,能有效减少内存用量。


    CPU加速内存的访问过程,方法:
    1.MMU(Memory Management Unit)内存管理单元
    2.TLB(Translation Lookaside Buffer)地址转换后备缓冲器

    IA-32位结构的CPU只需要使用二级页表,Linux内核总是使用四级页表,剩余部分由内核通过控页表对缺少的页表进行仿真。

    概念注意:

    1.CPU的字长决定了所能管理的地址空间的最大长度。对于32位系统是2^32 B = 4GiB
    2.虚拟地址空间:地址空间的最大长度与实际可用的物理内存的数量无关。
 虚拟地址空间划分为两个部分:
  内核空间

  用户空间

                如图2所示:


图2 虚拟内存的划分

        有个等价名称值得一提:
 用户层:指应用程序本身。指不属于内核的东西。
 用户空间:不仅可以表示应用程序,还指代应用程序所运行的虚拟地址空间的一部分。与内核空间相对。

 注意:每一个进程都有上述独立的虚拟地址空间。对于图2所示,每个进程有4GiB的内存空间。

  • 特权级别
        Linux有两种状态,两种状态代表两种特权级别:
        核心态:在虚拟地址的内核空间运行的状态。
        用户状态:在虚拟地址的用户空间运行的状态。
      注意:在用户状态禁止访问内核空间


        这两种状态的差别在于:对高于TASK_SIZE的内存区域的访问。

  • 系统调用
        定义:从用户状态到核心态的切换通过系统调用的特定手段完成。
 方法:
 1.内核代表用户程序执行代码
 2.异步硬件中断激活,然后在中断上下文中进行。注意:在中断上下文运行时,内核不能进入睡眠状态。
        注意:

 CPU大多数在执行用户空间中的代码。当应用程序执行系统调用时,则会切换到核心态,内核将完成其请求。在此期间,内核可以访问虚拟地址空间的用户部分。在系统调用完成之后,CPU切换回用户状态。 

        硬件中断也使CPU切换到核心态,但这种情况下内核不能访问用户空间。

        系统调用有哪些:

                进程管理
  信号
  文件
  目录和文件系统
  保护机制
  定时器函数
 
 如:在IA-32处理器上,Linux使用一个专用软件中断执行系统调用。

设备驱动程序、块设备和字符设备
 设备驱动程序的任务:是在于支持应用程序经由设备文件与设备通信。换言之,使得能按恰当的方式在设备上读取/写入数据。
 设备驱动程序的定义:用于与系统连接的输入/输出装置通信。如硬盘、软驱、各种接口、声卡等。


 外设分为两类:
 1.字符设备。提供连续的数据流,数据可以顺序读取,通常不支持随机存取。支持按字节/字符来读写数据。
  典型:调制解调器
 2.块设备。可以随机访问设备数据,程序可以自行确定读取数据的位置。不支持基于字符寻址,数据读写只能以块的倍数进行。
  典型:硬盘。
  复杂性:比字符设备复杂,因为设计到缓存机制。


网络
 网卡也可以通过设备驱动程序控制。
 但在内核中,网卡不能以设备文件访问。因为网络通信期间数据打包到各种协议层,内存处理数据必须针对协议层处理,才能有效将数据对接应用程序。
        为了支持用文件接口处理网络连接。Linux提供了套接字抽象,套接字可以看成是应用程序、文件接口、内核的网络实现之间的代理。


文件系统
 文件存储在硬盘或者其他块设备(如光盘等),采用层次式文件系统。
 文件系统使用目录结构主治存储的数据,并将其他原信息(如所有者、访问权限等)关联起来。


 Linux支持许多不同的文件系统:
 如标准的Ext2和Ext3文件系统、ReiserFS、XFS、VFAT等

 注意:软件层(Virtual Filesystem虚拟文件系统)内核必须提供一个额外的软件层,将各种底层的文件系统的具体特征与应用层隔离开。如图3所示。


图3 文件系统的额外软件层

参考文献:

[1]Wolfgang Mauerer.《深入Linux内核架构》 Wolfgang Mauerer著 郭旭译 人民邮电出版社


                                   
内容概要:本文档详细介绍了在三台CentOS 7服务器(IP地址分别为192.168.0.157、192.168.0.158和192.168.0.159)上安装和配置Hadoop、Flink及其他大数据组件(如Hive、MySQL、Sqoop、Kafka、Zookeeper、HBase、Spark、Scala)的具体步骤。首先,文档说明了环境准备,包括配置主机名映射、SSH免密登录、JDK安装等。接着,详细描述了Hadoop集群的安装配置,包括SSH免密登录、JDK配置、Hadoop环境变量设置、HDFS和YARN配置文件修改、集群启动与测试。随后,依次介绍了MySQL、Hive、Sqoop、Kafka、Zookeeper、HBase、Spark、Scala和Flink的安装配置过程,包括解压、环境变量配置、配置文件修改、服务启动等关键步骤。最后,文档提供了每个组件的基本测试方法,确保安装成功。 适合人群:具备一定Linux基础和大数据组件基础知识的运维人员、大数据开发工程师以及系统管理员。 使用场景及目标:①为大数据平台建提供详细的安装指南,确保各组件能够顺利安装和配置;②帮助技术人员快速掌握Hadoop、Flink等大数据组件的安装与配置,提升工作效率;③适用于企业级大数据平台的建与维护,确保集群稳定运行。 其他说明:本文档不仅提供了详细的安装步骤,还涵盖了常见的配置项解释和故障排查建议。建议读者在安装过程中仔细阅读每一步骤,并根据实际情况调整配置参数。此外,文档中的命令和配置文件路径均为示例,实际操作时需根据具体环境进行适当修改。
在无线通信领域,天线阵列设计对于信号传播方向和覆盖范围的优化至关重要。本题要求设计一个广播电台的天线布局,形成特定的水平面波瓣图,即在东北方向实现最大辐射强度,在正东到正北的90°范围内辐射衰减最小且无零点;而在其余270°范围内允许出现零点,且正西和西南方向必须为零。为此,设计了一个由4个铅垂铁塔组成的阵列,各铁塔上的电流幅度相等,相位关系可自由调整,几何布置和间距不受限制。设计过程如下: 第一步:构建初级波瓣图 选取南北方向上的两个点源,间距为0.2λ(λ为电磁波波长),形成一个端射阵。通过调整相位差,使正南方向的辐射为零,计算得到初始相位差δ=252°。为了满足西南方向零辐射的要求,整体相位再偏移45°,得到初级波瓣图的表达式为E1=cos(36°cos(φ+45°)+126°)。 第二步:构建次级波瓣图 再选取一个点源位于正北方向,另一个点源位于西南方向,间距为0.4λ。调整相位差使西南方向的辐射为零,计算得到相位差δ=280°。同样整体偏移45°,得到次级波瓣图的表达式为E2=cos(72°cos(φ+45°)+140°)。 最终组合: 将初级波瓣图E1和次级波瓣图E2相乘,得到总阵的波瓣图E=E1×E2=cos(36°cos(φ+45°)+126°)×cos(72°cos(φ+45°)+140°)。通过编程实现计算并绘制波瓣图,可以看到三个阶段的波瓣图分别对应初级波瓣、次级波瓣和总波瓣,最终得到满足广播电台需求的总波瓣图。实验代码使用MATLAB编写,利用polar函数在极坐标下绘制波瓣图,并通过subplot分块显示不同阶段的波瓣图。这种设计方法体现了天线阵列设计的基本原理,即通过调整天线间的相对位置和相位关系,控制电磁波的辐射方向和强度,以满足特定的覆盖需求。这种设计在雷达、卫星通信和移动通信基站等无线通信系统中得到了广泛应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值