Oops, panicking!

作·个人笔记本/知识库

ELF 是如何运行起来的?内核篇

Note: 本文主要面对 x86_64 架构。 ELF 首先还是要对 ELF 有一点简单的了解,以下内容主要来源 man 5 elf,也比较建议对着这个手册去查阅相关的内容。 一般而言,ELF 有三个头部,ELF Header、Program Headers、Section Headers: ELF Header 存放着关于 ELF 的信息,通常比较重要的有: e_ident 包含 我们熟知的 ELF magic,所有 ELF 二进制开头四个字节都需要是 \x7fELF;另外还有其他的一些杂项 e_type 标识这个二进制是哪种类型,二进制或者共享库(注意并非所有二进制都是 ET_EXEC,也可以是 ET_DYN,后面讲述 PIE 会提到) e_machine 标识二进制的目标平台,x86_64 一般就是 EM_X86_64 e_entry 标识二进制的入口,即需要运行的第一行代码的位置,everything starts from here 其他各种偏移、大小等(包括 Program Headers 和 Section Headers 等) Program Headers 则是个数组,存放着每个段(segment)的信息,包括段类型、偏移、大小、权限等等;通常用的比较多的段类型有: PT_LOAD 这部分指示哪些段需要被载入到内存中,通常都是包含代码以及数据的部分 PT_INTERP 这部分指示了 dynamic linker 的路径,x86_64 Linux 下通常都是 /lib64/ld-linux-x86-64....

October 31, 2021

浅入 x86 内存序

内存序(Memory Order) 在 x86 中,内存屏障通常是不需要的,因为 x86 是比较严格的 TSO(不完全,因为始终没有“官宣”,但是按照定义来说比较接近,而且不同的厂商如 AMD/Intel 之间的实现也存在略微差别)。 百度找到了一份 sc_tso.pdf 讲述了 TSO 的一些特点,其中包括程序顺序(program order)与内存序(memory order)之间的关系: Whether they are to the same or different addresses (i.e., a=b or a≠b). If L(a) <p L(b) ⇒ L(a) <m L(b) /* Load→Load */ If L(a) <p S(b) ⇒ L(a) <m S(b) /* Load→Store */ If S(a) <p S(b) ⇒ S(a) <m S(b) /* Store→Store */ If S(a) <p L(b) ⇒ S(a) <m L(b) /* Store→Load */: Enable FIFO write buffer...

October 10, 2021

译︳.NET 6 带来的性能提升(I)——JIT

原文:https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-6 作者:Stephen 日期:2021/8/17 版权:TBD 这篇文章很有意思,虽然是 .NET 的,但是涉及到 JIT 的那部分却是跟 C/C++ 等二进制语言有点关系;另外我觉得性能优化这种东西无论是哪种语言、哪种架构,都是带有一定共通性的,这篇文章我觉得能够指引我们一些优化的方向、思路等,都是非常有用的。另外文章整体来说通俗易懂,我这种不写 C#(只会一点 Java/Kotlin)的人都能看的懂七八成左右(翻译中一些实在不懂得地方我可能会保留原文,希望能够见谅)。总的来说值得推荐,有条件还是建议看原文(逃。 P.S. 作为初次翻译,以及我个人对 .NET 并不是很熟悉,因此可能有许多(翻译腔式的)不到位、不通顺、甚至意思与原文完全相悖的地方,还请海涵,如您在发现这些错误的同时能通过 GitHub Issue 告知我的话,我将不胜感激。再次感谢您的阅读! 序 四年前,大约是在 .NET Core 2.0 刚发布的时候,我写了一篇 Performance Improvements in .NET Core 来标出数个 .NET 性能提升的例子以及它们的效果,反响非常不错。所以一年后我也同样写了 Performance Improvements in .NET Core 2.1,逐渐地这就成为了一个年度传统。之后是 Performance Improvements in .NET Core 3.0,接着是 Performance Improvements in .NET 5,直到今天。 dotnet/runtime 仓库包含了 .NET 运行时(runtimes)、runtime hosts 以及核心的库。大概一年前仓库的主分支被 fork 出来作为 .NET 6 的开发分支,到发布时分支已经有超过 6500 个已经合并了的 PR(Pull Request),这还没有算上那些例如用于升级依赖版本之类的 bots 自动提交的 PR(这并没有在贬低 bots 的贡献,毕竟它们还真的收到过一些来自求职者的招聘邮件,只是它们可能并不能从中挑选出合适的人1)。就算不需要我审核(review),我也至少仔细看过其中绝大多数的 PR,并且每当我看到一些可能涉及到性能优化的项时,我都会把它们记录在一个列表里,这样我要写文章的时候我就能拿出来重新审视一番了。但当我真正坐下来开始写文章时,发现列表中有将近 550 个 PR,八月也因此过的无比艰巨。但是请放心,我不会把它们全部都列出来,不过还是请准备好一杯你最欢喜的热饮,因为我们即将踏入 ....

September 7, 2021