最近生活窘迫啊,刚从北京培训回来,累死累活的修炼了4个月,本以为能大展宏图以报知遇之恩。谁知招聘公司倒跟华尔街样集体倒闭似的,发的简历也是泥菩萨过江了无影踪了。而眼瞅着断粮的日子渐渐临近,看来要靠亲戚朋友哥们借债过日了。算了,勒紧裤带的日子又不是没过过,天塌下来还有金茂大厦顶着呢。

在此也奉劝各位网友们,要辞职得考虑清楚,不要像我愣头青脑门一热做出此等搬石砸脚的事情来。

闲话少说,正餐供上,最近在研究linux高级应用,深入进去才发觉Linux真是博大精深啊,很是佩服老外及老内那些人才,不禁自问,什么时候能达到无招胜有招的境界呢?摘抄文章一篇,不敢独享。这是从IBM网站摘抄的一片文章,大家可以去它网站阅读。

--------------------------------------------------------------------------------------------------------

现在让我们从一个比较高的高度来审视一下 GNU/Linux 操作系统的体系结构。您可以从两个层次上来考虑操作系统,如图 2 所示。

图 2. GNU/Linux 操作系统的基本体系结构

系统调用接口(SCI)的方法
实际上,体系结构可能并不像图 2 所示的一样清晰。例如,处理系统调用(从用户空间切换到内核空间)的机制可能在各个体系结构上都不相同。提供了对虚拟化指令支持的新型 x86 中央处理单元(CPU)在这方面要比使用传统 int 80h 方法的老式 x86 处理器更加高效。

最上面是用户(或应用程序)空间。这是用户应用程序执行的地方。用户空间之下是内核空间,Linux 内核正是位于这里。

GNU C Library (glibc)也在这里。它提供了连接内核的系统调用接口,还提供了在用户空间应用程序和内核之间进行转换的机制。这点非常重要,因为内核和用户空间的应用程序使用的是不同的保护地址空间。每个用户空间的进程都使用自己的虚拟地址空间,而内核则占用单独的地址空间。 更多信息,请参看 参考资料 一节中的链接。

Linux 内核可以进一步划分成 3 层。最上面是系统调用接口,它实现了一些基本的功能,例如 read 和 write。系统调用接口之下是内核代码,可以更精确地定义为独立于体系结构的内核代码。这些代码是 Linux 所支持的所有处理器体系结构所通用的。在这些代码之下是依赖于体系结构的代码,构成了通常称为 BSP(Board Support Package)的部分。这些代码用作给定体系结构的处理器和特定于平台的代码。

Linux 内核的属性

在讨论大型而复杂的系统的体系结构时,可以从很多角度来审视系统。体系结构分析的一个目标是提供一种方法更好地理解源代码,这正是本文的目的。

Linux 内核实现了很多重要的体系结构属性。在或高或低的层次上,内核被划分为多个子系统。Linux 也可以看作是一个整体,因为它会将所有这些基本服务都集成到内核中。这与微内核的体系结构不同,后者会提供一些基本的服务,例如通信、I/O、内存和进程管理,更具体的服务都是插入到微内核层中的。每种内核都有自己的优点,不过这里并不对此进行讨论。

随着时间的流逝,Linux 内核在内存和 CPU 使用方面具有较高的效率,并且非常稳定。但是对于 Linux 来说,最为有趣的是在这种大小和复杂性的前提下,依然具有良好的可移植性。Linux 编译后可在大量处理器和具有不同体系结构约束和需求的平台上运行。一个例子是 Linux 可以在一个具有内存管理单元(MMU)的处理器上运行,也可以在那些不提供 MMU 的处理器上运行。Linux 内核的 uClinux 移植提供了对非 MMU 的支持。更详细信息请参看 参考资料 一节的内容。

Linux 内核的主要子系统

现在使用图 3 中的分类说明 Linux 内核的主要组件。

图 3. Linux 内核的一个体系结构透视图

系统调用接口

SCI 层提供了某些机制执行从用户空间到内核的函数调用。正如前面讨论的一样,这个接口依赖于体系结构,甚至在相同的处理器家族内也是如此。SCI 实际上是一个非常有用的函数调用多路复用和多路分解服务。在 ./linux/kernel 中您可以找到 SCI 的实现,并在 ./linux/arch 中找到依赖于体系结构的部分。有关这个组件的更详细信息可以在 参考资料 一节中找到。

进程管理

内核是什么?
如 图 3 所示,内核实际上仅仅是一个资源管理器。不管被管理的资源是进程、内存还是硬件设备,内核负责管理并裁定多个竞争用户对资源的访问(既包括内核空间也包括用户空间)。

进程管理的重点是进程的执行。在内核中,这些进程称为线程,代表了单独的处理器虚拟化(线程代码、数据、堆栈和 CPU 寄存器)。在用户空间,通常使用进程 这个术语,不过 Linux 实现并没有区分这两个概念(进程和线程)。内核通过 SCI 提供了一个应用程序编程接口(API)来创建一个新进程(fork、exec 或 Portable Operating System Interface [POSIX] 函数),停止进程(kill、exit),并在它们之间进行通信和同步(signal 或者 POSIX 机制)。

进程管理还包括处理活动进程之间共享 CPU 的需求。内核实现了一种新型的调度算法,不管有多少个线程在竞争 CPU,这种算法都可以在固定时间内进行操作。这种算法就称为 O(1) 调度程序,这个名字就表示它调度多个线程所使用的时间和调度一个线程所使用的时间是相同的。 O(1) 调度程序也可以支持多处理器(称为对称多处理器或 SMP)。您可以在 ./linux/kernel 中找到进程管理的源代码,在 ./linux/arch 中可以找到依赖于体系结构的源代码。在 参考资料 一节中可以了解有关这个算法的更多内容。

内存管理

内核所管理的另外一个重要资源是内存。为了提高效率,如果由硬件管理虚拟内存,内存是按照所谓的内存页 方式进行管理的(对于大部分体系结构来说都是 4KB)。Linux 包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。

不过内存管理要管理的可不止 4KB 缓冲区。Linux 提供了对 4KB 缓冲区的抽象,例如 slab 分配器。这种内存管理模式使用 4KB 缓冲区为基数,然后从中分配结构,并跟踪内存页使用情况,比如哪些内存页是满的,哪些页面没有完全使用,哪些页面为空。这样就允许该模式根据系统需要来动态调整内存使用。

为了支持多个用户使用内存,有时会出现可用内存被消耗光的情况。由于这个原因,页面可以移出内存并放入磁盘中。这个过程称为交换,因为页面会被从内存交换到硬盘上。内存管理的源代码可以在 ./linux/mm 中找到。

虚拟文件系统

虚拟文件系统(VFS)是 Linux 内核中非常有用的一个方面,因为它为文件系统提供了一个通用的接口抽象。VFS 在 SCI 和内核所支持的文件系统之间提供了一个交换层(请参看图 4)。

图 4. VFS 在用户和文件系统之间提供了一个交换层

在 VFS 上面,是对诸如 open、close、read 和 write 之类的函数的一个通用 API 抽象。在 VFS 下面是文件系统抽象,它定义了上层函数的实现方式。它们是给定文件系统(超过 50 个)的插件。文件系统的源代码可以在 ./linux/fs 中找到。

文件系统层之下是缓冲区缓存,它为文件系统层提供了一个通用函数集(与具体文件系统无关)。这个缓存层通过将数据保留一段时间(或者随即预先读取数据以便在需要是就可用)优化了对物理设备的访问。缓冲区缓存之下是设备驱动程序,它实现了特定物理设备的接口。

网络堆栈

网络堆栈在设计上遵循模拟协议本身的分层体系结构。回想一下,Internet Protocol (IP) 是传输协议(通常称为传输控制协议或 TCP)下面的核心网络层协议。TCP 上面是 socket 层,它是通过 SCI 进行调用的。

socket 层是网络子系统的标准 API,它为各种网络协议提供了一个用户接口。从原始帧访问到 IP 协议数据单元(PDU),再到 TCP 和 User Datagram Protocol (UDP),socket 层提供了一种标准化的方法来管理连接,并在各个终点之间移动数据。内核中网络源代码可以在 ./linux/net 中找到。

设备驱动程序

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

依赖体系结构的代码

尽管 Linux 很大程度上独立于所运行的体系结构,但是有些元素则必须考虑体系结构才能正常操作并实现更高效率。./linux/arch 子目录定义了内核源代码中依赖于体系结构的部分,其中包含了各种特定于体系结构的子目录(共同组成了 BSP)。对于一个典型的桌面系统来说,使用的是 i386 目录。每个体系结构子目录都包含了很多其他子目录,每个子目录都关注内核中的一个特定方面,例如引导、内核、内存管理等。这些依赖体系结构的代码可以在 ./linux/arch 中找到。

Linux 内核的一些有用特性

如果 Linux 内核的可移植性和效率还不够好,Linux 还提供了其他一些特性,它们无法划分到上面的分类中。

作为一个生产操作系统和开源软件,Linux 是测试新协议及其增强的良好平台。Linux 支持大量网络协议,包括典型的 TCP/IP,以及高速网络的扩展(大于 1 Gigabit Ethernet [GbE] 和 10 GbE)。Linux 也可以支持诸如流控制传输协议(SCTP)之类的协议,它提供了很多比 TCP 更高级的特性(是传输层协议的接替者)。

Linux 还是一个动态内核,支持动态添加或删除软件组件。被称为动态可加载内核模块,它们可以在引导时根据需要(当前特定设备需要这个模块)或在任何时候由用户插入。

Linux 最新的一个增强是可以用作其他操作系统的操作系统(称为系统管理程序)。最近,对内核进行了修改,称为基于内核的虚拟机(KVM)。这个修改为用户空间启用了一个新的接口,它可以允许其他操作系统在启用了 KVM 的内核之上运行。除了运行 Linux 的其他实例之外, Microsoft® Windows® 也可以进行虚拟化。惟一的限制是底层处理器必须支持新的虚拟化指令。更多信息请参看 参考资料 一节的内容。

转载于:https://blog.51cto.com/carywu/101651

看到好文章了(linux内核方面),大家共分享相关推荐

  1. linux内核参数注释与优化

    目录 1.linux内核参数注释 2.两种修改内核参数方法 3.内核优化参数生产配置 参数解释由网络上收集整理,常用优化参数对比了网上多个实际应用进行表格化整理,使查看更直观. 学习linux也有不少 ...

  2. Linux内核 eBPF基础:ftrace源码分析:过滤函数和开启追踪

    Linux内核 eBPF基础 ftrace基础:过滤函数和开启追踪 荣涛 2021年5月12日 本文相关注释代码:https://github.com/Rtoax/linux-5.10.13 上篇文章 ...

  3. Linux内核及主流Linux发行版对应关系汇总

    Linux内核及主流Linux发行版对应关系汇总 如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:129518033 文章目录 Linux内核及主流Lin ...

  4. Linux内核及其发行版本

    文章目录 Linux内核 Linux发行版 Linux发行版本发展图: Linux内核 Linux内核是操作系统内部操作和控制硬件设备的核心程序,它是由芬兰人林纳斯开发的. 内核效果图: 说明: 真正 ...

  5. ARM树莓派高级开发——linux内核源码、树莓派源码编译、SD卡挂载

    文章目录 linux内核开发基础(linux内核源码.树莓派源码编译.SD卡挂载) 树莓派等芯片带操作系统的启动过程 linux内核源码树 Linux内核源代码目录树结构: 树莓派Linux源码配置 ...

  6. 关于如何快速学好,学懂Linux内核。内含学习路线

    学习linux内核,这个可不像学一门语言,c或者java一个月或者3月你就能精通掌握.学习linux内核是需要一步一步循序渐进,掌握正确的linux内核学习路线对学习至关重要,本篇文章就来分享学习li ...

  7. Linux内核超级装备eBPF技术详细研究

    Linux内核超级装备eBPF技术详细研究 文章目录 Linux内核超级装备eBPF技术详细研究 eBPF定义 定义一(ebpf.io的定义) 定义二(Cilium的定义) eBPF的应用 一个采用e ...

  8. Linux内核编译很简单,6步编译一个自己的内核

    考虑离开在前面文章中我们反复提到过Linux内核,知道Linux内核才是Linux操作系统最为核心的内容.内核实现了对硬件的管理,为应用软件提供了使用硬件的接口. 对于Linux开发人员而言,内核的学 ...

  9. Linux内核:驱动程序

    本文译自Linux.orgDevynCJohnson的系列文章<Linux内核>,本篇链接:http://www.linux.org/threads/the-linux-kernel-dr ...

  10. 深入理解 Linux 内核

    Linux 内核系列文章 Linux 内核设计与实现 深入理解 Linux 内核 深入理解 Linux 内核(二) Linux 设备驱动程序 Linux设备驱动开发详解 文章目录 Linux 内核系列 ...

最新文章

  1. Bzoj3998: [TJOI2015]弦论
  2. ubuntu12.04安装node.js详细步骤
  3. jQuery CheckBox全选
  4. MyBatis 源码分析系列文章合集
  5. linux下gdb使用core文件调试程序,解决“段错误核心已转储“的问题
  6. MSF常用的监听模块命令
  7. List、Array与ArrayList
  8. 34.scrapy解决爬虫翻页问题
  9. Linux下搭建DHCP服务器 【2020.12.01】
  10. 关于shell读取文件打印时展开通配符
  11. [解题报告]102 - 生态装箱 时间限制:3.000秒
  12. Tableau零基础教程
  13. 农业物联网行业调研报告 - 市场现状分析与发展前景预测
  14. 稳定排序和不稳定排序
  15. mysql数据库建表的作用_浅谈(SQL Server)数据库中系统表的作用
  16. csdn上面文章转发
  17. Post请求,参数跟在url后面的问题
  18. 【教3妹学算法-每日3题(3)】 和至少为 K 的最短子数组
  19. 腾讯音乐MOO音乐应用的Flutter内存治理实战分享
  20. python 拉普拉斯锐化_(二十四)用二阶微分(拉普拉斯算子)实现图像锐化

热门文章

  1. nosql数据库基础
  2. [转载]JSONP跨域的原理解析
  3. Mongodb学习教程一
  4. 11.求二叉树中节点的最大距离
  5. Nodejs抓取非utf8字符编码的页面
  6. ORB_SLAM3编译
  7. Sqlserver2014 迁移数据库
  8. 爬虫学习笔记(一)初识爬虫
  9. 20162319莫礼钟 2016-2017-2 《程序设计与数据结构》第2周学习总结
  10. PB与各种数据库连接