802.11 学习

本文的内容已经整合到知识库中。 背景 最近在学习 802.11,在博客上记录一下我的学习过程。 本文参考了 802.11-1997 并使用了标准中的图片。 MAC 层帧格式 802.11 MAC 层的帧格式,如 802.11-1997 Figure 12: 前两个字节 Frame Control 的定义如 802.11-1997 Figure 13: 根据 Type 和 Subtype 字段决定了帧的类型,如管理(Management)帧,控制(Control)帧和数据(Data)帧。 无线路由器定期发送 Beacon frame,告诉客户端自己广播了哪些 SSID。客户端也可以主动发送 Probe Request frame 来询问有没有路由器有对应的 SSID,如果有,路由器回复一个 Probe Response frame。 PHY 802.11 支持很多种 PHY,常见的有 802.11 b/g/n/ac/ax。起名也很有意思: 802.11b: High Rate,最高 11 Mbps 802.11g: Extended Rate,最高 54 Mbps 802.11n: High Throughput,最高 600 Mbps 802.11ac: Very High Throughput,最高 6933 Mbps 802.11ax: High Efficiency,最高 9608 Mbps 802.

Read More

数字调制

背景 最近在学习 802.11,需要学习很多数字调制相关的知识,因此自学了一下通信原理。 ASK Amplitude-Shift Keying 调整载波信号的幅度 FSK Frequency-Shift Keying 调整载波信号的频率 PSK Phase-Shift Keying 调整载波信号的相位 DPSK(Differential Phase-Shift Keying) 是在 PSK 的基础上,把相位的绝对值变成相位的差。例如 BPSK 传输 0 对应 0 度相位,传输 1 对应 180 度相位,那么 DBPSK 传输 0 时保持相位和上一个 symbol 一样,传输 1 时相位相对上一个 symbol 增加 180 度。 QAM Quadrature Amplitude Modulation 两个正交载波信号之和,调整两个信号的相位和幅度 4-QAM 4-QAM 也等价于 4-PSK(Phase-Shift Keying),相当于调整一个载波信号的相位。 16-QAM

Read More

在 Linux 上使用 Netgear A6210 USB 无线网卡

背景 最近要让一台 Linux 机器连接无线网,所以要买一个对 Linux 支持比较好的 USB 无线网卡。以前曾经用过一些 USB 无线网卡,但对 Linux 的支持大多不好,要么是需要 out of tree module,要么就忽然不能工作。因此前期的调研十分重要。 挑选 USB 无线网卡 在调研的时候,发现了 morrownr/USB-WiFi 仓库,里面总结了一些 Linux 支持比较好的 USB 无线网卡,由于是外国人写的,所以里面很多型号在国内都买不到,但实际上 USB 无线网卡的芯片组一般就是那些,所以需要先确定芯片组,再根据芯片组找对应的 USB 无线网卡。 开发用于 USB 无线网卡的厂商常见的是:Mediatek(2011 年 MediaTek 收购了 Ralink)和 Realtek。国内直接买到的 USB 无线网卡大部分是 Realtek,但是 Realtek 的 Linux 驱动很长一段时间都是 out of tree 的状态,只有比较新的一些芯片组有内核支持,而 Mediatek 系列的芯片内核支持较好,缺点是比较贵。下面从上面的仓库里摘录了一些芯片组的 Linux 内核支持情况: Chipset Linux Commit 802.11 USB Bluetooth Package Links MT7601u 4.2+ mt7601u b/g/n 2.0 N/A Official MT7610u 4.19+ mt76x0u b/g/n/ac 2.

Read More

Transport Layer Interface 考古

Transport Layer Interface 现在网络编程主要采用的是 BSD Sockets API,但实际上当年还有另一套 API,就是 TLI(Transport Layer Interface),后来 BSD Sockets 胜出,进入了 POSIX 标准,TLI 后面也标准化为了 XTI,现在可以在部分 Unix 系统中找到。TLI/XTI 的使用方法和 Sockets API 有些类似,但是比较特别的一点在于,Sockets API 第一步是 socket 调用,传的参数就决定了这是 TCP 还是 UDP 还是其他什么协议,而 TLI 是通过打开不同的设备文件来进行区分: int fd = t_open("/dev/udp", O_RDWR, NULL); 比如 TCP 就是 /dev/tcp,UDP 就是 /dev/udp,同理还有 /dev/icmp 等等。这颇有 Unix 的哲学:everything is a file。而 BSD Sockets API 则是有对应的系统调用,libc 基本不需要做什么事情。 沿着这个思路,既然 TLI 第一步是打开一个文件,难道后面的一系列的 bind、connect、send、recv 等操作也是对文件读写吗?是的!如果我们查看 illumos 的源码,会发现 t_connect 函数的核心实现是: creq = (struct T_conn_req *)ctlbufp->buf; creq->PRIM_type = T_CONN_REQ; creq->DEST_length = call->addr.

Read More

OpenBSD xonly 实现原理

背景 最近看到 xonly status,看到 OpenBSD 最近在实现 xonly,也就是让一些页只能执行,不能读不能写。以往类似的做法是 W^X,也就是可以执行的时候不能写,可以写的时候不能执行。显然,xonly 是更加严格的,连读都不可以。查了一下历史,W^X 最早也是在 OpenBSD 中实现的,说不定以后 xonly 也会被各个操作系统实现。 amd64 上的实现 在 amd64 的页表中,决定执行/读/写权限的是(见 Intel 文档 Table 4-20. Format of a Page-Table Entry that Maps a 4-KByte Page): Bit 1(R/W): Read/write; if 0, writes may not be allowed to the 4-KByte page referenced by this entry (see Section 4.6) Bit 63(XD): If IA32_EFER.NXE = 1, execute-disable (if 1, instruction fetches are not allowed from the 4-KByte page controlled by this entry; see Section 4.

Read More

Solaris 11.4 安装

下载安装镜像 访问 https://www.oracle.com/solaris/solaris11/downloads/solaris-downloads.html,点击下载,登录后跳转到一个新的页面。在 Platform 下拉框选择 x86,会出现一系列可以下载的文件。以 11.4.42.111.0 为例,需要下载的是:V1019840-01.iso Oracle Solaris 11.4.42.111.0 Interactive Text Install ISO (x86) for (Oracle Solaris on x86-64 (64-bit)), 890.5 MB。可以直接在浏览器中下载,也可以点击网页中的 WGET Options,用 wget 脚本下载。 下载以后,挂载 ISO 到虚拟机,正常按照指示进行安装 配置软件源 Solaris 的在线软件源需要订阅,如果不想订阅,需要下载和 Solaris 版本一致 的 IPS 仓库。下载的地址和上面一样,需要 7 个 zip 文件,如 V1019847-01_1of7.zip Oracle Solaris 11.4.42.111.0 IPS Repository (SPARC, x86) for (Oracle Solaris on x86-64 (64-bit)), 2.2 GB。建议用 wget 脚本批量下载。 UPDATE: 根据 https://blogs.oracle.com/solaris/post/building-open-source-software-on-oracle-solaris-114-cbe-release,实际上可以不下载 IPS 仓库,而是用在线的仓库,内容和下载的一致: sudo pkg set-publisher -G '*' -g http://pkg.

Read More

FreeBSD/NetBSD/OpenBSD/DragonFlyBSD Cookbook

背景 最近在维护 lsof 的时候,需要在 FreeBSD/NetBSD/OpenBSD/DragonFlyBSD 上进行开发和测试,于是就装了虚拟机,特此记录我在使用过程中,与 Linux 不一样的一些常用 FreeBSD/NetBSD/OpenBSD/DragonFlyBSD 命令。 FreeBSD 文档参考:https://docs.freebsd.org/en/books/handbook 安装 在 https://www.freebsd.org/where/ 找到最新版下载,对于虚拟机的需求,用 -disk1.iso,1 GB 左右。安装过程按照 UI 一步步走即可。 root 权限 FreeBSD 的 su 默认只有 wheel 组可以 su 到 root,所以安装的时候,建议给创建的帐号加上 wheel 组。也可以通过 pw 命令: pw groupmod wheel -m freebsd sudo 需要通过包管理器安装,用法和 Linux 一样。 包管理 使用 pkg 命令进行包管理: pkg update pkg install -U sudo vim fish -U 表示在 install 的时候不要再 update。 也可以从 Ports 源码编译,如: git clone https://git.FreeBSD.org/ports.git /usr/ports cd /usr/ports/sysutils/lsof make install 升级 使用 freebsd-update 命令升级:

Read More

在 FreeBSD 上运行 code-server

背景 最近在 FreeBSD 上移植开源软件,但是因为 vscode 官方不支持 FreeBSD,所以尝试使用 code-server 使用 首先按照官方文档安装 code-server: curl -fsSL https://code-server.dev/install.sh | sh 启动 code-server: code-server --bind-addr 0.0.0.0:8080 但是很快你会发现,运行日志中会报告很多错误,缺少了一些包: sudo npm i -g yazl yauzl @microsoft/1ds-core-js vscode-regexpp xterm-headless vscode-proxy-agent --unsafe-perm 到这里就能在网页里看到 UI 了,但是发现很多功能都不工作。例如搜索的时候,会告诉你找不到 rg,是因为 ripgrep 没有提供 FreeBSD 的 prebuilt binary,但是可以用 pkg 安装: sudo pkg install ripgrep cd /usr/local/lib/node_modules/@vscode/ripgrep/bin && ln -s /usr/local/bin/rg cd /usr/local/lib/node_modules/code-server/lib/vscode/node_modules/@vscode/ripgrep/bin && ln -s /usr/local/bin/rg 然后,日志中会显示 @parcel/watcher 启动失败,显示 Undefined symbol,这是因为这个库没有做 FreeBSD 支持。需要使用 https://github.com/parcel-bundler/watcher/pull/128 版本,编译出 watcher.

Read More

CHI 学习笔记

本文的内容已经整合到知识库中。 CHI 介绍 CHI 协议是 AMBA 5 标准中的缓存一致性协议,前身是 ACE 协议。最新的 CHI 标准可以从 AMBA 5 CHI Architecture Specification 处下载。 相比 AXI,CHI 更加复杂,进行了分层:协议层,物理层和链路层。因此,CHI 适用于片上网络,支持根据 Node ID 进行路由,而不像 AXI 那样只按照物理地址进行路由。CHI 的地位就相当于 Intel 的环形总线。CHI 也可以桥接到 CCIX 上,用 CCIX 连接 SMP 的的多个 Socket,或者连接支持 CCIX 的显卡等等。 缓存行状态 首先回顾 ACE 的缓存行状态,共有五种,与 MOESI 相对应: UniqueDirty: Modified SharedDirty: Owned UniqueClean: Exclusive SharedClean: Shared Invalid: Invalid 在此基础上,CHI 考虑缓存行只有部分字节有效的情况,即 Full,Partial 或者 Empty。因此 CHI 的缓存行状态共有七种: UniqueDirty: Modified UniqueDirtyPartial: 新增,可能有部分字节合法,在写回的时候,需要和下一级缓存或者内存中的合法缓存行内容进行合并 SharedDirty: Owned UniqueClean: Exclusive UniqueCleanEmpty: 新增,所有字节都不合法,但是本缓存占有该缓存行,如果要修改的话,不需要通知其他缓存 SharedClean: Shared Invalid: Invalid 可以看到,比较特别的就是 UniqueDirtyPartial 和 UniqueCleanEmpty。CHI 标准在 4.

Read More

Intel 处理器

Xeon 系列 命名方式: 第一位数字:8-9 对应 Platinum,5-6 对应 Gold,4 对应 Silver,3 对应 Bronze 第二位数字:对应代次,1 对应 1st Generation,2 对应 2nd Generation,依此类推 第三位第四位数字:一般越大性能越好 后缀:H/L/M/N/P/Q/S/T/U/V/Y/Y+/+ L:大内存 M:媒体/大内存 N:网络 P:虚拟化,IaaS Q: 水冷 S:存储/搜索 T:长寿命 U:单插槽 V:虚拟化,SaaS Y: Speed Select 4th Generation Intel® Xeon® Scalable Processors/Xeon CPU Max Series CPU 型号列表 Xeon CPU Max 型号列表 发布时间:Q1'23 代号:Sapphire Rapids/Sapphire Rapids HBM 用途:Server 旗舰:Xeon CPU Max 9480(56C112T,112.5 MB L3,HBM)/Xeon Platinum 8490H(60C120T,Golden Cove,112.5 MB L3)/Xeon Platinum 8480+(56C112T,105 MB L3) 3rd Generation Intel® Xeon® Scalable Processors CPU 型号列表 发布时间:Q2'21(Ice Lake), Q2'20(Cooper Lake) 代号:Cooper Lake/Ice Lake 用途:Server 旗舰:Xeon Platinum 8380(40C80T,Sunny Cove,60 MB L3) 相关阅读:Ice Lake 2nd Generation Intel® Xeon® Scalable Processors CPU 型号列表 发布时间:Q1'20, Q2'19 代号:Cascade Lake 用途:Server 旗舰:Xeon Platinum 9282(56C112T),Xeon Platinum 8280(28C56T,38.

Read More