0%

本文参考System V ABI: AMD64 Architecture Processor Supplement,并且不考虑__float128__m128__m256__m512等类型的参数的传递和作为返回值的情况。

主要内容:

  • 函数调用相关的常用寄存器
  • 函数调用时的stack frame:可省略的%rbp和red-zone
  • 函数调用时参数的传递:参数分类,不同类型参数的传递方式
  • 函数返回值的处理
Read more »

Singleton是GoF Design Patterns中提及的面向对象的23种设计模式之一,书中关于Singleton的定义如下

Ensure a class only has one instance, and provide a global point of access to it

实践中,一般Singleton被认为是:

  • 在程序的整个寿命周期中,只能拥有一个实例的类
  • 提供一个在全局能够访问该唯一实例的方法

本文解决以下问题:

  • 为什么我们需要Singleton
  • “Magic Static” 与 libsupc++ 中 “Magic Static” 的实现
  • 如何使用 “Magic Static” 实现 Singleton
  • Singleton 有哪些不足
Read more »

Linux 的等待队列(wait queue)是实现 阻塞 I/O 和 I/O复用 (select, poll, epoll 等)的关键同步原语。

本文基于Linux 5.7,主要介绍:

  • wait queue 的数据结构 和 创建方式
    • wait_queue_head : DECLARE_WAIT_QUEUE_HEAD, init_wait_queue_head
    • wait_queue_entry: DECLARE_WAIT_QUEUE, init_wait_queue_entry, init_waitqueue_func_entry
  • wait queue 的手动添加和删除的API

    • add_wait_queueadd_wait_queue_exclusive
    • remove_wait_queue
  • wait queue 的基本API

    • wait_event系列macro
    • wake_up系列macro
      • 使用WQ_FLAG_BOOKMARK来分段遍历,减少单次对自旋锁的占用时间。
      • 使用WQ_FLAG_EXCLUSIVE来实现单独唤醒,避免“惊群”。
  • 结合eventfd的实现来分析 wait queue 的使用

Read more »

编译器在完成阶段7和阶段8后,会生成目标文件。在Linux平台上,目标文件的格式为 ELF (executable linkable file)。ELF也是动态库、静态库、可执行文件和core dump文件的格式。本文会介绍:

  • ELF文件的结构:
    • ELF Header,
    • Section header table,
    • String Table
    • Symbol Table
    • Relocation Table
  • 局部符号LOCAL,全局符号GLOBAL和弱全局符号WEAK
Read more »

编译的过程为编译原理所涉及的内容,不做展开。

主要关注:

  • 模板在阶段7,8进行的两阶段查找
  • 模板为何要放到头文件中:包含编译模式(inclusion model)
  • 最常见的编译器实现:贪婪具现化(greedy instantiation)
Read more »

C++ 程序从源文件到可执行文件,要经历9个翻译阶段。可以将一般认为的C++源文件到可执行文件的4个阶段模糊地和这9个翻译阶段相对应:

  • 预处理(prepressing):翻译阶段1-6
  • 编译(compile)、汇编(assembly):翻译阶段7-8
  • 链接(Linking):翻译阶段9

本文介绍翻译阶段1-6的全部过程:

  1. 源文件字符集到基本源字符集的映射
  2. 处理续行符
  3. 分解源文件,恢复始字符串字面量,去掉注释。
  4. 递归预处理
  5. 字面量从 源字符集执行字符集 的转换
  6. 拼接相邻的字符串字面量。

可以看到大部分阶段都和字符集的转换字面量的处理相关。
一个非原始字符串字面量字符串字面量或一个字符字面量,先从源文件字符集 映射 源字符集,之后又从源字符集 映射到 执行字符集

Read more »