2020

现代微处理器架构 90 分钟指南

本文翻译自:Modern Microprocessors A 90-Minute Guide!,部分章节翻译来自 cxd2014.github.io,我认为原文是相当好的计算机体系结构方面的概述,与时代相结合是国内计算机课本普遍缺失的一环,本文可作为一个有效的补充,向原作者和前译者表示感谢。

TOC:
1 现代微处理器架构
2 不仅仅是频率
3 流水线和指令级并行
4 深度流水线
5 多发射:超标量
6 显式并行:VLIW
7 指令依赖和延迟
8 分支和分支预测
9 使用谓词执行消除分支
10 指令调度,寄存器重命名和 OOO
11 Brainiac 和 Speed-Demon 之争
12 功耗墙和 ILP 墙
13 x86 介绍
14 线程 :SMT,超线程和多核
15 更多的核心还是更强大的核心
16 数据级并行:SIMD 和向量指令
17 内存和内存墙
18 缓存和存储结构层次
19 缓存的冲突和组相联
20 内存带宽和延迟

使用 qemu 构建 multiarch 调试环境

最近需要一个环境调试一些非 x86 的二进制和学习一下其他体系架构的汇编,最基本的思路是 qemu 启动 qcow2 虚拟机(如果需要模拟调试路由器等设备,可能需要这种办法,现成的 qcow2 镜像可以从类似 https://people.debian.org/~jcowgill/qemu-mips/ 的地方找到),但是有更轻量的用户态方式,本文将简要讨论在 qemu 的支持下,通过 debootstrap + chroot / 容器等方法构建其他指令集架构的系统基本环境,并使用 gdb-multiarch 等工具进行交叉编译、调试。

经历了日夜颠倒的一周,总共耗时70小时之后,我终于打完了这部可能是花费我时间最多的 galgame 作品,久仰 BSD 大名很多年,但是一直觉得坑太大不想开,趁着 steam 官中折扣我终于打定主意要开这个坑。总体上说,BSD 是一款符合我预期的大作,我充分的理解并赞同它在业界的历史地位,因为它真的很难得,抛开本作的 ACT 部分只评价 gal 部分,我将其概括为:技术上是不偏科的全方位佳作、世界线理论的最佳实践;主题上是赛博朋克的集大成者、理想主义的浪漫悲喜剧。

Linux 网络调优:内核网络栈参数篇

网络上流传着很多“Linux 网络一键优化脚本/配置”,并不是说这些配置不好,而是在不知道这些常用内核参数的含义和影响的前提下 xjb 调其实挺危险的,根据使用场景不同和机器配置不同,有些参数调了只是“没用”,而有的调了会引起一些网络玄学故障,本文尝试结合 Linux 网络栈 ingress 和 egress 的基本架构,整理了一下常用的一些参数的含义和相关的用途坑点。

主要有以下部分组成:

  • 简述 Linux ingress 架构
  • backlog 和 skb 相关
  • TIME_WAIT 相关
  • Linux egress 架构和 qos 相关
  • nf_conntrack 相关
  • TCP keepalive 相关
浅谈 Linux 上的 SLAAC:原理、配置和系统行为

TL; DR:本文简要介绍了 IPV6 自动配置的基本概念和原理,并讨论了在 Linux 下自动配置(aka. SLAAC)原理和坑点,其中:

启用 IPV6 SLAAC 并允许内核自动添加 IPV6 默认路由需要使 net.ipv6.conf.{iface}.autoconf = 1 且 net.ipv6.conf.{iface}.accept_ra = 1
如果启用了 net.ipv6.conf.{iface}.forwarding ,则对应网卡接口 accept_ra 需要为 2
上述 iface 既可以是 default/all,也可以是具体某个网卡接口,但是需要特别注意,对于部分 IPV6 配置项,仅修改 net.ipv6.conf.all 时不会应用到全部网卡接口,使用时请确认所需的网卡接口上配置正确。
另外在部分发行版中可能修改 accept_ra 实际不生效,系统可能出现预期外行为(无法自动获取的地址和路由,或配置为不需要 SLAAC 时系统仍会进行配置等),此时可检查系统中是否存在其他网络管理工具如 netplan 造成了遗留影响。