Linux内核学习

首先声明:本文是我自己学习笔记,内容源自“土豆西瓜大芝麻(https://blog.csdn.net/jinking01)”、“蜗窝科技(http://www.wowotech.net/)”以及“T&P(https://blog.csdn.net/weixin_42415578/article/details/84940965)”

之前学习Linux系统操作,大多过程已经了解,本来想着是直接上手练习做几个项目,但是回过头来看看别人的经验贴再加上感觉如果对操作系统底层内核的了解不深就会不专业的想法,我觉得还是要对内核做一个系统的学习,不管以后能记住多少,反正我有了个大概的概念。

Linux内核

1.什么是操作系统?

指在系统中负责完成最基本功能和系统管理的部分

2.操作系统有哪些组成部分?

a.内核------操作系统的内在核心
b.设备驱动程序
c.启动引导程序
d.命令行shell
e.其他种类的用户界面----操作系统的外在表象
f.基本的文件管理工具和系统工具
在这里,我们可以类比windows操作系统;开机首先是启动BIOS,然后它按照我们默认的设定来加载启动操作系统,像之前的硬盘有mbr分区,它里面就有启动引导程序。启动windows后,windows接管操作,我们会看到相应的图形界面,这里可以类比到用户界面。

3.什么是Linux内核?内核有什么作用?

作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。Linux内核就是基于这个策略实现的。在这里插入图片描述
通俗来说,用户操作相关硬件,必须要经过内核的处理与调度才行。当然,内核在进程间通信、切换以及调度也起着重要作用。
在这里插入图片描述

4.它内核源代码目录结构是什么,分别有什么含义?

arch:包含和硬件体系结构相关的代码,每种平台占一个相应的目录,如i386、ARM、PowerPC、MIPS等。
block:块设备驱动程序I/O 调度。
crypto:常用加密和散列算法(如AES、SHA等),还有一些压缩和CRC校验算法。
Documentation:内核各部分的通用解释和注释。
drivers:设备驱动程序,每个不同的驱动占用一个子目录,如char、block、net、mtd、i2c等。
fs:支持的各种文件系统,如EXT、FAT、NTFS、JFFS2 等。
include:头文件,与系统相关的头文件被放置在include/linux 子目录下。
init:内核初始化代码。
ipc:进程间通信的代码。
kernel:内核的最核心部分,包括进程调度、定时器等,而和平台相关的一部分代码放在arch//kernel目录下。
lib:库文件代码。
mm:内存管理代码,和平台相关的一部分代码放在arch/
/mm目录下。
net:网络相关代码,实现了各种常见的网络协议。
scripts:包含用于配置内核的脚本文件。
security:主要包含SELinux 模块。
sound:ALSA、OSS音频设备的驱动核心代码和常用设备驱动。
usr:实现了用于打包和压缩的cpio等。
Kconfig, Kbuild, Makefile, scripts/ ---- 用于内核编译的配置文件、脚本等。

5.Linux内核主要包含什么?

在这里插入图片描述
a.进程管理
进程管理的重点是进程的执行。它的作用是调度控制系统中的多个进程对CPU 的访问,使得多个进程能在CPU 中微观串行,宏观并行地执行。
进程调度处于系统的中心位置,内核中其他的子系统都依赖它,因为每个子系统都需要挂起或恢复进程。

b.内存管理
它主要提供对内存资源的访问控制。Linux系统会在硬件物理内存和进程所使用的内存(称作虚拟内存)之间建立一种映射关系,这种映射是以进程为单位,因而不同的进程可以使用相同的虚拟内存,而这些相同的虚拟内存,可以映射到不同的物理内存上。

c.虚拟文件系统
随着计算机技术的进步,存储和组织数据的方法也是在不断进步的,从而导致有多种类型的文件系统(如:FAT、FAT32)。而为了兼容,操作系统或者内核,要以相同的表现形式,同时支持多种类型的文件系统,这就延伸出了虚拟文件系统(VFS)的概念。VFS的功能就是管理各种各样的文件系统,屏蔽它们的差异,以统一的方式,为用户程序提供访问文件的接口

d.网络接口
网络子系统在Linux内核中主要负责管理各种网络设备,并实现各种网络协议栈,最终实现通过网络连接其它系统的功能。

e.进程间通信
IPC不管理任何的硬件,它主要负责Linux系统中进程之间的通信。

f.设备驱动程序
Linux 内核中有大量代码都在设备驱动程序中,它们能够运转特定的硬件设备。Linux 源码树提供了一个驱动程序子目录,这个目录又进一步划分为各种支持设备,例如 Bluetooth、I2C、serial 等。

Linux内核体系结构

因为Linux内核是单片的,所以它比其他类型的内核占用空间最大,复杂度也最高。这是一个设计特性,在Linux早期引起了相当多的争论,并且仍然带有一些与单内核固有的相同的设计缺陷。为了解决这些缺陷,Linux内核开发人员所做的一件事就是使内核模块可以在运行时加载和卸载,这意味着您可以动态地添加或删除内核的特性。这不仅可以向内核添加硬件功能,还可以包括运行服务器进程的模块,比如低级别虚拟化,但也可以替换整个内核,而不需要在某些情况下重启计算机。
想象一下,如果您可以升级到Windows服务包,而不需要重新启动……
在这里插入图片描述

内核模块

内核模块,也称为可加载内核模块(LKM),对于保持内核在不消耗所有可用内存的情况下与所有硬件一起工作是必不可少的。
在这里插入图片描述
模块通常向基本内核添加设备、文件系统和系统调用等功能。lkm的文件扩展名是.ko,通常存储在/lib/modules目录中。由于模块的特性,可以通过在启动时使用menuconfig命令将模块设置为load或not load,或者通过编辑/boot/config文件,或者使用modprobe命令动态地加载和卸载模块,轻松定制内核。
内核并不神奇,但对于任何正常运行的计算机来说,它都是必不可少的。Linux内核不同于OS X和Windows,因为它包含内核级别的驱动程序,并使许多东西“开箱即用”。

Linux内核的编译及加载

1.内核的配置系统由哪既部分组成?

Makefile:分布在Linux 内核源代码中的Makefile,定义Linux 内核的编译规则。
配置文件(kconfig):给用户提供配置选择的功能。
配置工具:包括配置命令解释器(对配置脚本中使用的配置命令进行解释)和配置用户界面(提供字符界面和图形界面)。这些配置工具都是使用脚本语言编写的,如Tcl/TK、Perl等。

2.使用make config、make menuconfig等命令后生成一个.config配置文件,有什么作用?

记录哪些部分被编译入内核、哪些部分被编译为内核模块。

3.在Linux 内核中增加程序需要完成哪些工作?

a.将编写的源代码复制到Linux 内核源代码的相应目录。
b.在目录的Kconfig文件中增加新源代码对应项目的编译配置选项。
c.在目录的 Makefile文件中增加对新源代码的编译条目。

4.编写了驱动,源代码为led.c,为使内核能支持对该模块的编译配置,需要完成哪些工作?

a.将编写的led.c源代码复制到内核目录的drivers/char目录下
b.在目录的kconfig文件中增加led的编译配置选项
c.在目录的makefile文件中增加对led.c的编译

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值