NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

Linux 内核源码结构(2)

  • 2020-04-10
  • 本文字数:1304 字

    阅读完需:约 4 分钟

Linux内核源码结构(2)

在上一期中,我们按照 openEuler 内核的目录结构简要介绍了 openEuler 内核目录中各个子目录的功能,这一期我们将简要介绍 Linux 内核的基本功能和抽象层级。

一、Linux 内核 Kernel Map 简介

Linux 内核的 Kernel Map 从功能上将 Linux 内核划分为不同功能的区域,并展示了不同区域中函数互相之间的调用关系。下图展示了 Linux 2.6.36 版内核的 Kernel Map[1]:



从 Kernel Map 中我们可以看出,操作系统事实上提供了硬件资源的抽象,供用户程序调用,例如在图中操作系统管理的硬件资源有用户外设(如键盘、摄像头和图形卡等)、IO 端口(如 USB、PCI 接口等)、CPU、内存、磁盘和网络设备等。


针对所有硬件资源的使用,在用户态程序看来都是一系列的系统调用,这些系统调用展示在 user space interface 层,例如对于进程来说有 fork、execve 等系统调用,分别用于创建新的进程和运行可执行文件等;而对于文件系统则有 read 和 write 等系统调用,用于读写文件等。Linux 系统可以通过执行软中断将系统控制权交给内核,内核可以执行不同的系统调用再将结果返回[2]。下表列出了 Linux 内核各系统调用的基本功能[2]:



硬件设备之上是设备驱动程序,驱动程序能控制硬件设备上的微控制器,如磁盘的磁盘控制器,来达到控制硬件设备的目的。然而,在高层的系统调用和设备驱动程序之间有着很大的鸿沟,需要用不同级别的软件抽象来实现。以用于管理磁盘的文件系统为例,对用户程序来说,只需要关注一般的读写功能统一函数接口就可以了,而不需要关注具体使用的是什么样的文件系统,例如是 Ext2 还是 Ext4 文件系统,这是因为虚拟文件系统(VFS)对这些不同的文件系统进行了统一的抽象。虚拟文件系统与具体的文件系统的关系如下图所示[3]:



以 Ext2 文件系统的写数据为例,在调用用户态的 write()接口的时候,需要传入文件描述符。内核根据文件描述符找到 file,然后调用函数接口(file->fop->write)将数据写入文件。其中 file 结构体的 fop 指针就是在打开文件的时候通过 inode 初始化的[3]。这个过程如下图所示:



此外,从 Kernel Map 中可以看出,有一些对系统资源抽象的重要功能,如进程/线程的调度,也在 Kernel Map 的中间层实现。注意在 Linux 中,进程和线程都是由 task_struct 数据结构来管理的,它们的区别在于线程间共享虚拟地址空间而进程的内存资源互相独立[4]。内核从靠近硬件的底层到靠近用户程序的高层,抽象程度逐渐提升,实现了提供给用户程序的各种硬件资源抽象和使用它们所需要的公共功能,最终抽象为系统调用供用户程序使用。内核程序一般运行在 CPU 的特权级别,可以访问系统的所有资源,而用户态程序运行在 CPU 的用户级别下,只能访问其进程的资源,这种设计增加了系统的稳定性。

二、结语

本期我们结合 Linux 内核 Kernel Map 简要介绍了 Linux 内核的基本功能和抽象层级,从下一期开始我们将介绍 Linux 内核编程环境。




参考文献


[1]https://makelinux.github.io/kernel/map/


[2]https://baijiahao.baidu.com/s?id=1604601045858159778&wfr=spider&for=pc


[3]https://baijiahao.baidu.com/s?id=1621555464151870974&wfr=spider&for=pc


[4]https://blog.csdn.net/u012218309/article/details/81912074


2020-04-10 18:151707

评论

发布
暂无评论
发现更多内容

06 K8S之kubectl命令介绍

穿过生命散发芬芳

k8s 11月日更

老友(研发岗)被裁后,想加盟小吃店,我用Python采集了一点数据,多少是个心意

梦想橡皮擦

11月日更

【死磕Java并发】—–深入分析volatile的实现原理

chenssy

11月日更 死磕 Java 死磕 Java 并发

前端开发工具之Mock.js

Augus

11月日更

构建数据网格分布式架构的四项原则

俞凡

架构 数据

思科基本网络连接与IOS的基本操作 「网络工程师之路」

Regan Yue

网络工程师 11月日更 思科 网络工程

反垄断专家如何看待区块链监管的发展方向

CECBC

使用Eclipse开发Java应用并部署到SAP云平台SCP上去

Jerry Wang

Cloud SAP 11月日更 sap开发

与德勤论道企业数字化战略到落地

大咖说

云计算 数字化转型 数字化 企业上云 阿里云;

固定价格项目能否敏捷?

Bruce Talk

敏捷 随笔 Agile

eBPF: 让云原生运维拥有超能力

俞凡

云原生 网络 ebpf

架构实战营-模块6作业

Nullrable

架构实战营

MacBook 搭建VUE3开发环境

IT蜗壳-Tango

11月日更

腾讯云数据库TDSQL已助力20余家金融机构完成核心系统替换 即将进入规模化复制阶段

科技热闻

记录渗透靶场实战【网络安全】

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 安全漏洞

dart系列之:dart语言中的变量

程序那些事

flutter dart 程序那些事 11月日更

如何提升口头表达能力?

石云升

表达 11月日更

智+人:在云端重塑一场认知革命

脑极体

设计模式【3.2】-- JDK动态代理源码分析有多香?

秦怀杂货店

源码分析 动态代理

【高并发】明明中断了线程,却为何不起作用呢?

冰河

并发编程 多线程 高并发 异步编程 Java Concurrency

Groovy中的元组

FunTester

测试开发 元组 Groovy FunTester tuple

【设计模式】第十二篇 - 桥接模式 - 露娜的召唤师技能

Brave

设计模式 桥接模式 11月日更

软件测试高效学习方法

程序员阿沐

学习方法 程序员 互联网 软件测试 计算机

iOS开发:报错‘Unknown class ViewController in Interface Builder file’解决方法

三掌柜

11月日更

Redis 高可用篇:图解 Redis 哨兵集群原理

码哥字节

redis redis sentinel NoSQL 数据库 11月日更

绝佳的录屏编辑神器,一款走遍天下!!

淋雨

Camtasia

架构实战营-设计消息队列存储消息数据的 MySQL 表格

Nullrable

架构实战

Vue进阶(幺陆柒):Vue 项目调试技能

No Silver Bullet

Vue 11月日更

thanos-io/thanos-CONTRIBUTING.md

卓丁

Prometheus Thanos thanos.io Contributing github Contributing

架构实战营-模块三

瓜子葫芦侠

「架构实战营」

rabbitmq简介

小鲍侃java

11月日更

Linux内核源码结构(2)_软件工程_华为云开发者联盟_InfoQ精选文章