- 博客(118)
- 资源 (1)
- 收藏
- 关注
原创 ARM64系统寄存器
系统寄存器通常是不允许在EL0访问的,读写会触发异常。异常信息记录在ESR_EL1寄存器中。举例而言,对于MDIR_EL1这个系统寄存器,它的编码如下。
2024-01-10 21:58:56
483
原创 Flamescope使用和安装
火焰图展示了一个时间区间内的热点情况,但是对于分析更小时间片内的扰动和变化无能为力。Flamescope 通过从亚秒偏移热图来可视化这些扰动来解决这个问题,有了亚秒偏移热图后,我们可以选择一个片段使用火焰图进行研究。换句话说,我们可以选择捕获的性能剖析文件的任意连续时间片,并将其可视化为火焰图。
2023-10-27 10:05:58
320
原创 YouCompleteMe 安装踩坑
Vim里下载完插件后,打开vim,可能遇到以下报错。一般原因是有自己安装的python,可以。下的,这个时候指定系统自带的即可解决。安装过程中可能遇到以下报错,提示需要特别的python,看一下路径,大概率是。
2023-09-23 10:03:11
516
原创 进/线程绑核运行
我们在做性能摸底的时候需要排除多核处理器间的差异,甚至是频率的影响。有时特定业务为了确定性,设置会单独划出一个CPU单独供给,那么我们可以怎么让某个进/线程绑定到特定的核心上运行呢?
2023-09-18 15:00:24
254
原创 移位操作行为
arithmetic shift left <-- 移位空缺填0arithmetic shift right <-- 移位空缺填原MSB,即符号位。
2023-09-16 15:07:09
108
原创 sigsetjmp & siglongjmp 的小把戏
最近看到 sigsetjmp siglongjmp 的代码,musl里对jmp_buf的写法很独特。原来 C 里面还是有好多东西自己不知道的啊。上面的代码是setjmp.h里的定义,把一个 struct 类型定义成一个数组。第一次看有点让人疑惑。typedef综合上面两点,我们再看jmp_buf的声明,可以看到它是长度为1,类型数组的别名。jmp_buf。
2022-10-09 19:37:13
414
1
原创 docker 入门指南
docker 是一个加速应用开发、分发、部署的平台,使用沙盒机制,可移植性很好、占用计算机资源小。具体而言,docker 提供了打包应用运行所需的环境到一个镜像里的能力,并提供一系列应用的生命周期管理工具。用户基于这个镜像可以在同一台机器上同时运行多个实例,使用同一个镜像的应用所获取的执行环境是一致的。这使得我们的应用易于分发,快速验证。......
2022-08-18 11:04:11
577
原创 Jellyfin 打造家庭影院 & 视频硬解 (威联通 QNAP)
最近添置了一个威联通(QNAP)的NAS。准备搭建一个家庭影音中心,网上群晖的资料相当多,威联通的略少,因此在这里记录一下搭建过程以及遇到的问题,以飨读者。
2022-07-30 23:34:15
17967
原创 代码段在 elf 文件中的大小端探究
踩坑前段时间在分析问题的时候,以 ARM 为例,发现代码段在 .o 和最终的 elf 文件中的大小端是不同的。构造了测试例如下:int a = 0x66778899;int b = 0xaabbccdd;int main(){ asm volatile ( ".inst 0x11223344 \n" ".inst 0xe1e740d2 \n" :::); return 0;}目标文件armebarm可以看到在目标文件
2022-01-04 16:09:23
755
原创 linux 运行动态链接程序报错,/bin/sh: ./<file>: not found
错误现象之前使用 qemu 搭建了 Linux 学习环境后,没关注到运行动态链接程序的问题。典型的错误日志如下:/ # ./test_linux-/bin/sh: ./test_linux: not found修复方法上述问题出现的原因是动态加载器没找到,sh 程序首先会让内核执行 exec 程序加载待运行的程序,内核识别到是一个 elf 文件,并且发现是一个动态链接的程序,那么回去寻找动态加载器,如果找不到的话就会报上面的错误。通常动态加载器名称是 ld-linux-xxx。以 aarch64
2021-10-20 09:44:28
992
1
原创 gcc/ld --wrap 选项
ld --wrap 选项--wrap=symbolUse a wrapper function for symbol. Any undefined reference to symbol will be resolved to __wrap_symbol.Any undefined reference to __real_symbol will be resolved to symbol.This can be used to provide a wrapper for a system funct
2021-07-11 17:02:25
972
2
原创 git log 中 AuthorDate 和 CommitDate
git loggit 中 commit 的日期标记实际上包含了两个日期,它们分别是 AuthorDate 和 CommitDate。commit d259a04b7289d002c374cd0266e1af1b8a5824b3Author: User Name <username@xxx.com>Date: Wed Apr 21 16:26:47 2021 +0800...当我们使用选项 --pretty=fuller 时才会显示全部时间 git log --pretty=fu
2021-04-22 11:36:05
1662
原创 Dump QEMU 所使用的 dtb 信息
qemu一直疑惑 qemu 启动 Linux 时所传的 dtb 信息。最近找到了获取的方法,供参考。我们可以让 qemu dump virt machine 使用 GICv2 开启虚拟化情况下所使用的 dtb。之后通过 dtc 命令转换成 dts 文本。$ qemu-system-aarch64 -machine virt,gic-version=2,virtualization=on,dumpdtb=dump.dtb$ dtc -o dump.dts -O dts -I dtb dump.dtb
2021-04-09 13:16:34
3176
1
原创 变长参数宏 __VA_ARGS__ 与 ## 的特殊用法
__VA_ARGS__ 与 ## 的特殊用法你可能很熟悉在函数中使用可变参数列表,如:// 变长参数的函数void printf(const char* format, ...);GNU C 中可以用可变参数宏 (variadic macros) 传递可变参数列表。需要注意的是,并不是所有的编译器都支持可变参数宏。C99 中引入了可变参数宏,因此满足 C99 标准的编译器允许定义可变参数宏,这样你就可以使用可变参数表的宏了。可变参数宏像下面这个样子:// format 称为 named argu
2021-02-23 16:44:05
661
原创 ELF 文件格式及示例分析
ELF (Executable and Linkable Format)Linux 上源码编译后的 .o 文件即目标文件,目标文件结构上和可执行文件格式很相似,通过链接器链接相应的库后得到可执行文件 .elf。为了描述方便,文中不区分二者的存储格式。elf 存储格式涵盖了程序的编译、链接、装载和执行过程。了解目标文件的对认识操作系统,特别是进程加载方面大有裨益。目标文件包含什么东西呢?显而易见,应该包含代码和数据,另外为了支持链接,其中还有符号表等,为了支持调试,还会有调试信息,等等。Executab
2021-02-10 13:19:16
1046
2
原创 真实场景中的内存序重排
真实场景中的内存序重排 Memory Reordering Caught in the Act在涉及到内存屏障的文章中多次提到了内存乱序的后果,本篇文章构造一个真实的场景来复现乱序。场景如下,在多核场景下,两个线程共享了两个变量 X Y,初始值均为0。线程1给X赋值为1,然后读取Y,线程2给Y赋值1,然后读取X。两者并发执行,可能运行在不同的 CPU 核心上。processor 1processor 2X = 1Y = 1read Yread X直觉上我们可能得到:
2021-01-29 10:30:03
246
原创 内存屏障 Memory Barriers
内存屏障 Memory Barriers在上一篇文章中我们提到了编译时的内存序重排导致的问题以及解决方法,即添加编译器屏障或处理器屏障指令。这篇文章将探讨内存屏障的语义。内存屏障的类型 Types of Memory Barrier内存屏障的作用是避免不期望的内存操作乱序,使得代码编译时和运行时按照我们期望的方式进行。内存屏障可以分为四种类型,实际的 CPU 屏障指令表现为这四种类型的一种或多种的组合,或者带上其他的一些副作用。Load LoadLoad Load 类型的屏障阻止对屏障前后的 Lo
2021-01-28 15:11:05
548
翻译 编译时的内存序重排
编译时的内存序重排注:原文为 Memory Ordering at Compile Time,译文内容有删减。在源码编写和可执行文件实际在处理器上执行期间,代码中的内存交互可能根据相应的规则被重排序。内存重排序可以在编译阶段和运行时(处理器)发生。采用这样做的原因是为了更好的运行性能。内存重排序的基本规则是编译器开发人员和CPU供应商普遍遵循的规则,规则如下:内存重排序不应当修改单线程程序的行为。基于上面的规则,内存重排序对编程人员写单线程程序时几乎不察觉。因为采用了各种同步互斥机制 (mut
2021-01-26 14:21:38
455
原创 静态链接库与动态链接库的区别与使用
linker & lib大体上 C 程序构建过程可以分为预编译、编译、汇编以及链接四个过程。库的分类库的分类备注优劣static lib将库文件与目标文件在程序构建的链接阶段链接在一起即静态链接。它的好处是程序运行不再依赖系统中存在这样一个库文件供调用,因为它已经在程序可执行文件中了。缺点是如果同一个库被大量程序使用,那么静态链接将导致空间浪费、库有问题修复需要所有使用该库的程序重新编译。dynamic lib动态库的链接是在程序执行的时候被链接的。动态库的
2021-01-20 18:49:36
480
原创 qemu /lib/ld-linux-aarch64.so.1: No such file or directory
qemu user-space emulation在使用 qemu 进行用户态模拟 aarch64 或其他平台的程序时,如果是动态链接的,会遇到下面两个错误。/lib/ld-linux-aarch64.so.1: No such file or directoryerror while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory提示找不到相应的动态链接库。
2021-01-19 14:32:53
19410
2
原创 gdb 基本操作
栈信息bt backtracebt , n是一个正整数,表示只打印栈顶上算起n层的栈信息。bt <-n>,-n表一个负整数,表示只打印栈底下算起n层的栈信息。f framef ,查看当前栈层的信息,可以用 frame 或 f会打印出这些信息:栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句。info f这个命令会打印出更为详细的当前...
2020-11-16 17:27:06
1335
1
原创 Coredump 核心转储 Permission denied & Fsync failed & Operation not permitted
核心转储应用程序崩溃时,我们希望能够得知更多的信息以便调试和定位问题,coredump 文件就能提供上述信息,进程崩溃时,操作系统会将程序当时的内存状态记录下来。Linux 默认是关闭这个功能的,下面介绍如何打开和使用该功能。开启 core dump设置转储文件大小// 可通过该命令查询当前的系统限制规则ulimit -acore file size (blocks, -c) 0data seg size (kbytes, -d) unlimited
2020-11-06 10:03:19
494
1
原创 浮点数 & IEEE 754 & ARM SIMD / NEON / VFP
Floating point integer提到浮点数,首先要看下定点数是什么概念。在定点数表达法中,其小数点固定地位于实数所有数字中间的某个位置。比如有四位小数,那么所有数字都是有固定的四位小数的,123451234512345 则表示 1.23451.23451.2345。缺点很明显,精度和数据大小无法兼顾。浮点数的表示涉及到不同的处理器的支持情况。对于需要高精度计算的数值分析来说,搞清楚浮点数背后的故事是相当有必要的,这可以减少或消除不必要的精度损失。IEEE 754IEEE 754浮点
2020-11-03 14:34:41
1020
原创 Pandoc
Pandoc1Pandoc a universal document converter写作规范一个有意思的 markdown 写作规范,pandoc Markdown 写作规范footnote1 ↩︎
2020-11-02 10:11:41
201
原创 Shell 之 Here Documents
catcat(1) is short for “concatenate”. It was originally designed to merge text files into one, but can be used for many other purposes.cat 命令最初是用于合并多个文本文件用的。如$ cat file1 file2 file3 > bigfile现如今很多人使用它配合 more / less 命令来显示文件内容。$ cat file | more或者用
2020-10-15 13:06:48
602
原创 使用 vim 和 xxd 编辑二进制文件
xxdxxd [options] [files]xxd 可以转储 [dump] 出文件的数据,反之亦可。例如:xxd -l 0x30 /bin/ls00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............00000010: 0300 3e00 0100 0000 5058 0000 0000 0000 ..>.....PX......00000020: 4000 0000 0000 0000 a003 0200
2020-10-10 17:13:53
2709
1
原创 非对齐访问——以ARM为例
数据的对齐与非对齐访问12Older ARM processors require data load and stores to be to/from architecturally aligned addresses. This means:LDRB/STRB - address must be byte alignedLDRH/STRH - address must be 2-byte alignedLDR/STR - addres
2020-09-22 13:39:53
7879
1
原创 ARM 多寄存器寻址 (块拷贝寻址)
LDM/LDMIA/LDMFDLoad Multiple Increment After (Load Multiple Full Descending) loads multiple registers from consecutive memorylocations using an address from a base register. The consecutive memory locations start at this address, and theaddress just a.
2020-08-28 11:39:51
1883
原创 数据模型 LP32 ILP32 LP64 ILP64 LLP64
data model1DatetypeLP64ILP64LLP64ILP32LP32char88888short1616161616_int3232int3264323216long6464323232long long6464646464pointer6464643232C 语言定义了一些基本数据类型,但是没有给出数据类型实际的位宽。随着 64bit 处理器的大量使
2020-08-18 17:20:43
1236
原创 dereferencing type-punned pointer will break strict-aliasing rules
最近遇到了一个编译告警,严格别名和类型双关,整理一下相关的材料。strict aliasing以下问题摘自1I have the following questions:If I leave the code with this warning, will it generate potentially wrong code?Is there any way to work around this problem?If there isn’t, is it possible to turn
2020-07-23 16:25:04
6134
原创 结构体大小和成员对齐 __attribute__ ((packed)) && __attribute__ ((aligned(alignment)))
C语言结构体对齐及大小计算。
2020-07-08 19:56:31
1235
原创 VS Code 使用(二)sftp插件
在 window 上开发代码如果需要和 Linux 服务器 / 工作站 同步的话,插件 Sftp 是一个不错的选择。使能简单使用几行配置就行了。{ "host": "host", "username": "username", "remotePath": "/remote/workspace"}复杂配置1对于有特别要求的场景,下面是一个比较复杂的配置。context: 指定了本机要同步的目录ignore: 指定忽略某些文件或者目录的同步profiles:可以多个目录不同的配
2020-06-17 15:54:55
654
原创 Ubuntu 18.04 中使用 Postfix 发送邮件
Postfix之前介绍过使用 Linux 自带的 mail 来发送邮件 Linux使用mailx通过第三方SMTP发送邮件,带附件操作。最近发现 Ubuntu 18.04 中移除了 heirloom-mail1。Postfix is the default Mail Transfer Agent (MTA) in Ubuntu. It attempts to be fast and secure, with flexibility in administration. It is compatibl
2020-06-03 19:50:58
3283
原创 CAS 原子比较交换操作
原子比较交换操作C111Atomically compares the object representation (until C++20)value representation (since C++20) of the object pointed to by obj with that of the object pointed to by expected, and if those are bitwise-equal, replaces the former with desired (pe
2020-05-13 11:51:41
595
原创 qemu 安装 recipe for target 'block/file-posix.o' failed error: missing binary operator before token "(
最近尝试了在 Ubuntu 18.04 上编译安装 qemu-4.2,qemu-5.0.0,发现编译遇到了问题。问题如下:/usr/include/linux/swab.h: In function ‘__swab’: CC hw/char/digic-uart.o CC hw/char/omap_uart.o CC hw/char/exynos421...
2020-05-07 22:02:29
1458
原创 设备树 DTS & DTB
Device Tree1设备树是一种数据结构,用来描述硬件设备,如此一来硬件信息就无需硬编码在代码中,这样就将设备驱动和实际硬件解耦开来,有了良好的可扩展性。操作系统可以在启动运行时读取相应的文件,必要时也可以修改。当然设备树也没有完全解决所有硬件配置的问题。Flattened Device Tree,Device Tree Source,Device Tree BinaryLinux us...
2020-05-05 15:43:12
828
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人