/images/avatar.png

RPI4 MAC 模組無法載入問題

問題描述

我在 RPI4 使用 FreeBSD 15.0 的時候,編譯 MAC 模組的時候,開機的時候並不會自動載入。

如下我在自己的 mac module 目錄使用 Makefile 編譯:

kola@generic:~/proj/mac_casper $ ls
Makefile  checker.h  mac_casper.c  mac_casper.ko.full test
README.md  checker.o  mac_casper.h  mac_casper.o  test_program
a.txt   document  mac_casper.kld  machine   vnode_if.h
casper_src  export_syms  mac_casper.ko  opt_global.h  vnode_if_newproto.h
checker.c  label.h   mac_casper.ko.debug script   vnode_if_typedef.h
kola@generic:~/proj/mac_casper $ cat Makefile 
.include <bsd.own.mk>

KMOD=   mac_casper
SRCS=   mac_casper.c
SRCS+= mac_casper.h
SRCS+= checker.c
SRCS+= checker.h
SRCS+=  label.h
SRCS+= vnode_if.h

.include <bsd.kmod.mk>

如上,Makefile 基本上就是使用 sys/conf/kmod.mk 的 Makefile 編譯。

Compiler, Assembler and Interpreter 了解

C 語言

Preprocessing: 預處理,把程式碼所有用 # 開頭的指令進行替換

  1. C ISO 標準定義,所謂的 翻譯階段 (Phases of Translation)。C 語言的編譯過程在標準中被拆解為 8 個邏輯階段,而「預處理」主要涵蓋了前 4 個階段
    1. Phase 1-3: 處理字元映射、將連行符號(\)合併、把註解換成空格
    2. Phase 4: 執行所有 預處理指令(也就是你看到的 # 開頭的東西)並進行 巨集展開 (Macro Expansion)。

最後產出了 .i 檔案,可以參考C语言的翻译阶段

VMWare Module 重新編譯問題

背景

VMWare 使用自己的核心模組:

  • vmmon (Virtual Machine Monitor):它負責虛擬機的 CPU 執行、記憶體管理以及與硬體虛擬化技術(如 Intel VT-x 或 AMD-V)的溝通。如果這個模組沒掛載,你的虛擬機連開機(Power On)都辦不到。
  • vmnet (Virtual Network):負責虛擬網路。包含你常用的 Bridged、NAT、Host-only 等網路模式。如果這個沒過,虛擬機能開機但會完全斷網

這兩個模組在 Linux 核心更新的時候,都需要重新編譯。

DDoS 基礎了解

基礎簡介

常常用到的網路協定包含:

  • L3: ICMP
  • L4: TCP/UDP
  • L7: HTTP

打的受害目標:

  • 網卡頻寬
  • 一般電腦
    • CPU 的軟中斷 (%si)。即使頻寬沒滿,如果每秒湧入千萬個小封包,CPU 會花光所有時間在處理網卡中斷,導致系統崩潰
    • Kernel State Tables,SYN Backlog Queue 與 Conntrack Table。核心必須記住「誰還沒完成三次握手」。當這些表格滿了,系統會直接丟棄後續所有新連線
  • 防火牆
    • 也是有 Conntrack Table
  • 應用程式的資源,像是 Web Server (Nginx/Apache) 或資料庫
    • File Descriptors (FD)、Thread Pool、Memory、Database Connections
kola:~$ sysctl net.netfilter.nf_conntrack_max
net.netfilter.nf_conntrack_max = 262144
kola:~$ sysctl net.netfilter.nf_conntrack_count
net.netfilter.nf_conntrack_count = 213
kola:~$ cat /proc/sys/net/netfilter/nf_conntrack_buckets
262144

這是系統允許同時追蹤的最大連線數量。當這個數字滿了,系統就會開始丟棄新的連線封包,一般電腦不一定會用到 nf_conntrack,但很常會用到,像是 Docker 等應用程式。