AICon 上海站|90%日程已就绪,解锁Al未来! 了解详情
写点什么

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:151931

评论

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

王者荣耀商城异地多活架构设计

smile

带码农《手写Mybatis》进度3:实现映射器的注册和使用

小傅哥

小傅哥 mybatis 手写Mybatis

大数据培训-程序员坚持不断的学习能成大神吗

@零度

大数据开发

虎符交易所Hoo研究院|关于跨链(上)——Cosmos

区块链前沿News

虎符交易所

怒肝 JavaScript 数据结构 — 栈篇(一)

杨成功

JavaScript 数据结构 4月月更

TDesign 更新周报(2022年4月第1周)

TDesign

【模块七】王者荣耀商城异地多活架构设计

yhjhero

架构训练营

java培训-不干程序员了还能干什么

@零度

JAVA开发

面试突击37:线程安全问题的解决方案有哪些?

王磊

Java java面试

建木持续集成平台v2.2.5发布

Jianmu

开源 持续集成 开发运维 建木CI

模块二

ASCE

[Day7]-[动态规划] 最大子数组和

方勇(gopher)

LeetCode 动态规划 数据结构与算法、

王者荣耀商城异地多活架构设计

风中奇缘

架构实战营 「架构实战营」

高性能云桌面服务提供商酷栈科技加入龙蜥社区,共建开源新生态

OpenAnolis小助手

开源 云桌面 龙蜥社区 CLA 酷栈科技

Flink on K8s 在京东的持续优化实践

Apache Flink

大数据 flink 编程 流计算 实时计算

王者荣耀商城异地多活架构设计

张逃逃

深入剖析 RocketMQ 源码 - 负载均衡机制

vivo互联网技术

负载均衡 分布式 java

web前端培训-数组扁平化实现方式

@零度

前端开发 ES6

为什么Java仍旧生机盎然——对“为什么Java正在消亡”的回应

Geek_rze78a

Java

【课程汇总】OpenHarmony成长计划知识赋能第三期系列课程(附链接)

OpenHarmony开发者

OpenHarmony ETS Openharmony啃论文俱乐部

OceanBase 在江西人社养老统筹系统的实践分享

OceanBase 数据库

oceanbase 江西人社

有了这款工具,定位线上问题事半功倍|云效工程师指北

阿里云云效

云计算 阿里云 程序员 云原生 开发

Apache ShardingSphere 企业行|走进怪兽充电

SphereEx

开源 ShardingSphere SphereEx apache 社区 怪兽充电

分享回顾|木兰技术开放日,建木团队与你一同畅聊「云原生」

Jianmu

ci 开源 云原生 开发运维

Hoo虎符研究院|区块简报220406期

区块链前沿News

虎符交易所

OpenMLDB 获评 CSDN IT 技术影响力之星 “年度开源项目”奖项

第四范式开发者社区

人工智能 深度学习 数据库 开源 特征平台

【架构学习 07】——王者荣耀商城异地多活架构设计

tiger

架构实战营

Flink 在 B 站的多元化探索与实践

Apache Flink

大数据 flink 编程 流计算 实时计算

最全讲解:GPU技术架构知识

Finovy Cloud

人工智能 GPU服务器 GPU算力

浅谈电商网站开发中用户会话管理机制的设计和实现原理

汪子熙

JavaScript 电商 用户管理 电商系统 4月月更

直播回顾| Apache Pulsar 2.10.0 新特性概览

Apache Pulsar

开源 架构 云原生 Apache Pulsar Apache Pulsar 社区

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