Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
suoyuan666 committed Jan 10, 2025
1 parent c2236d7 commit a1a6352
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 25 deletions.
9 changes: 5 additions & 4 deletions content/posts/c_not_low_level.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
title: "译文: C 不是一个底层编程语言"
author: suo yuan
date: 2024-12-19T02:30:08Z
lastmod: 2025-01-10T10:31:22Z
draft: false
tags:
- C
Expand All @@ -19,9 +20,9 @@ summary: "一篇题为 C Is Not a Low-level Language 的译文"

---

在最近的 Meltdown 和 Spectre 漏洞出现后,值得花一些时间研究根本原因。这两个漏洞都涉及处理器**推测执行**绕过某种访问检查的指令,并允许攻击者通过侧信道观察结果。导致这些漏洞的特性,以及其他一些类似特性,都是为了让 C 程序员继续相信他们是在用一种底层编程语言编程,而实际上,这种情况已经不复存在了几十年。
Meltdown 和 Spectre 漏洞出现后,我们应该花一些时间去研究其根本原因。这两个漏洞都涉及处理器**推测执行**绕过某种访问检查的指令,并允许攻击者通过侧信道观察结果。导致这些漏洞的特性,以及其他一些类似特性,都是为了让 C 语言的程序员继续相信他们是在用一种底层编程语言编程,而实际上,这种情况已经不复存在了几十年。

处理器供应商并不是唯一的参与者。我们这些从事 C/C++ 编译器开发的人也参与其中
处理器供应商并不是导致这一切的罪魁祸首。我们这些从事 C/C++ 编译器开发的人分了一杯羹

> Spectre 和 Meltdown 是大部分现代 CPU 都存在的漏洞。
>
Expand All @@ -41,13 +42,13 @@ summary: "一篇题为 C Is Not a Low-level Language 的译文"

> A programming language is low level when its programs require attention to the irrelevant
虽然这个定义确实适用于 C,但它并没有回应人们对底层编程语言的期望。有各种属性使人们将一种语言视为底层编程语言。可以将编程语言想象为一个连续体,一端是汇编语言,另一端是《星际迷航》中星舰计算机的接口。底层编程语言“接近硬件”,而高级语言更接近人类的思维方式。
虽然这个定义确实适用于 C,但它并没有回应人们对底层编程语言的期望。有很多方面会使人们将一种语言视为底层编程语言。可以将编程语言想象为一个连续体,一端是汇编语言,另一端是《星际迷航》中星舰计算机的接口。底层编程语言“接近硬件”,而高级语言更接近人类的思维方式。

要使一种语言“接近硬件”,它必须提供一种抽象机器,这种抽象能够轻松映射到目标平台所暴露的抽象上。可以很容易地说,C 对于 PDP-11 来说是一种底层编程语言。两者都描述了一种模型:程序按顺序执行,内存是一个平坦的空间,甚至前置和后置自增操作符都与 PDP-11 的寻址模式完美契合。

## PDP-11 仿真器

Spectre 和 Meltdown 漏洞的根本原因在于,处理器架构师试图构建的不仅仅是快速的处理器,而是能够暴露与 PDP-11 相同抽象机器的快速处理器。这一点至关重要,因为它让 C 程序员能够继续相信他们的语言与底层硬件非常接近。
Spectre 和 Meltdown 漏洞的根本原因在于,处理器架构师试图构建的不仅仅是高效的处理器,而是能够暴露与 PDP-11 相同抽象机器的高效处理器。这一点至关重要,因为它让 C 程序员能够继续相信他们的语言与底层硬件非常接近。

C 代码提供了一个大部分是串行的抽象机器(直到 C11,如果排除非标准供应商扩展,它是一个完全串行的机器)。创建新线程是一个已知开销较大的操作,因此希望保持执行单元忙碌运行 C 代码的处理器依赖于 ILP(指令级并行性)。它们检查相邻的操作并并行发出独立的指令。这为允许程序员编写主要是顺序的代码增加了大量复杂性(和功耗)。相比之下,GPU 在没有任何这些逻辑的情况下实现了非常高的性能,代价是需要显式并行的程序。

Expand Down
57 changes: 37 additions & 20 deletions content/posts/gentoo_hardened_guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title: "Gentoo Linux 安全加固指南"
author: suo yuan
date: 2025-01-07T10:00:36Z
lastmod: 2025-01-09T02:03:25Z
lastmod: 2025-01-10T10:31:22Z
draft: false
tags:
- gentoo-linux
Expand All @@ -13,18 +13,17 @@ summary: "我本次安装 Gentoo Linux 所做的一些安全加固手段"

# Gentoo Linux 安全加固指南

> - 2025 年 1 月 8 号修改
> - 2025 年 1 月 8/9/10 号修改
> - 添加了 VSCodium 的 bwrap 启动参数
> - 修改了 sysctl 和内核启动参数部分
> - 2025 年 1 月 9 号修改
> - 添加了 Chromium 的 bwrap 启动参数
> - 添加了 NetworkManager 部分
我一直在寻求一个尽可能不影响日常使用的同时尽量做到安全的操作系统。单论安全性,我认为 [Qubes OS](https://www.qubes-os.org/) 就很不错,但日常使用起来不是很方便。

在我看来,Qubes OS 很不错,但是网络配置看起来不是很容易,并且社区貌似不是很大。

Fedora Silverblue 也是个不错的选择,原子更新,桌面应用大多是从 Flatpak 安装的等,不过我对 Fedora 官方软件仓库没有我想要的软件一直有些介意,虽然有 COPR 源,但我不是特别想用。
Fedora Silverblue 也是个不错的选择,原子更新,桌面应用大多是从 Flatpak 安装,不过我对 Fedora 官方软件仓库没有我想要的软件这一情况一直有些介意,虽然有 COPR 源,但我不是特别想用。

NixOS 也是个选择,同样是不可变发行版,nixpkg 提供了很多软件包,包括 linux-hardened、hardened-malloc 等,NixOS 官方有一套 security profile,不过我还没尝试,印象中是使用了 linux-hardened 内核,启用了一些安全相关的 sysctl 设置,将内存分配器改成 scudo(好像还启用了 AppArmor?)

Expand Down Expand Up @@ -71,7 +70,7 @@ kernel_cmdline+=" root=UUID=cb070f9e-da0e-4bc5-825c-b01bb2707704 rd.luks.uuid=4b

## 安全启动

安全启动是个耳熟能详的名词,我在刚接触到给自己的笔记本电脑安装 GNU/Linux 发行版的教程的时候,一般都是在 BIOS 中关闭快速启动和安全启动,一般社区支持的发行版无法在开启安全启动的情况下安装,部分商业公司支持的(如 Fedora,OpenSUSE,Deepin 等)发行版可以直接启动安装
安全启动是个耳熟能详的名词,我在刚接触到给自己的笔记本电脑安装 GNU/Linux 发行版的教程的时候,一般都是在 BIOS 中关闭快速启动和安全启动,一般社区支持的发行版无法在开启安全启动的情况下安装,商业公司支持的(如 Fedora,OpenSUSE,Deepin 等)发行版应该是都可以直接启动安装

安全启动是 UEFI 下才有的安全验证机制,旨在确保引导的文件是可信的。

Expand All @@ -89,7 +88,9 @@ $ cp /efi/EFI/systemd/systemd-bootx64.efi /efi/EFI/systemd/grubx64.efi

我选择了 Bubblewrap(也就是标题中的 bwrap),目前只用到了浏览器和我的代码编辑器上,我目前的目标是,让使用的图形化软件基本都套一层 bwrap(除了终端模拟器)

这是 FireFox 的
对于到底应该 `--ro-bind` 什么文件,可以用 `strace -e openat` 看一下该程序到底尝试打开什么文件,然后决定到底要不要映射过去

### FireFox

```bash
$ bwrap \
Expand Down Expand Up @@ -141,7 +142,9 @@ $ bwrap \
/usr/bin/firefox
```

VSCodium
### VSCodium

vscodium 基本照搬的 下面的 Chromium 的配置

```bash
bwrap \
Expand All @@ -154,12 +157,28 @@ bwrap \
--ro-bind /usr/lib64 /usr/lib64 \
--ro-bind /usr/share/applications /usr/share/applications \
--ro-bind /usr/share/gtk-3.0 /usr/share/gtk-3.0 \
--ro-bind /usr/share/glib-2.0 /usr/share/glib-2.0 \
--ro-bind /usr/share/icu /usr/share/icu \
--ro-bind /usr/share/drirc.d /usr/share/drirc.d \
--ro-bind /usr/share/fonts /usr/share/fonts \
--ro-bind /usr/share/glib-2.0 /usr/share/glib-2.0 \
--ro-bind /usr/share/glvnd /usr/share/glvnd \
--ro-bind /usr/share/icons /usr/share/icons \
--ro-bind /usr/share/mime /usr/share/mime \
--ro-bind /usr/share/X11/xkb /usr/share/X11/xkb \
--ro-bind /usr/share/icons /usr/share/icons \
--ro-bind /usr/share/locale /usr/share/locale \
--ro-bind /usr/share/zoneinfo /usr/share/zoneinfo \
--ro-bind /usr/share/vulkan /usr/share/vulkan \
--ro-bind /usr/share/verilator /usr/share/verilator \
--ro-bind /usr/include /usr/include \
--ro-bind /etc/ssl /etc/ssl \
--ro-bind /etc/ca-certificates.conf /etc/ca-certificates.conf \
--ro-bind /etc/fonts /etc/fonts \
--ro-bind /etc/resolv.conf /etc/resolv.conf \
--ro-bind /etc/chromium /etc/chromium \
--ro-bind /etc/localtime /etc/localtime \
--ro-bind /etc/ld.so.conf /etc/ld.so.conf \
--ro-bind /etc/ld.so.cache /etc/ld.so.cache \
--ro-bind /opt/vscodium/ /opt/vscodium/ \
--dir "$XDG_RUNTIME_DIR" \
--ro-bind "$XDG_RUNTIME_DIR/wayland-1" "$XDG_RUNTIME_DIR/wayland-1" \
Expand All @@ -169,23 +188,21 @@ bwrap \
--ro-bind /sys/devices/pci0000:00 /sys/devices/pci0000:00 \
--proc /proc \
--tmpfs /tmp \
--bind /home/example/.config/VSCodium /home/example/.config/VSCodium \
--bind /home/example/.vscode-oss /home/example/.vscode-oss \
--bind /home/example/Downloads /home/example/Downloads \
--bind /home/example/Documents /home/example/Documents \
--bind /home/example/codpjt /home/example/codpjt \
--bind /home/example/git_repo /home/example/git_repo \
--setenv HOME /home/example \
--bind $HOME/.config/VSCodium $HOME/.config/VSCodium \
--bind $HOME/.vscode-oss $HOME/.vscode-oss \
--bind $HOME/Downloads $HOME/Downloads \
--bind $HOME/Documents $HOME/Documents \
--bind $HOME/codpjt $HOME/codpjt \
--bind $HOME/git_repo $HOME/git_repo \
--setenv GTK_THEME Papirus:light \
--setenv LD_LIBRARY_PATH /usr/lib/gcc/x86_64-pc-linux-gnu/14 \
--hostname RESTRICTED \
--unshare-all \
--share-net \
--new-session \
/opt/vscodium/codium --enable-features=UseOzonePlatform --ozone-platform=wayland --enable-wayland-ime --wayland-text-input-version=3 --use-gl=egl
/opt/vscodium/codium --ozone-platform=wayland --use-gl=angle --use-angle=vulkan --enable-features=AcceleratedVideoEncoder,AcceleratedVideoDecodeLinuxGL,VaapiOnNvidiaGPUs,VaapiIgnoreDriverChecks,Vulkan,DefaultANGLEVulkan,VulkanFromANGLE --ignore-gpu-blocklist --disable-gpu-driver-bug-workaround --enable-wayland-ime
```

Chromium
### Chromium

```bash
bwrap \
Expand Down Expand Up @@ -243,14 +260,14 @@ bwrap \

使用 FireFox 的时候还在用我的 NVIDIA 显卡驱动,由于 FireFox 官方并不支持 NVENC 视频解码(虽然可以通过安装 media-libs/nvidia-vaapi-driver 实现翻译)

由于使用 FireFox 打开部分网站速度不佳,我选择了 Chromium(由于 libpng 依赖问题,我把 FireFox 删除了)
由于使用 FireFox 打开部分网站速度不佳,我选择了 Chromium(由于 media-libs/libpng 依赖问题,我把 FireFox 删除了)

使用 Chromium 的时候是 Intel 的核显驱动,安装了 media-libs/libva-intel-media-driver 软件包,这套 bwrap 参数可以让 Chromium 用到显卡的视频解码,由于 Gentoo 的 Chromium 会读取 /etc/chromium/ 下的文件作为 Chromium 启动时的命令行参数,所以我把参数都放到那里了

我这套选项可能有的有些多余,不过我懒得再裁剪了

```txt
--use-gl=angle --use-angle=vulkan --enable-features=AcceleratedVideoEncoder,AcceleratedVideoDecodeLinuxGL,VaapiOnNvidiaGPUs,VaapiIgnoreDriverChecks,Vulkan,DefaultANGLEVulkan,VulkanFromANGLE --ignore-gpu-blocklist --disable-gpu-driver-bug-workaround --enable-wayland-ime --wayland-text-input-version=3
--ozone-platform=wayland --use-gl=angle --use-angle=vulkan --enable-features=AcceleratedVideoEncoder,AcceleratedVideoDecodeLinuxGL,VaapiOnNvidiaGPUs,VaapiIgnoreDriverChecks,Vulkan,DefaultANGLEVulkan,VulkanFromANGLE --ignore-gpu-blocklist --disable-gpu-driver-bug-workaround --enable-wayland-ime --wayland-text-input-version=3
```

## sysctl
Expand Down
8 changes: 7 additions & 1 deletion content/posts/notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title: 随笔记
author: suo yuan
date: 2024-04-13T21:19:25
lastmod: 2024-09-27T03:10:17Z
lastmod: 2025-01-10T10:31:22Z
draft: false
tags:
- others
Expand Down Expand Up @@ -127,3 +127,9 @@ $ pandoc test.md -o test.pdf --pdf-engine xelatex -V CJKmainfont="Noto Sans CJK
```

xelatex 需要相关的 Tex Live 包。

## 尝试了安全启动的 Gentoo Linux

终于,家人们,我用上了安全启动 + 硬盘加密的 Gentoo Linux

下一步就是不使用 gentoo-kernel,使用 gentoo-source 编译内核(为了 CFI)
5 changes: 5 additions & 0 deletions content/posts/verilator_intro.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
title: "Verilator 使用"
author: suo yuan
date: 2024-09-20T04:54:29Z
lastmod: 2025-01-10T10:31:22Z
draft: false
tags:
- Verilator
Expand Down Expand Up @@ -42,6 +43,10 @@ CXXFLAGS="${CFLAGS}"
LDFLAGS="-Wl,-O3,-z,now"
```

> 2025 年 1 月 10 号
>
> 我今天重装了一遍,发现用 GCC 就行,不需要 nolto,我开了 `-flto` 编译也可以成功,不过 Clang 编译失败
## 使用 Verilator

可以参考[官方文档给出的例子](https://verilator.org/guide/latest/example_cc.html),还有 [USTC CECS 2023](https://soc.ustc.edu.cn/CECS/lab2/verilator/) 中也简单介绍了一点 Verilator 的使用。
Expand Down

0 comments on commit a1a6352

Please sign in to comment.