为什么说程序员只会编程是不行的?

B站影视 2025-01-23 10:08 2

摘要:“怎么这个程序在我这是好的,在你那怎么就不行?Linux 系统的版本是一样的啊。” 程序员小A非常困惑,他在本机执行正常的程序,拷贝到测试环境里运行,总是在一段时间之后就会崩溃。

干程序员这职业,是不是只要能写好代码实现业务就可以了?下面这个真实的案例会告诉你答案是什么。

“怎么这个程序在我这是好的,在你那怎么就不行?Linux 系统的版本是一样的啊。” 程序员小A非常困惑,他在本机执行正常的程序,拷贝到测试环境里运行,总是在一段时间之后就会崩溃。

从日志信息看,似乎在代码任意处都有可能退出,小A一筹莫展,他只好去向同部门的技术大牛求救。大牛使用 pstack、strace、objdump、binwalk 等工具在小A的本机和测试机上一顿操作,果然找到了问题。

大牛明确告诉小A:程序调用的一个第三方库在两台机器上版本不一致,出问题的那个方法在老版本中只能接收固定长度的参数,而新版本则改成了可变长度,一旦超长就会产生内存越界问题。

小A对此是佩服得五体投地,他问大牛怎样才能具备这种判断能力?

大牛笑了笑说,首先是要清楚可执行程序的结构,以及它是如何在 Linux 上运行起来的。然后是熟悉 Linux 内核的主要功能和运行机制,这样就能缩小范围,有的放矢地使用各种工具去定位问题。

大牛花了挺多年才修炼出来的功夫,现在小A有一个机会可以迎头赶上,就是看懂《庖丁解牛Linux操作系统分析》这本书,建立起对 Linux 底层逻辑的认知,成为像大牛一样了不起的程序员。

Linux 内核的代码量是相当庞大的,本书采用的 Linux-5.4.34 版本内核,就超过了 1800 万行代码。要如何分解这样一头“巨牛”?本书将此过程分为三步,我们来逐步破解。

第一步:了解计算机系统的基本原理,搭建 Linux 内核调试环境。

本书首先对 Linux 社区规则、起源发展做了介绍,然后以国产 Linux 操作系统 openEuler 为例,对常用系统命令进行说明。这对于首次接触 Linux 的同学们来说是一个轻松开局。

内核与计算机硬件有着紧密的联系,因此从存储程序原理讲起,进而理解计算机的体系结构。然后讲解 x86 与 ARM64 两种处理器体系的汇编语言基础,有了这些知识,就可以在虚拟 CPU 上搭建精简内核开发平台 mykernel。

本书强调实战性,对于搭建 Linux 内核调试环境给出了详细的步骤,包括下载源码、配置编译选项、编译命令、加载内核、制作内存根文件系统等。并以 gdb 跟踪分析 start_kernel 函数为例,说明调试内核的方法。

第二步:知道程序是怎么在操作系统上运行的。

先深入理解 Linux 系统调用,本书详细说明了在 32 位 x86、x86-64 和 ARM64 三种架构下,分别用 C 语言标准库 API 和汇编语言代码两种方式触发系统调用。深入说明系统调用在 Linux 内核源代码中的实现。

然后是分析进程创建的过程,围绕进程描述符展开论述,包括进程状态、进程链表结构、进程关键上下文。还有对进程地址空间与大页内存的说明。重点讨论了子进程执行的起止状态。

接下来就是理解一个磁盘上的二进制可执行文件转变为进程的过程。本书讲解了 Linux 可执行程序的 ELF 文件格式、编译过程、链接和装载过程,以及进程调度与切换的过程。

最后掌握 Linux 中断处理与内核线程的知识,以设备驱动程序为例给出了中断处理和内核线程的实际应用场景。

第三步:进阶 Linux 系统架构、虚拟机和容器、系统安全技术。

到这一步,对 Linux 内核的核心概念建立了体系化认知,再来了解 Linux 系统的软件架构。本书论述了 Linux 操作系统执行过程中的 5 种特殊情况,然后分别从层次架构、空间结构和执行路径上讨论了 Linux 操作系统的软件架构。

KVM(Kernel-based Virtual Machine)是当前最主流的虚拟机技术之一,本书重点讨论了 CPU 的虚拟化、内存的虚拟化和 I/O 的虚拟化。并介绍了两种典型的虚拟机实现,分别是传统的 QEMU 虚拟机实现,以及轻量化的 StratoVirt 虚拟机实现。

理解 Linux 容器技术,在业界广泛应用的 Docker 就是一款开源容器应用引擎,它的根基是三项底层关键技术:chroot、namespace、cgroup。本书对使用这些底层技术创建容器进行了说明。

最后是 Linux 安全的议题,本书探讨了 Linux 的基本安全机制,包括 Linux 权限、Capabilities、AppArmor、SELinux 等,并结合云化带来的数据安全和机密计算趋势,进一步以 openEuler 上的可信计算和 secGear 框架为例讨论了可信计算和机密计算。

这三步走下来,是从宏观理论深入到具体实现,再到技术系统化应用的过程。相信同学们已经穿越了迷雾,对 Linux 系统运作了如指掌。

从庖丁解牛这个典故再来温习学习 Linux 的过程。

一开始“所见无非牛者”,在这个阶段会使用 Linux 命令行工具,能编写代码实现功能,但不了解系统底层机理。眼中所见的 Linux 是铁板一块,遇到问题却找不到方向。

到“三年之后,未尝见全牛也”,这是因为脑海里浮现的已经是牛的内部肌理、筋骨了。将 Linux 底层吃透,就达到了“一眼看到问题根源所在”的境界,无它,来龙去脉皆在掌握之中也。

看《庖丁解牛Linux操作系统分析》,程序员突破 Linux 底层机理,建立系统化认知绝用不了三年。因为本书以代码为中心,理论和实践相结合,以系统化的视角深入分析 Linux 系统运转的结构特征和关键环节。

同时本书以形象生动的语言对抽象的技术点进行描述,例如以“庄周梦蝶”来解释进程切换,是不是很有趣?其他还有“三大法宝”、“两把宝剑”,等着你们去探索。

作为一名程序员,仅是掌握编程技能解决业务问题还是不够的,还需要对 Linux 内核系统有充分的了解,做到“运用之妙,存乎一心”,成为真正了不起的程序员。

来源:小甜甜论科技

相关推荐