PVE7版本下AMD R5-4650GE核显直通

本文记录了将AMD R5-4650GE直通给PVE内Linux虚拟机的操作过程 启用IOMMU直通,ACS分组 vim /etc/default/grub GRUB_CMDLINE_LINUX_DEFAULT="quiet iommu=pt pcie_acs_override=downstream,multifunction textonly" update-grub 屏蔽驱动,避免被宿主机占用 vim /etc/modprobe.d/pve-blacklist.conf blacklist nvidiafb # AMD # blacklist amdgpu blacklist radeon # Intel UHD blacklist snd_hda_codec_hdmi blacklist snd_hda_intel blacklist snd_hda_codec blacklist snd_hda_core vim /etc/modules vfio vfio_iommu_type1 vfio_pci vfio_virqfd update-initramfs -u -k all 提取vBIOS固件 1 2 3 4 5 cd /sys/bus/pci/devices/0000\:07\:00.0/ echo 1> rom cp rom > /usr/share/kvm/4650ge-vbios.bin echo 0> rom chmod +r /usr/share/kvm/4650ge-vbios.bin 直通显卡给虚拟机 使用命令行设置 qm set VMID -hostpci0 0000:07:00.……

阅读全文

使用批处理一键设置Windows环境变量

最近重装系统了,又需要重新配置开发环境涉及到很多环境变量的设置,所以写了个批处理脚本一键设置环境变量。使用时要注意bat文件的编码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 chcp 65001 @echo off if exist "%SystemRoot%\SysWOW64" path %path%;%windir%\SysNative;%SystemRoot%\SysWOW64;%~dp0 bcdedit >nul if '%errorlevel%' NEQ '0' (goto UACPrompt) else (goto UACAdmin) :UACPrompt %1 start "" mshta vbscript:createobject("shell.……

阅读全文

化减法为加法——补数

为了表示负数,世界上大部分的计算机系统都采用了补码来表示整数。补码对应的英文原文是two’s complement,其中的单词 two 有什么含义呢?本文就来探讨一下补码的原理。 补数 我们都知道CPU内部使用加法器来实现整数加法。那减法运算呢,也有一个专门用作减法运算的减法器吗?其实不然,在模算数系统下减法可以转换为加法。 在数学和计算中,补数法是一种对正整数和负整数的对称范围进行编码的技术,使它们可以在整个范围内使用相同的算法(硬件)进行加法运算。对于给定的位数,可能表示的数的一半编码正数,另一半表示它们各自的的加法逆元。这对互为加法逆元的数称为补数。 CPU的加法器是有限域加法,例如,int + int 的结果仍然是int,是一种模算数系统。 在有限正整数域 \(M = \{x|0 \leq x < m, x \in N\}\) 中,若 \(a + b = M\) 其中 \(a \in M, b \in M\) ,则 \(m \bmod m = 0 = a + b\) ,而且 \(b \equiv -a \pmod m\)。也就是说在数域 \(M\) 中 \(b\) 可以用来表示 \(-a\) ,因此 \(x - a = (x + b) \bmod m\),这样减法就转换成了加法,也得到了负数的表示方法。 对于 \(n\) 位 \(r\) 进制数,规定……

阅读全文

Java的char类型和Unicode

最近注意到 Java 中char类型占用2个字节(16位长),而 Unicode 的编码范围是U+000000-U+10FFFF(21位长),两者之间有怎样的关系呢? Unicode简介 Unicode是一个字符集,它对世界上大部分的文字系统进行了整理、编码,为每一个字符而非字形定义唯一的整数,这个整数称为码点(Code Point)。 20世纪80年代,为了给全世界所有的文字字符统一编码,出现了两个标准化组织: 国际标准化组织(ISO),是于1984年创建ISO/IEC JTC1/SC2/WG2工作组。试图制定一份“通用字符集”(Universal Character Set,简称UCS),并最终制定了ISO 10646标准。 统一码联盟(Unicode Consortium),由Xerox、Apple等软件制造商于1988年组成,并且制定了Unicode 标准。 后来他们发现对方的存在,大家为着相同的目的工作。于是在 1991 年,他们开始合并双方的工作成果,并为创立一个单一编码表而协同工作。虽然实际上两者的字集编码相同,但实质上两者确实为两个不同的标准。Unicode 1.1 对应于 ISO 10646-1:1993,Unicode 3.0 对应于 ISO 10646-1:2000,Unicode 3.2 对应于 ISO 10646-2:2001,Unicode 4.0 对应于 ISO 10646:2003,Unicode 5.0 对应于 ISO 10646:2003 及附录 1–3。 Unicode 平面 当前的 Unicode 字符分为17组编排,每组称为一个平面(Plane),而每一个平面拥有65536(即$2^{16}$)个码点。然而当前只用了少数平面。在表示一个 Unicode 的字符时,通常会用“U+”然后紧接着一组十六进制的数字来表示这一个字符。 平面 始末字符值 中文名称 英文名称 0号平面 U+0000 - U+FFFF 基本多文种平面 Basic Multilingual Plane,简称BMP 1号平面 U+10000 - U+1FFFF 多文种补充平面 Supplementary Multilingual Plane,简称SMP 2号平面 U+20000 - U+2FFFF 表意文字补充平面 Supplementary Ideographic Plane,简称SIP 3号平面 U+30000 - U+3FFFF 表意文字第三平面 Tertiary Ideographic Plane,简称TIP 4号平面 至 13号平面 U+40000 - U+DFFFF (尚未使用) 14号平面 U+E0000 - U+EFFFF 特别用途补充平面 Supplementary Special-purpose Plane,简称SSP 15号平面 U+F0000 - U+FFFFF 保留作为私人使用区(A区) Private Use Area-A,简称PUA-A 16号平面 U+100000 - U+10FFFF 保留作为私人使用区(B区) Private Use Area-B,简称PUA-B UTF UTF是 Unicode/UCS Transformation Format 的缩写,是将 Unicode 码点映射到唯一字节序列的算法,根据映射方法的的不同,有 UTF-8、UTF-16 和 UTF-32 等具体的编码格式。……

阅读全文

2019年总结

2019年已经结束了,是时候回头审视一下这一年的成果了。 决心改变,订立目标 2019年之前的3年,我处于一种除了完成工作不知道应该干些什么的迷惘状态,没有明确的目标,注意力完全被各种纷繁的事情吸引过去了,总是浑浑噩噩地把时间混过去了。幸好在今年年初对2018年做了总结,先看看2018年的总结 初步学习Rust 买了几本书还没看完 初步养成了记笔记的习惯 从总结中发现自己对过去的一年的自己比较失望,察觉到不能再这样继续下去了,于是订立了一些目标和前进的方向。下面是年初订立的计划清单 将GitHub用起来,学会使用Git 学会并熟练使用Rust 算法 玩玩STM32和树莓派 学习/复习数学,数学分析、线性代数、随机过程等 设计模式和系统架构方面知识 练字 搭个博客,写点文章和日记 完成情况 方向 完成情况 将GitHub用起来,学会使用Git 完成 学会并熟练使用Rust 买了并看完《Rust编程之道》;Rust基本入门,一些复杂的特性还不会;熟练还谈不上 算法 买了《算法》第4版 看了前两章 玩玩STM32和树莓派 STM32能仅能写个点灯程序。树莓派当作自己的服务器在用 学习/复习数学,数学分析、线性代数、随机过程等 学线性代数把MIT 吉尔伯特的公开课过了一遍,很有收获。《离散数学及其应用》看了1/3,还在继续。数学仍然是我的短板 设计模式和系统架构方面知识 看完了《Head First设计模式》,还不能灵活运用 练字 临摹字帖中 搭个博客,写点文章和日记 完成 2019年总结 这一年相比之前几年有了明显的改变,生活变得更加充实了,自己也更加积极向上了。做的不好的地方是执行力和行动力还有所欠缺,仍需改善。……

阅读全文

C语言中static关键字的作用

static修饰局部变量 首先来看一段程序,思考一下该程序调用foo、bar函数后输出a的值分别会是多少呢? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #include <stdio.h> int main(){ foo(); bar(); foo(); bar(); return 0; } void foo() { static int a = 0x12345678; ++a; printf("a in foo(), location: 0x%x, current value: 0x%x\n", &a, a); } void bar() { static int a = 0x87654321; ++a; printf("a in bar(), location: 0x%x, current value: 0x%x\n", &a, a); } 使用gcc编译上面的程序,运行程序,控制台输出如下图 从程序的输出我们可以看到foo和bar中的a的存储地址不同,而且每次调用foo和bar,它们自己的变量a的值都增加了1。再来看一下它们的反汇编代码 可以看到a并不在栈上。使用objdump -h Test.……

阅读全文

Rust程序交叉编译到aarch64目标

不同ARM交叉编译工具链区别 “arm生态发展与交叉编译工具链选择”一文对ARM交叉编译工具链介绍得比较详细,以下引用该文章“交叉编译链选择”部分内容,更多详细介绍请查看原文 免费版目前有三大主流工具商提供,第一是GNU(提供源码,自行编译制作),第二是****Codesourcery,第三是Linora。 收费版有ARM原厂提供的armcc、IAR提供的编译器等等,因为这些价格都比较昂贵,不适合学习用户使用,所以不做讲述。 arm-none-linux-gnueabi-gcc:是 Codesourcery 公司(目前已经被Mentor收购)基于GCC推出的的ARM交叉编译工具。可用于交叉编译ARM(32位)系统中所有环节的代码,包括裸机程序、u-boot、Linux kernel、filesystem和App应用程序。 arm-linux-gnueabihf-gcc:是由 Linaro 公司基于GCC推出的的ARM交叉编译工具。可用于交叉编译ARM(32位)系统中所有环节的代码,包括裸机程序、u-boot、Linux kernel、filesystem和App应用程序。 aarch64-linux-gnu-gcc:是由 Linaro 公司基于GCC推出的的ARM交叉编译工具。可用于交叉编译ARMv8 64位目标中的裸机程序、u-boot、Linux kernel、filesystem和App应用程序。 arm-none-elf-gcc:是 Codesourcery 公司(目前已经被Mentor收购)基于GCC推出的的ARM交叉编译工具。可用于交叉编译ARM MCU(32位)芯片,如ARM7、ARM9、Cortex-M/R芯片程序。 arm-none-eabi-gcc:是 GNU 推出的的ARM交叉编译工具。可用于交叉编译ARM MCU(32位)芯片,如ARM7、ARM9、Cortex-M/R芯片程序。 安装交叉编译工具链 访问Linaro官网下载最新的适合我们机器的交叉工具链版本,由于我使用的是Windows所以选择下载mingw32版本 解压交叉编译工具链到合适的位置 设置环境变量。把工具链bin目录的路径加入path环境变量 配置Rust环境 运行命令rustup target add aarch64-unknown-linux-gnu,添加aarch64-unknown-linux-gnu rust toolchain到系统 修改cargo的config文件,配置新的目标架构 1 2 [target.aarch64-unknown-linux-gnu] linker = "aarch64-linux-gnu-gcc" 最后cargo build时需要添加参数--target aarch64-unknown-linux-gnu 。若是想要省略该参数则需要对config作如下的修改,以改变默认的构建目标 1 2 [build] target = "aarch64-unknown-linux-gnu" 另外,也可以给build --target aarch64-unknown-linux-gnu 命令设置别名从而缩短构建命令。比如按下面的方式修改config文件后,就可以使用cargo build_aarch64来构建程序了 1 2 [alias] build_aarch64 = "build --target aarch64-unknown-linux-gnu" 至此,我们就得到了适用于aarch64-unknown-linux环境的二进制可执行目标文件……

阅读全文

敏感词检测

使用前缀树匹配的方法实现的敏感词检测工具类。原始的代码出自此处。 我在原始代码的基础上加了一些自己的修改,主要是去掉了@SuppressWarnings({ "rawtypes", "unchecked" })警告和修改最大匹配检测方式的实现。以下是完整代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 import java.……

阅读全文

一些Java实用代码片段

分布式id生成——雪花算法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 import java.……

阅读全文