软件开发底层知识修炼
偏向于底层,更接近于操作系统,学会这些,对后期做java开发,C++开发等后台类的开发有极大地领悟性的辅助。
杨柳_
Java服务端研发,喜欢底层原理与基础算法设计
展开
-
【软件开发底层知识修炼】二十八 C/C++中volatile的作用
上一篇文章学习了C/C++中的指针与数组的区别,点击链接进行查看:【软件开发底层知识修炼】二十七 C/C++中的指针与数组是不同的本篇文章将学习volatile关键字在C/C++中的作用文章目录1 实例代码分析2 问题分析3 解决方案4 拓展: const和volatile4 总结1 实例代码分析在讲解volatile关键字的作用之前,我们先来看一个代码的例子,代码如下:m...原创 2019-01-14 22:26:21 · 1503 阅读 · 6 评论 -
【软件开发底层知识修炼】二十七 C/C++中的指针与数组是不同的
上几篇文章学习了ABI-应用程序二进制接口:【软件开发底层知识修炼】二十六 ABI-应用程序二进制接口 学习总结文章目录本篇文章就指针与数组的联系与区别来学习学习文章目录1 疑问2 指针与数组是不相等的3 解决疑问4 总结1 疑问在具体用文字理论来说明指针与数组的区别之前,先看一下下面的代码例子,这两个程序输出的结果是一样的么?不一样的话,分别输出什么?main.c#i...原创 2019-01-13 16:33:04 · 1229 阅读 · 1 评论 -
【软件开发底层知识修炼】二十六 ABI-应用程序二进制接口 学习总结文章目录
前面学习了ABI的知识,感觉受益良多。对底层与编译器有更加深刻的认识,为此这里将前面写过的关于ABI 的文章给列出来,方便学习与翻阅。【软件开发底层知识修炼】二十一 ABI-应用程序二进制接口一【软件开发底层知识修炼】二十二 ABI-应用程序二进制接口 二【软件开发底层知识修炼】二十三 ABI-应用程序二进制接口三之深入理解函数栈帧的形成与摧毁【软件开发底层知识修炼】二十四 A...原创 2019-01-08 23:58:53 · 1626 阅读 · 2 评论 -
【软件开发底层知识修炼】二十五 ABI之函数调用约定二之函数返回值为结构体时的约定
上一篇文章学习了几种函数调用约定的区别,点击链接查看上一篇文章:【软件开发底层知识修炼】二十四 ABI之函数调用约定本篇文章继续学习函数调用约定中,关于函数返回值的问题。当函数返回值为结构体时,函数返回值是如何来传给调用者的。文章目录1 函数返回值为结构体类型1.1 函数返回值用于初始化变量1.2 函数返回值给变量赋值2 代码案例分析3 总结1 函数返回值为结构体类型前一篇文章...原创 2019-01-08 23:48:29 · 1580 阅读 · 1 评论 -
【软件开发底层知识修炼】二十四 ABI之函数调用约定
上一篇文章学习了Linux环境下的函数栈帧的形成与摧毁。点击链接查看相关文章:软件开发底层知识修炼】二十三 ABI-应用程序二进制接口三之深入理解函数栈帧的形成与摧毁本篇文章继续学习ABI接口相关的内容。函数调用约定文章目录1 函数参数如何入栈,返回值在哪里2 函数调用约定的编程实验2.1 使用gdb调试代码证明eax存的值是函数返回值2 .2 查看程序的反汇编文件来说明调用约定的不...原创 2019-01-08 23:07:36 · 1538 阅读 · 0 评论 -
【软件开发底层知识修炼】二十三 ABI-应用程序二进制接口三之深入理解函数栈帧的形成与摧毁
上两篇文章我们初步接触了ABI-应用程序二进制接口的概念,点击链接查看上一篇文章:【软件开发底层知识修炼】二十二 ABI-应用程序二进制接口 二。了解了为什么会有ABI的存在。本篇文章继续学习ABI 的内容。学习在ABI规范下,函数栈帧的结构与函数调用时函数栈帧的详细变化。文章目录1 什么是函数栈帧1.1 函数栈帧中ebp寄存器1.2 Linux系统中的栈帧布局2 函数调用时的‘前言’...原创 2019-01-07 14:12:14 · 1639 阅读 · 0 评论 -
【软件开发底层知识修炼】二十二 ABI-应用程序二进制接口 二
上一篇文章学习了ABI的相关内容,具体最后分析了不同ABI下结构体的对齐方式的不同。点击链接查看上一篇文章:【软件开发底层知识修炼】二十一 ABI-应用程序二进制接口一本篇文章继续学习ABI相关内容。是上一篇文章的补充,如果没有看过上一篇文章,一定要看上一篇文章。文章目录1 ABI定义了硬件寄存器的作用2 ABI下的函数调用约定3 总结1 ABI定义了硬件寄存器的作用我们熟悉的...原创 2019-01-03 20:30:38 · 824 阅读 · 0 评论 -
【软件开发底层知识修炼】二十一 ABI-应用程序二进制接口一
前面学习了可执行程序的结构,点击链接查看上一篇文章:【软件开发底层知识修炼】二十 深入理解可执行程序的结构本篇文章开始新的篇章,学习应用程序的二进制接口-ABI。文章目录1 什么是ABI(Application Binary Interface)1 ABI的广义与侠义概念2 什么是EABI(Embedded Application Binary Interface)3 ABI规范示例...原创 2019-01-03 19:51:26 · 2348 阅读 · 3 评论 -
【软件开发底层知识修炼】二十 深入理解可执行程序的结构
上一篇文章记录了GDB调试从入门到熟练掌握的学习全过程。点击链接查看:【软件开发底层知识修炼】十九 GDB调试从入门到熟练掌握超级详细实战教程学习目录还记得在以前的学习Binutils工具的时候,学习了很多工具来查看可执行程序的结构,那个时候并没有详细说明程序的结构,今天就来学。下面是之前学习的Binutils工具集的几篇文章,可以参考学习:【软件开发底层知识修炼】六 Binutils辅助...原创 2018-12-27 22:26:13 · 2156 阅读 · 0 评论 -
【软件开发底层知识修炼】十九 GDB调试从入门到熟练掌握超级详细实战教程学习目录
本文记录之前写过的5篇关于GDB快速学的文章,从第一篇开始学习到最后一篇,保证可以从入门GDB调试到熟练掌握GDB调试的技巧。学习交流加个人qq:1126137994个人微信:liu1126137994学习交流资源分享qq群:962535112文章目录:【软件开发底层知识修炼】十四 快速学习GDB调试一 入门使用【软件开发底层知识修炼】十五 快速学习GDB调...原创 2018-12-23 23:52:57 · 1355 阅读 · 0 评论 -
【软件开发底层知识修炼】十八 快速学习GDB调试五 使用GDB进行调试的一些小技巧
上一篇文章学习了如何使用GDB进行函数调用栈的查看:【软件开发底层知识修炼】十六 快速学习GDB调试四 使用GDB进行函数调用栈的查看本篇文章是GDB调试快速学习系列的最后一篇。将综合前几篇文章做一个小的总结以及介绍一些在调试中使用的小技巧文章目录1 调试中的小技巧1.1 断点处自动打印示例1.2 使用GDB进行符号查看2 使用GDB进行代码调试中的技巧代码案例分析3 总结1 调...原创 2018-12-23 23:25:13 · 1139 阅读 · 0 评论 -
【软件开发底层知识修炼】十七 快速学习GDB调试四 使用GDB进行函数调用栈的查看
上一篇文章学习了如何使用GDB数据断点进行内存监测:【软件开发底层知识修炼】十五 快速学习GDB调试三 使用GDB的数据断点监测变量是否改变本篇文章继续上一篇文章的学习:如何使用GDB进行函数调用栈的查看文章目录1 backtrace和frame2 使用GDB进行函数调用栈的查看的实际代码案例1 backtrace和frame一般来说,查看函数调用栈,主要是为了研究函数的调用过...原创 2018-12-23 21:28:48 · 1987 阅读 · 0 评论 -
【软件开发底层知识修炼】十六 快速学习GDB调试三 使用GDB的数据断点监测变量是否改变
上一篇文章我们学习了如何使用GDB进行软件断点调试和硬件断点调试:【软件开发底层知识修炼】十五 快速学习GDB调试二 使用GDB进行断点调试本篇文章继续上一篇文章的学习,如何使用GDB的数据断点监测内存中的变量是否被改变文章目录1 GDB的数据断点1.1 利用查看内存的x命令进行系统大小端的判断2 使用GDB进行监视变量的改变与查看内存实际代码案例分析3 总结1 GDB的数据断点先...原创 2018-12-23 15:37:06 · 2665 阅读 · 0 评论 -
【软件开发底层知识修炼】十五 快速学习GDB调试二 使用GDB进行断点调试
上一篇文章我们学习了使用GDB的最基本方法:【软件开发底层知识修炼】十四 快速学习GDB调试一入门使用本篇文章将学习GDB的断点调试。断点调试是一种非常重要的调试方法。文章目录1 断点类型2 GDB软件断点调试相关操作2.1 通过函数名设置断点2.2 通过文件名行号设置断点2.3 其他操作3 GDB硬件断点及其应用4 GDB断点调试实际案例4.1 GDB软件断点调试实际案例4...原创 2018-12-21 20:12:58 · 1222 阅读 · 0 评论 -
【软件开发底层知识修炼】十四 快速学习GDB调试一 入门使用
前面几篇文章学习了链接器相关的内容。现在开始来学习GDB调试。我们的目的是通过这几篇文章将GDB调试完全学会。1 为什么需要GDB什么是GDB?GNU项目中的调试器(gnu debuger)能够跟踪程序的执行,也能够恢复程序执行前的状态为什么需要GDB?软件不是一次性开发完的,是软件就一定有bug,所以需要调试工具来定位bug调试是软件开发过程中不可或缺的部分...原创 2018-12-21 11:31:08 · 1713 阅读 · 0 评论 -
【软件开发底层知识修炼】十三 链接器-如何写出不依赖C库函数的代码
本文将综合以下4篇文章,学习如何写出不依赖libc库的程序:【软件开发底层知识修炼】九 链接器-可重定位文件与可执行文件【软件开发底层知识修炼】十 链接器-main函数不是第一个被执行的函数【软件开发底层知识修炼】十一 链接器-链接脚本【软件开发底层知识修炼】十二 C/C++语言中内嵌汇编语言(asm)如果没有看上面4篇文章的,建议先按照顺序学习上述4篇文章,再来看这篇文章,不然有...原创 2018-12-20 16:59:32 · 1552 阅读 · 0 评论 -
【软件开发底层知识修炼】十二 C/C++语言中内嵌汇编语言(asm)
上一篇文章学习了链接脚本的语法与相关概念:链接脚本的概念在继续学习链接器的内容的同时,先学习一个新内容:内嵌汇编。GCC编译器一般支持C/C++内嵌汇编语言,这样可以实现语言本身无法实现的内容。我们本文主要介绍C语言中的内嵌汇编,C++语言也是一样的规则。首先要知道以下内容x86汇编的两种语法:intel语法和AT&T语法x86汇编一直存在两种不同的语法,在intel的官方文档中...原创 2018-12-13 22:33:23 · 3444 阅读 · 0 评论 -
【软件开发底层知识修炼】十一 链接器-链接脚本
上一篇文章学习了链接器之-main函数不是第一个执行的函数:main函数不是第一个执行的函数今天继续学习链接器,学习链接是如何动作的,从而引入链接脚本的概念。本文就学习链接脚本的概念。1、链接脚本的作用我们都知道可重定位文件经过链接器链接后最终形成可执行文件。这个链接的过程大概就是分为符号解析和重定位。那么链接器到底是如何工作的呢?这取决于链接脚本。我们可以看下图:几个可重定位文件与相...原创 2018-12-12 22:59:23 · 1601 阅读 · 0 评论 -
【软件开发底层知识修炼】十 链接器-main函数不是第一个被执行的函数
上一篇文章,大概了解了链接器的工作内容就是:符号解析和重定位。点击上一篇文章查看:点击查看。本片文章其实还是围绕链接器来学习。只不过不是很明显,当你学到下一篇文章时,就明白了。本篇文章来弄明白一个问题:在C/C++程序被加载到内存中准备运行时,main函数是第一个被执行的函数么?答案肯定不是!如果是,就没必要去写这个文章了!!!1、_start()函数先说结果:_start() 是第一个被...原创 2018-12-11 00:11:03 · 1322 阅读 · 0 评论 -
【软件开发底层知识修炼】九 链接器-可重定位文件与可执行文件
上几篇文章学习了Binutils辅助工具里面的几个实用的工具,那些工具对于以后的学习都是非常有帮助的,尤其是C语、C++语言的学习以及调试是非常有帮助的。点击链接查看上一篇文章:点击查看本篇文章开始一个新的知识的学习,链接器的学习。学习完链接器的系列文章,我们将全面了解链接器的工作原理。注意:本文讲解的并不是很详细,有些关键词例如符号、重定位、段等都没有具体说。这些比较原始的知识最好先去阅读相...原创 2018-12-10 23:21:48 · 3233 阅读 · 0 评论 -
【软件开发底层知识修炼】八 Binutils辅助工具之- objdump工具 与 size,strings工具
上一篇文章学习了ar工具与nm工具,点击链接查看上一篇文章:点击链接本片文章学习记录以下三个工具:objdumpsizestrings1、objdump工具用法:反汇编目标文件,查看汇编到源码的映射(后面代码案例分析看具体区别)objdump -d func.oobjdump -S func.o查看目标文件中的详细段信息objdump -h test.o...原创 2018-12-08 01:38:48 · 1653 阅读 · 1 评论 -
【软件开发底层知识修炼】七 Binutils辅助工具之- ar工具与nm工具
上一篇文章学习addr2line与strip工具。点击链接查看上一篇文章:点击查看本篇文章学习两个工具:ar与nm工具。1、ar工具ar工具很简单,用于将目标文件打包生成库或者将目标文件从库中解压出来ar crs libname.a x.o y.o 将x.o y.o打包生成libname.a库ar x libname.a 将libname.a库解压2、nm工具nm工具用...原创 2018-12-08 00:55:07 · 1483 阅读 · 0 评论 -
【软件开发底层知识修炼】六 Binutils辅助工具之- addr2line与strip工具
上一篇文章我们学习了gcc编译器的相关内容。点击查看上一篇文章:gcc编译器。本篇文章接着上一篇文章,学习GNU为GCC提供的辅助开发工具集Binutils。Binutils工具集,主要是用于在代码调试的时候,定位bug的一些手段。我们主要学习以下几个工具的使用:本篇文章先学习使用addr2line与strip工具。1、addr2line工具首先我们要知道,gcc编译程序的时候,加上-g选...原创 2018-12-07 23:56:53 · 1968 阅读 · 0 评论 -
【软件开发底层知识修炼】五 gcc-C语言编译器
前面的四篇文章终于把处理器系列学完了(点击查看上一篇文章:高速缓存与TLB)。收货很大!!! 接下来就该学习底层软件部分知识。今天学习gcc的基本概念与简单用法。1、GCC与gccGCC (GNU Compiler Collection)GNU 编译器集合,包含众多语言的编译器,包括C,C++,Java等等GCC多用于嵌入式操作系统的编译,如Linux,VxWorks,Android...原创 2018-11-26 00:45:03 · 2439 阅读 · 0 评论 -
【软件开发底层知识修炼】四 深入浅出处理器之四 结合高速缓存以及TLB与虚拟内存
上一篇文章学习了(点击链接查看上一篇文章上一篇文章):虚拟内存的概念与交换区的概念MMU的作用虚拟内存机制的意义虚拟内存作为内存管理工具虚拟内存作为内存保护工具页表的概念页命中与缺页程序的局部性在虚拟内存中的作用MMU的地址翻译过程0、回顾回顾上一篇文章,这里再补充一下:当页命中时,CPU硬件执行的步骤注释:VA:虚拟地址 PTE...原创 2018-11-25 00:33:01 · 2455 阅读 · 0 评论 -
【软件开发底层知识修炼】三 深入浅出处理器之三 内存管理与内存管理单元(MMU)
上一篇文章学习了中断的概念与意义,以及中断的应用-断点调试原理。点击链接复习上一篇文章:中断的概念与意义本片文章继续学习处理器相关的知识-内存管理。包括:内存管理单元MMU的作用,虚拟内存与物理内存之间的映射方式,页表的概念,高速缓存(Cache)的作用,物理内存与高速缓存之间的映射关系等。当然,想要深入了解,本文并不适合,本文只是从原理上,讲述以上几者之间的关系。1、内存管理单元MMU这里...原创 2018-11-22 00:46:06 · 5751 阅读 · 2 评论 -
【软件开发底层知识修炼】二 深入浅出处理器之二 中断的概念与意义
上一篇文章我们学习了微处理器与微控制器的区别。点击链接查看上一篇文章的内容:微处理器与微控制器本片文章我们学习中断的概念与意义。本片文章只学习中断概念与意义,并不深入研究中断向量表与ISR中断服务程序的实现。同时本片文章讲解一个与中断有关的应用:断点调试。当然具体的断点调试方法会在后面讲解,本次只是说明中断在断点调试中的应用。1、中断的概念与意义1.2、 中断的概念中断是一种处理器与外设...原创 2018-11-17 11:47:03 · 2774 阅读 · 1 评论 -
【软件开发底层知识修炼】一 深入浅出处理器之一 微处理器与微控制器
深入浅出处理器这几篇文章可能你觉得对软件开发用处不大,这个看个人理解吧,若是想贯通上下,知其然还要知其所以然的话,或许还是有点用处的。学习处理器的篇章非常少,花一点时间学一下也无所谓的!在我之前还是做硬件的时候,我一直不理解微处理器和微控制器的区别。之前写过一篇文章,讲X86处理器的,可以点击查看:X86处理器1、 处理器处理器分为两种:微处理器和微控制器。微处理器与微控制器有以下区别:...原创 2018-11-15 00:02:44 · 3957 阅读 · 1 评论