Windows IOCP 示例

这个示将接收到的数据原样返回给客户端:

1#include <WinSock2.h>
2#include <WS2tcpip.h>
3#include <MSWSock.h>
4#include <cstdio>

Windows 程序添加图标

首先需要一个 ico 格式的图片,然后创建一个 .rc 的资源文件,内容如下:

1IDI_ICON1 ICON "icon.ico"

在 CMake 配置中将 .rc 资源文件添加到源码列表中:

Windows 程序删除 CMD 窗口

需要将项目类型设为桌面程序。此时入口函数默认为 WinMainCRTStartup,它会在初始化后调用 WinMain 而不是 main。 可以将入口函数修改为 mainCRTStartup 来调研 main

VS 的链接选项:

1:/SUBSYSTEM:windows;/ENTRY:mainCRTStartup

Caller Saved Register & Callee Saved Register

在使用汇编编程时,调用间需要保存与恢复寄存器,这些寄存器可以由调用者保存恢复(Caller Saved Register)也可以由被调用者保存恢复(Callee Saved Register)。

由于调用者不知道哪些寄存器会被修改,因此只能将所有 Caller Saved Register 进行保存恢复,但这样做效率低下。

因此使用 Callee Saved Register 由被调用者根据需要保存和恢复会被改变的寄存器更常用。需要保存的寄存器如下:

架构被调用者保存的寄存器

Linux 64 位调用规约

调用规约是在关于程序调用和返回的约定,参考维基百科

x86_64

参数寄存器
整数或指针(1-6)RDI, RSI, RDX, RCX, R8, R9
浮点数(1-8)XMM0 - XMM7

Docker 的安装和常用命令

安装 Docker

安装依赖

1sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

添加 docker 的 GPG key

使用 Docker 配置交叉编译环境

  1. 首先 安装 Docker
  2. 然后下载 ubuntu 作为基础镜像 sudo docker pull ubuntu:20.04
  3. 启动容器 sudo docker run -h aarch64 --name aarch64 -it ubuntu:20.04

最新版 ubuntu 22.04 的 libc6-dev-arm64-cross 为 2.35,与目标平台上的版本 2.28 不兼容,因此使用 20.04 版本的镜像。

安装交叉工具链

使用 Tan90-Proxy 代理 Minecraft 服务器

Tan90-Proxy 是一个 NAT 穿透代理服务器。

可以将 Minecraft 服务程序部署在本地,然后通过一个廉价低配的公网服务器转发,从而降低开服成本。

一些服务器优惠页面: