一、linux内核源码分析(内核源码结构组成)

应该说是把linux内核这部分知识提前了,因为坐公交需要点视频来打发一下时间,感觉linux内核的视频就不错,就顺便把linux内核提前了。这一次也是打算视频和书一起看,然后总结。书的话还是推荐《深入linux内核架构》。不吹水了,开始进入正题。

1.1 内核简介

1.1.1 内核的任务

在纯技术层面,内核是硬件与软件之间的一个中间层。其作用是将应用程序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。

尽管如此,仍然可以从其他一些有趣的视角对内核进行研究

  • 从应用程序的视角:内核可以被认为是一台增强的计算机,将计算机抽象到一个高层次上。会把硬件上的各种细节屏蔽,然后应用层,只需要调用内核的API,就能使用各种功能。
  • 当若干程序在同一系统中并发运行时,也可以将内核视为资源管理程序。内核负责将可用的共享资源(包括CPU时间、磁盘空间、网络连接等)分配到各个系统进程,同时还需要保证系统的完整性。
  • 另一种研究内核的视角是将内核视为库,其提供了一组面向系统的命令。

1.1.2 实现策略

当前,在操作系统实现方面,有以下两种主要的范型。

  1. 微内核,只有最基本的功能直接由中央内核实现。所有其他的功能都委托给一些独立进程,这些进程通过明确定义的通信接口与中心内核通信。例如:独立进程可能负责实现各种文件系统,内存管理等。(当然,与系统本身的通信需要用到最基本的内存管理功能,这是微内核实现。)

    好处:动态可扩展性和运行时切换重要组件,

    缺点:由于各个组件之间支持复杂通信需要额外的CPU时间。

  2. 宏内核,与微内核相反,宏内核是构建系统内核的传统方法。在这种方法中,内核的全部代码,包括所有子系统(如内存管理、文件系统、设备驱动程序)都打包到一个文件中。

宏内核的性能仍然强于微内核,linux仍然是依据这种范型实现的。但其中已经引进了一个重要的革新。在系统运行中,模块可以插入到内核代码中,也可以移除,这使得可以向内核动态添加功能。

1.2 为什么内核是特别的

内核很神奇,但归根结底它只是一个大的C程序,带有一些汇编代码(不时出现很少量的“黑巫术”)。

是什么使得内核如此吸引人?原因有几个。

  1. 内核是由世界上最好的程序员编写的,源代码可以证实这一点。
  2. 结构良好,细节一丝不苟,巧妙的解决方案在代码中处处可见。
  3. 内核采用了设计得非常干净的抽闲,以保持代码的模块化和易管理性,与内核其他方面混合起来,使得代码非常有趣和独特。
  4. 内核会以上下文相关的重用比特位置,多次重载结构成员,还有很多其他东西。

还有许多不同于用户程序的严肃问题需要说明:

  1. 调试内核通常要比调试用户层程序困难。应用层有大量的调试器可用。
  2. 内核提供了许多辅助函数,类似于用户空间的C语言库,但内核领域中的东西总是朴素得多。
  3. 用户层应用程序的错误可能会导致段错误(segmentation fault)或内存转储(core dump),但内核错误会导致整个系统故障。
  4. 必须考虑到内核运行的许多体系结构上根本不支持非对齐的内存访问。
  5. 所有的内核代码都必须是并发安全的。由于对多处理器计算机的支持,linux内核代码必须是可重入和线程安全的。
  6. 内核代码必须在小端序计算机上能够工作。
  7. 大多数的体系结构根本不允许在内核中执行浮点计算,因此计算需要想办法用整形来替代。

1.3 内核的组成部分

我们来看下完整的linux系统的各个层次:

在这里插入图片描述

linux内核下接计算机硬件,对计算机硬件统一管理,然后提供系统调用接口(API)给用户进程调用(前面也讲过了)。

在这里插入图片描述

第二张图,是linux内核中的一些子系统之间的关系,包括我们之后要学习的进程调度,内存管理,进程通信,虚拟文件系统,网络模块等内核子模块,这里就先看看吧,反正初学者也知识知道这些,并不清楚里面的知识。

linux系统中比较重要的数据结构:

task_struct:代表一个进程数据结构指针形成一个task数组

mm_struct:代表进程的虚拟内存

inode:代表虚拟文件系统中的文件、目录等对应的索引节点

1.4 linux内核源码组织

1.4.1 内核版本说明

linux内核版本号由3组数字组成

第一组:目前发布的内核主版本

第二组:偶数表示稳定版本,奇数表示开发中版本

第三组:错误修补次数

1.4.2 源码组织

在这里插入图片描述

比较偷懒,直接赋值一个图片即可。

  • 7
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
第一章 走进linux 1.1 GNU与Linux的成长 1.2 Linux的开发模式和运作机制 1.3走进Linux内核 1.4 分析Linux内核的意义 1.5 Linux内核结构 1.6 Linux内核源代码 1.7 Linux内核源代码分析工具 第二章 Linux运行的硬件基础 2.1 i386的寄存器 2.2 内存地址 2.3 段机制和描述符 2.4 分页机制 2.5 Linux中的分页机制 2.6 Linux中的汇编语言 第三章中断机制 3.1 中断基本知识 3.2中断描述符表的初始化 3.3异常处理 3.4 中断处理 3.5中断的后半部分处理机制 第四章 进程描述 4.1 进程和程序(Process and Program) 4.2 Linux中的进程概述 4.3 task_struct结构描述 4.4 task_struct结构在内存中的存放 4.5 进程组织的方式 4.6 内核线程 4.7 进程的权能 4.8 内核同步 第五章进程调度 5.1 Linux时间系统 5.2 时钟中断 5.3 Linux的调度程序-Schedule( ) 5.4 进程切换 第六章 Linux内存管理 6.1 Linux的内存管理概述 6.2 Linux内存管理的初始化 6.3 内存的分配和回收 6.4 地址映射机制 6.5 请页机制 6.6 交换机制 6.7 缓存和刷新机制 6.8 进程的创建和执行 第七章 进程间通信 7.1 管道 7.2 信号(signal) 7.3 System V 的IPC机制 第八章 虚拟文件系统 8.1 概述 8.2 VFS中的数据结构 8.3 高速缓存 8.4 文件系统的注册、安装与拆卸 8.5 限额机制 8.6 具体文件系统举例 8.7 文件系统的系统调用 8 .8 Linux2.4文件系统的移植问题 第九章 Ext2文件系统 9.1 基本概念 9.2 Ext2的磁盘布局和数据结构 9.3 文件的访问权限和安全 9.4 链接文件 9.5 分配策略 第十章 模块机制 10.1 概述 10.2 实现机制 10.3 模块的装入和卸载 10.4 内核版本 10.5 编写内核模块 第十一章 设备驱动程序 11.1 概述 11.2 设备驱动基础 11.3 块设备驱动程序 11.4 字符设备驱动程序 第十二章 网络 12.1 概述 12.2 网络协议 12.3 套接字(socket) 12.4 套接字缓冲区(sk_buff) 12.5 网络设备接口 第十三章 启动系统 13.1 初始化流程 13.2 初始化的任务 13.3 Linux 的Boot Loarder 13.4 进入操作系统 13.5 main.c中的初始化 13.6 建立init进程 附录: 1 Linux 2.4内核API 2.1 驱动程序的基本函数 2.2 双向循环链表的操作 2.3 基本C库函数 2.4 Linux内存管理中Slab缓冲区 2.5 Linux中的VFS 2.6 Linux的连网 2.7 网络设备支持 2.8 模块支持 2.9 硬件接口 2.10 块设备 2.11 USB 设备

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值