Linux内核--第一篇博客--Linux内核源码结构组成
发布日期:2021-05-27 01:30:26 浏览次数:27 分类:技术文章

本文共 3423 字,大约阅读时间需要 11 分钟。

一、Linux内核的特征

    1.linux内核组织形式为整体式结构

    linux内核是面向过程的,每一个模块单独编译,最后链接成一个独立的目标程序。这种结构最大的特点是内部结构简单,子系统容易进行访问,因此内核的工作效率比较高。基于过程的结构有助于不同业务的成员进行基于不同业务的开发,基于这种角度,linux内核又是开放式的开发,它允许任何人对其不同模块进行完善和再次开发。

     2.进程调度方式简单而有效。

    可以说linux追求效率方面领先,体现在调度方式上也是别具一格,对于用户进程linux采用简单的动态优先级调用方式。对内核的例程,比如中断服务程序、设备驱动程序等采用一种独特的机制,就是我们所讲的软中断机制,这种机制保证内核例程以一种高效的机制运行。

    3.支持内核线程(或称为守护进程)。

    内核线程是在后台运行而业务终端和登录shell和它结合在一起的进程。有许多标准的内核线程,其中有一些是周期运行的来完成一些特定的任务。而其余的部分它是连续运行的等待处理某些特定的事件。内核线程可以说是用户进程,但它和一般用户进程又不一样,它像内核一样不被放出,因此运行效率比较高。

    4.支持多种平台的虚拟内存管理。

    内存管理是和硬件平台相互关联的一部分。为了支持不同的平台,又要保证虚拟管理存储技术的一个通用性。那linux虚拟内存管理为不同硬件平台提供统一的接口。因为我们把linux内核移植到一个新的硬件平台并不是一个很困难的事情。

    5.虚拟文件系统。

    虚拟文件系统不仅为多种逻辑文件统一了一个接口,而且为各种硬件设备提供了统一的接口,作为一种特殊的文件。

    6.模块机制。

    模块机制可以使内核保持独立而又容易扩展。使内核很容易增加一个模块,比如一个新的设备驱动程序,不需要重新编译内核,同时模块机制可以把一个模块按照需要添加到内核,或者把一个模块从内核当中卸载下来。这使得我们可以开发需要定制自己的内核。

    7.增加系统调用。

    满足特殊的需求,一般来讲系统调用是操作系统设计者提供给用户使用内核工具的一个内核接口。但是linux开放源代码也允许我们自己设计自己的系统调用。然后把它加入到系统里面去。

    8.面向对象。

    网络部分面向对象的思想使得我们现代linux内核支持多种协议、多种网卡驱动程序变得更加容易。

二、为什么要学习linux内核

    1、提升研发出高水平软件

    对技术提升有巨大参考价值,站在巨人的肩膀上,尤其对各种驱动的开发起到一个博采众长的参考作用。 我们只要认真的钻研,就一定能吃透他们牛逼的思想。为能够自己研究出解压芯片,路由器等设备提供借鉴,打破一些外来的技术封锁。
    2、开发自己的操作系统
    为嵌入式系统提供一个极有吸引力的选择。以内核为基础的完全内核手册,支持多种计算机硬件,比如x86,arm等等现有的这些芯片,连源代码都全部公开,任何人员都可以修改,开发人员也可以为操作系统进行定制。它也有个好处,不用像windows操作系统一样有后台的威胁,这就是linux操作系统的好处。为开发嵌入式操作系统提供广泛的开发前景,比如数字家电,机顶盒,多媒体手机等。还有智能沟通设备,比如pos机、atm机等等。
    3、有助于计算机科学领域研究
    4、Linux系统性能优化

三、linux操作系统结构

1、linux内核在系统中的位置

    linux内核并不孤立,要把它放到整个系统中去研究更容易理解,如下图所示内核在操作系统中的位置。系统调用是运行在系统态,而一般程序调用是运行在用户态。系统调用是内核代码的一部分。内核负责管理linux系统里面的文件、内存以及负责从网络上接受或者发送消息等等。

2、Linux内核子系统之间关系

    进程调度: 控制进程对cpu的访问,当要选择下一个运行的程序,是调度程序选择下一个要运行的程序,可运行程序是等待cpu资源的进程。如果某个进程

在等待其他资源,那么这个进程是不可运行进程,需要通过调度进程去运行,它有个选择调度算法选择新的进程。

    内存管理:允许多个进程安全的共享主存储区。

    虚拟文件系统:隐藏各种各样不同硬件的具体细节,为所有设备提供了一个统一的接口。NFS支持多到10种不同的文件系统。也就是linux比较有特色的一部分,虚拟文件系统还可以分为逻辑文件系统和设备驱动程序。

    网络接口: 对各种网络标准协议的存取和各种网络硬件的支持,网络接口可以分为网络协议和网络驱动程序两个部分,网络协议负责实现每种可能的网络传输协议,硬件驱动程序负责驱动每种可能的网络硬件。

    进程间通讯:支持进程各种通讯机制。

3、系统数据结构
    在Linux内核中,有些使用频度较高的数据结构如下:
    task_struct:代表一个进程数据结构指针形成一个task数组。
    mm_struct:代表进程的虚拟内存。
    
inode:代表虚拟文件系统中的文件、目录等对应的索引节点(inode)。
 

四、linux内核源码组织

为了深入地了解Linux的实现机制,还必须阅读Linux的内核源代码, 下面是对有关源代码的介绍。内核源代码的版本多,对不同的内核版本,系统调用一般是相同的。新版本也许可以增加一个新的系统调用,在大多数情况下, 设备文件将仍然相同,而另一方面,版 本之间的内部接口有所变化。我们这里用linux-4.4.4。Linux内核版本有两种:稳定版本和开发版本,Linux内核版本号由3组数字组成,第一组数字,第二组数字,第三组数字。第一组数字代表目前发布的内核主版本;第二组数字:偶数表示稳定版本,奇数开发中版本;第三组数字:错误修补次数。
例如:Linux 3.6.34
第一组数字:3,主版本号
第二组数字:6,次版本号,表示稳定版本(因为它是偶数)
第三组数字:34,修订版本号,表示修改的次数,头两个数字全在一起可以描述内核系列。
4.4.4内核解压之后长这样:
 
我们来分析一下这些目录都是来干啥的:
arch目录: 不同平台体系相关代码就在这里,每种体系结构对应一个子目录。
block目录:块设备驱动。是以数据块方式接收和发送这些数据的设备,这里面的纯代码是为以前的版本,一部分是为drivers目录,另外一部分是为fs这个目录。从2.6版本以上就慢慢分成了3个部分。
certs目录: 与认证和签名相关的代码。
crypto目录:内核常用加密、压缩算法等代码。
Documentation目录:描述模块功能和协议规范代码;
Driver目录:驱动程序(USB总线驱动、PCI总线、显卡驱动等等);
firmware目录:主要是一些二进制固件;存放系统需要最底层的信息,比如cpu所需源代码等。
fs目录:虚拟文件系统代码。内核中支持的所有原始文件系统各自为一个子目录,比如ext2 ext3 ntfs fat等等。
include目录:内核源码依赖绝大部分头文件就在这里。
init目录:内核初始化代码,联系到内核各个组件入口。
ipc目录:进程间通信实现,比如共享内存、信号量、匿名管道等;
kernel目录:内核核心代码,包括进程管理、IRQ、时间等;
lib目录:C标准库的子集,方便内核代码使用。
mm目录:内存管理相关实现。
net目录:网络协议的相关代码,比如TCP、IPV6、IPV4、WiFi、以太网实现等等
samples目录:内核实例代码。
scripts目录:编译和配置内核所需脚本;perl bash等。
security目录:内核安全模型相关代码;如selinux
sound目录:声卡驱动源码;
tools目录:与内核交互的工具;主要是方便在用户态的时候测试一些内核相关的功能,就是内核交互。
usr目录:用户打包和压缩内核的实现源码。
virt目录:/kvm虚拟化目录相关支持实现。
--------------------------------------------------------------------
不同文件分析:
COPYING:许可和授权信息。
CREDITS:贡献者列表
Kbuild:内核设定脚本
Kconfig:开发人员配置内核时所用到的文件
MAINTAINERS:目前维护者列表
MakeFile:编译内核的主要文件。
ReadMe:编译内核的相关信息提供给开发者。
REPORTING-BUGS:提供给开发者如何报告问题的信息。
 
 
 
 
 

 

转载地址:https://blog.csdn.net/huohunri2013/article/details/114538154 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Linux内核--第二篇博客--进程表示及系统调用
下一篇:Goland以module方式创建工程

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年10月17日 20时17分57秒