为 NCNN 添加 RenderDoc 支持

平台检测宏定义 #define PLATFORM_WINDOWS 0 #define PLATFORM_LINUX 0 #define PLATFORM_APPLE 0 #define PLATFORM_IOS 0 #define PLATFORM_ANDROID 0 查阅文档发现各个平台的 RenderDoc 库名称不同,因此需要用宏来检测各个平台,这里我定义了这几个宏,分别代表 Windows、Linux 等 #if defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) #undef PLATFORM_WINDOWS #define PLATFORM_WINDOWS 1 #elif defined(__APPLE__) #undef PLATFORM_APPLE #define PLATFORM_APPLE 1 // 其他平台检测 Windows 的话,可以通过 __WIN32__ 或者检测是否有 MSVC 就行;Android 用 __ANDROID__; Apple 平台用 __APPLE__;剩下的识别为 Linux RenderDoc API 初始化 #define RENDERDOC_API_LATEST RENDERDOC_API_1_6_0 #define eRENDERDOC_API_Version_LATEST eRENDERDOC_API_Version_1_6_0 这里定义 LATEST 宏可以方便后续更新 RenderDoc 版本 Windows 平台 ...

九月 8, 2025 · 7 分钟 · 1372 字 · Me

Fedora 切换到 UKI 内核并启用安全启动

生成 UKI 镜像 这部分需要先去 BIOS 关闭安全启动!! 删除 GRUB 引导程序 sudo rm -rf /boot/efi/* sudo dnf remove grub2\* --setopt=protected_packages= 配置 kernel-install 这里为 UKI 镜像所在文件夹,可以根据需要自行修改 sudo mkdir -p /boot/efi/EFI/Linux 这里也可以使用 ukify sudo vim /etc/kernel/install.conf layout=uki uki_generator=dracut 由于默认生成的 efi 文件包含随机字符,不利于 Direct Boot,这里需要固定 efi 文件名称 sudo cp /usr/lib/kernel/install.d/90-uki-copy.install /etc/kernel/install.d/ sudo vim /etc/kernel/install.d/90-uki-copy.install 这里添加了 UKI_FALLBACK_FILE, 留一份原来的内核备用 #!/usr/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # SPDX-License-Identifier: LGPL-2.1-or-later # # This file is part of systemd. # # systemd is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or # (at your option) any later version. # # systemd is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with systemd; If not, see <https://www.gnu.org/licenses/>. set -e COMMAND="${1:?}" KERNEL_VERSION="${2:?}" # shellcheck disable=SC2034 ENTRY_DIR_ABS="$3" KERNEL_IMAGE="$4" BOOT_ROOT="$KERNEL_INSTALL_BOOT_ROOT" UKI_DIR="$BOOT_ROOT/EFI/Linux" UKI_FILE="$UKI_DIR/fedora-linux.efi" UKI_FALLBACK_FILE="$UKI_DIR/fedora-linux-fallback.efi" if [ -f "$UKI_FILE" ]; then install -m 0644 "$UKI_FILE" "$UKI_FALLBACK_FILE" fi # If there is a UKI named uki.efi on the staging area use that, if not use what # was passed in as $KERNEL_IMAGE but insist it has a .efi extension if [ -f "$KERNEL_INSTALL_STAGING_AREA/uki.efi" ]; then [ "$KERNEL_INSTALL_VERBOSE" -gt 0 ] && echo "Installing $KERNEL_INSTALL_STAGING_AREA/uki.efi as $UKI_FILE" install -m 0644 "$KERNEL_INSTALL_STAGING_AREA/uki.efi" "$UKI_FILE" || { echo "Error: could not copy '$KERNEL_INSTALL_STAGING_AREA/uki.efi' to '$UKI_FILE'." >&2 exit 1 } elif [ -n "$KERNEL_IMAGE" ]; then [ -f "$KERNEL_IMAGE" ] || { echo "Error: UKI '$KERNEL_IMAGE' not a file." >&2 exit 1 } [ "$KERNEL_IMAGE" != "${KERNEL_IMAGE%*.efi}.efi" ] && { echo "Error: $KERNEL_IMAGE is missing .efi suffix." >&2 exit 1 } [ "$KERNEL_INSTALL_VERBOSE" -gt 0 ] && echo "Installing $KERNEL_IMAGE as $UKI_FILE" install -m 0644 "$KERNEL_IMAGE" "$UKI_FILE" || { echo "Error: could not copy '$KERNEL_IMAGE' to '$UKI_FILE'." >&2 exit 1 } else [ "$KERNEL_INSTALL_VERBOSE" -gt 0 ] && echo "No UKI available. Nothing to do." exit 0 fi chown root:root "$UKI_FILE" || : exit 0 更改 dracut 配置 由于 dracut 默认并不会读取 /etc/kernel/cmdline 中的内核参数,这里需要修改,保证 dracut 能读取到内核参数 ...

五月 29, 2025 · 3 分钟 · 621 字 · Me

在milkv duo s开发版上运行ncnn并测试

编译安装ncnn 克隆ncnn仓库 我的系统是fedora 40 mkdir ncnn cd ncnn git clone https://github.com/Tencent/ncnn.git git submodule update --init 设置交叉工具链 cd .. wget https://sophon-file.sophon.cn/sophon-prod-s3/drive/23/03/07/16/host-tools.tar.gz mkdir riscv-milkv tar -zxvf host-tools.gz -C riscv-milkv/ export RISCV_ROOT_PATH=$(pwd)/riscv-milkv/host-tools/gcc/riscv64-linux-x86_64 设置cmake cd ncnn mkdir build-milkv/ cd build-milkv cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/c906-v240.toolchain.cmake -DCMAKE_BUILD_TYPE=release -DNCNN_BUILD_TESTS=ON -DNCNN_OPENMP=OFF -DNCNN_THREADS=OFF -DNCNN_RUNTIME_CPU=OFF -DNCNN_RVV=ON -DNCNN_SIMPLEOCV=ON -DNCNN_BUILD_EXAMPLES=ON .. 设置完cmake就可以编译ncnn了 编译ncnn make -j$(nproc) 将benchncnn和param文件传送到milkv duo s开发版 开发版上是linux系统,这里我使用scp传送,将my_ip和/path/to/替换成自己的 make install scp duan@my_ip:/path/to/ncnn/build-milkv/benchncnn . scp duan@my_ip:/path/to/ncnn/benchmark/*.param . 跑分测试 milkv duo s的SG2000有一个ARM核(1 x Cortex-A53@1GHz)和一个RISCV核(1 x C906@1GHz + 1 x C906@700MHz),有点难为这块开发板了x ...

七月 3, 2024 · 1 分钟 · 87 字 · Me

在骁龙765G平台上运行ncnn并测试

编译安装ncnn 克隆ncnn仓库 我的系统是fedora 40 mkdir ncnn cd ncnn git clone https://github.com/Tencent/ncnn.git git submodule update --init 设置Android NDK cd .. wget https://dl.google.com/android/repository/android-ndk-r26d-linux.zip mkdir android-ndk unzip android-ndk-r26d-linux.zip -d android-ndk/ export ANDROID_NDK=$(pwd)/android-ndk/android-ndk-r26d 可选:去除debug标志 vim $ANDROID_NDK/build/cmake/android-legacy.toolchain.cmak 去掉这里的-g参数即可 list(APPEND ANDROID_COMPILER_FLAGS -g -DANDROID 设置cmake 如果你的cmake版本大于等于3.21,ndk版本为r23或更高,可添加-DANDROID_USE_LEGACY_TOOLCHAIN_FILE=False选项以启用优化 mkdir -p build-android cd build-android cmake -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake"\ -DANDROID_ABI="arm64-v8a" \ -DANDROID_PLATFORM=android-21 -DNCNN_VULKAN=ON \ -DANDROID_USE_LEGACY_TOOLCHAIN_FILE=False .. 设置完cmake就可以编译ncnn了 编译ncnn make -j$(nproc) make install 测试ncnn 将文件传送到手机 这里我使用Pixel 4a 5g手机进行测试 adb push build-android/benchmark/benchncnn /data/local/tmp/ adb push ../benchmark/*.param /data/local/tmp/ cpu跑分测试 SM7250平台 ...

七月 2, 2024 · 1 分钟 · 93 字 · Me

在RK3588平台上运行ncnn并测试

编译安装ncnn 克隆ncnn仓库 我的系统是fedora 40 mkdir ncnn cd ncnn git clone https://github.com/Tencent/ncnn.git git submodule update --init 设置交叉工具链 cd .. wget https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/_toolchain/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz mkdir aarch64-orangepi tar -xvf gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz -C aarch64-orangepi/ export PATH=$(pwd)/aarch64-orangepi/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin:$PATH 设置cmake cd ncnn mkdir build-orangepi/ cd build-orangepi 改一下编译器名称 vim ../toolchains/aarch64-linux-gnu.toolchain.cmake set(CMAKE_C_COMPILER "aarch64-none-linux-gnu-gcc") set(CMAKE_CXX_COMPILER "aarch64-none-linux-gnu-g++") 设置cmake cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/aarch64-linux-gnu.toolchain.cmake -DNCNN_BUILD_TESTS=ON .. 设置完cmake就可以编译ncnn了 编译ncnn make -j8 将文件传送到OrangePi 5 Plus开发版 开发版上是linux系统,这里我使用rsync传送,将my_ip和/path/to/替换成自己的 make install scp duan@my_ip:/path/to/ncnn/build-orangepi/benchmark/benchncnn . scp duan@my_ip:/path/to/ncnn/benchmark/*.param . 测试ncnn 单元测试 将build-orangepi、examples和tests目录、run_test.cmake文件上传至开发板 mkdir ncnn cd ncnn rsync -a -v duan@my_ip:/path/to/ncnn/build-orangepi . rsync -a -v duan@my_ip:/path/to/ncnn/examples . rsync -a -v duan@my_ip:/path/to/ncnn/tests . mkdir cmake rsync -a -v duan@my_ip:/path/to/ncnn/cmake/run_test.cmake cmake/ 修改开发版上的/path/to/ncnn/build-orangepi/tests/CTestfile.cmake文件 将/home/orangepi/ncnn/这里更改为开发版上的路径 ...

六月 30, 2024 · 1 分钟 · 174 字 · Me

ELF文件结构

ELF(Executable and Linkable Format)文件 可重定位文件(Relocatable File),包含由编译器生成的代码以及数据。链接器会将它与其它目标文件链接起来从而创建可执行文件或者共享目标文件。在 Linux 系统中,这种文件的后缀一般为 .o 。 可执行文件(Executable File),就是通常在 Linux 中执行的程序。 共享目标文件(Shared Object File),包含代码和数据,这种文件称为库文件,一般以 .so 结尾。一般情况下,它有以下两种使用情景: 链接器(ld)可能会处理它和其它可重定位文件以及共享目标文件,生成另外一个目标文件。 动态链接器(Dynamic Linker)将它与可执行文件以及其它共享目标组合在一起生成进程镜像。 ELF文件结构 ELF header(ELF头部):包含有关文件结构的基本信息,如文件编译的体系结构、文件类型(可执行文件、共享对象等)、可执行文件的入口点等。 Program header table(程序头表):描述了在加载和执行可执行文件时,操作系统如何处理文件的各个段(segments)的信息,包括段类型、段偏移、虚拟地址、物理地址、段大小、文件大小、段权限等。只有可执行文件和共享目标文件包含程序头表. Section header table(节头表):描述了ELF文件中每个分区的具体位置,包括节名称、节类型、标志、文件偏移、节区大小、链接信息、对齐信息、附加信息等。 段内容:一个段可能包括一到多个节区,这并不会影响程序的加载。通常包含代码段和数据段。 数据结构 文件头 include/elf.h #define EI_NIDENT (16) typedef struct elf32_hdr{ unsigned char e_ident[EI_NIDENT]; Elf32_Half e_type; Elf32_Half e_machine; Elf32_Word e_version; Elf32_Addr e_entry; /* Entry point */ Elf32_Off e_phoff; Elf32_Off e_shoff; Elf32_Word e_flags; Elf32_Half e_ehsize; Elf32_Half e_phentsize; Elf32_Half e_phnum; Elf32_Half e_shentsize; Elf32_Half e_shnum; Elf32_Half e_shstrndx; } Elf32_Ehdr; Program header table(程序头表):e_phoff、e_phentsize、e_phnum、e_entry Section header table(节头表): e_shoff、e_shentsize、e_shnum、e_shstrndx(字符串表相关的表项的索引 值) e_ident: 0x000x03为 Magic Number(魔数), 0x04指定格式为32位/64位,0x05指定大端/小端模式,0x06为 elf文件版本,0x07为OSABI,0x08为ABI版本,0x090x0f为保留位。 e_type(目标文件类型,ET_NONE ET_REL ET_EXEC ET_DYN ET_CORE ET_LOPROC ET_HIPROC) e_machine(机器架构) e_version(文件版本) e_flags(处理器相关标志) e_ehsize(ELF文件头长度) 程序头表 #define PF_R 0x4 #define PF_W 0x2 #define PF_X 0x1 typedef struct elf32_phdr{ Elf32_Word p_type; Elf32_Off p_offset; Elf32_Addr p_vaddr; Elf32_Addr p_paddr; Elf32_Word p_filesz; Elf32_Word p_memsz; Elf32_Word p_flags; Elf32_Word p_align; } Elf32_Phdr; p_offset(偏移地址) p_vaddr(虚拟地址) p_paddr(物理地址) p_filez(文件中的大小) p_memsz(内存中的大小) p_align(对齐方式) p_type(段类型) PT_NULL:未使用 PT_LOAD:可加载段 PT_DYNAMIC:动态链接信息 PT_INTERP:此类型段给出了一个以 NULL 结尾的字符串的位置和长度,该字符串将被当作解释器调用。这种段类型仅对可执行文件有意义(也可能出现在共享目标文件中)。这种段在一个文件中最多出现一次。而且这种类型的段若存在,它必须在所有可加载段项的前面。 PT_NOTE:附加信息的位置和长度。 PT_SHLIB:保留 PT_PHDR:给出程序头表自身的大小和位置 PT_TLS:Thread-Local Storage Template(一种基于模板的通用方法,用于创建线程局部存储变量) PT_LOOS:保留范围(依赖操作系统) PT_HIOS:保留范围(依赖操作系统) PT_LOPROC:保留范围(依赖处理器) PT_HIPROC:保留范围(依赖处理器) p_flags(段权限) 代码段:包含只读的数据以及指令。通常包含.text节、.rodata节(只读数据)、.hash节(动态符号表的哈希表)、.dynsym节(动态符号表中的符号条目)、.dynstr节(动态字符串表)、.plt节(不同处理器会变动)、.rel.got(全局偏移表的可重定位信息)节等。 数据段:包含可写的数据以及指令,通常包含.data节、.dynamic节(PT_DYNAMIC 类型的元素指向 .dynamic 节)、.got节、.bss节(SHT_NOBITS,在ELF文件中不占用空间,但是它占用其内存镜像的空间)等。 节头表 typedef struct elf32_shdr { Elf32_Word sh_name; Elf32_Word sh_type; Elf32_Word sh_flags; Elf32_Addr sh_addr; Elf32_Off sh_offset; Elf32_Word sh_size; Elf32_Word sh_link; Elf32_Word sh_info; Elf32_Word sh_addralign; Elf32_Word sh_entsize; } Elf32_Shdr; sh_name(节名称) sh_type(节类型) sh_flags(标志) sh_addr(节区位置) sh_offset(节区偏移) sh_size(节区大小) sh_link(节头表索引链接) sh_info(附加信息) sh_addralign(节区地址对齐) sh_entsize(固定大小的表项的表) ELF文件分析 例子 文件头 ...

三月 1, 2024 · 3 分钟 · 451 字 · Me

使用Hugo搭建个人博客

安装Hugo工具 export HUGO_VERSION=0.121.1 wget -O ./hugo.tar.gz https://github.com/gohugoio/hugo/releaserms/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz tar -xvf ./tar.gz sudo cp hugo /usr/bin sudo chmod +x /usr/bin/hugo 创建网站 hugo new site quickstart cd quickstart git init 设置博客主题 git submodule add https://github.com/adityatelange/hugo-PaperMod.git themes/PaperMod echo "theme: 'PaperMod'" >> hugo.toml hugo server 配置网站 baseURL: "https://example.com/" title: username paginate: 5 theme: PaperMod # 修复新帖子不渲染的问题 buildFuture: true # 设置网站默认显示语言 DefaultContentLanguage: "zh" DefaultContentLanguageInSubdir: true # 启用Robots.txt enableRobotsTXT: true buildDrafts: false buildExpired: false # 启用Google Analytics googleAnalytics: EXAMPLE 新建一篇文章 新建content/posts文件夹,在posts文件夹里新建Markdown文件即可,以下为示例 ...

一月 4, 2024 · 3 分钟 · 510 字 · Me

实现校园网自动认证的功能

由于校园网认证总是自己断掉,于是想到使用bash或python脚本认证校园网的方法,配合linux的cron可以方便的进行自动认证。 抓取登录时使用的get/post请求 打开chrome开发者工具,选择网络,勾选保留日志选项 输入用户名和密码并登录,找到对应的登录请求 以cURL格式复制值 我的校园网使用的是get请求 使用shell脚本认证 获取本机ip地址 ifconfig interface |grep inet|awk '{print $(NF)}'|head -n 1 # 替换为自己的网络接口 获取本机mac地址 ifconfig interface | grep ether| awk '{print $(NF-3)}' # 替换为自己的网络接口 编写认证脚本 CURRENT_IP=$(ifconfig interface|grep inet|awk '{print $(NF)}'|head -n 1) MAC_ADDRESS=$(ifconfig interface | grep ether| awk '{print $(NF-3)}') curl "http://192.168.251.75/quickauth.do?userid=userid&passwd=passwd&wlanuserip=${CURRENT_IP}&wlanacname=NFV-BASE&wlanacIp=202.206.32.195&ssid=&vlan=0&mac=${MAC_ADDRESS}&version=0&portalpageid=1&timestamp=1677389084992&uuid=d149ad07-e027-4f8b-aef3-206b5a4acf8e&portaltype=&hostname=" \ -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7" \ -H "Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7" \ -H "Cache-Control: max-age=0" \ -H "Connection: keep-alive" \ -H "Cookie: macAuth=1f:78:63:0a:00:00||2b:7d:63:0a:00:00; ABMS=dbed4e41-6917-4d4e-8cce-f3c654b1e83c" \ -H "DNT: 1" \ -H "Upgrade-Insecure-Requests: 1" \ -H "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36" \ --compressed \ --insecure 遇到的问题 总是提示ip会话认证失败,使用具体值便认证成功,curl没有正确读取变量的值,查阅资料发现时url中的“&”字符引起的问题,需要对url进行编码 ...

二月 26, 2023 · 1 分钟 · 192 字 · Me

rclone挂载云端网盘

安装rclone Debian sudo apt install rclone 配置云端网盘 rclone config 提示:支持Amazon Drive、Dropbox、Google Drive、Google Photos、OpenDrive、SFTP、Webdav等众多网盘。 新建挂载点 mkdir /path/to/mountpoint 挂载云端网盘 rclone mount remote_name:remote_path /path/to/mountpoint --daemon 进入挂载点目录 cd /path/to/mountpoint 不要忘记卸载云端网盘! fusermount -u /path/to/mountpoint 更多用法 复制 rclone copy 同步到目标目录 rclone sync 双向同步 rclone bisync 移动 rclone move 删除路径下的内容 rclone delete 删除路径及所有内容 rclone purge 检查目标与源是否匹配 rclone check 列出路径中所有对象的大小和路径 rclone ls 列出路径中的所有目录 rclone lsd 列出远程目录中所有对象的总大小和数量 rclone size 选项配置

二月 19, 2023 · 1 分钟 · 61 字 · Me

webdav解决局域网之间的文件传输问题

webdav方法说明 方法名称 文件权限 方法说明 OPTIONS – 支持 WebDAV 的检索服务方法 GET 读 获取文件 PUT、POST 写 上传文件 DELETE 删除 删除文件或集合 COPY 读、写 复制文件 MOVE 删除、写 移动文件 MKCOL 写 创建由一个或多个文件 URI 组成的新集合 PROPFIND 读 获取一个或多个文件的特性,实现文件的查找与管理 LOCK、UNLOCK 写 添加、删除文件锁,实现写操作保护 使用的服务端 nginx 注意:需要第三方模块nginx-dav-ext-module! 配置webdav目录权限 chown -R nobody:nobody /var/www/dav chmod -R 700 /var/www/dav 配置nginx服务器 dav_ext_lock_zone zone=davlock:10m; # DAV文件锁内存共享区 server { listen 443 ssl http2; # 启用HTTPS及HTTP/2 server_name yourservername; access_log logs/webdav.access.log main; #网站日志文件 root /var/www/dav; ssl_certificate yourpath/fullchain.pem; # 网站证书文件 ssl_certificate_key yourpath/privkey.pem; # 网站证书密钥文件 ssl_session_cache shared:SSL:10m; # 会话缓存存储大小为10MB ssl_session_timeout 20m; # 会话缓存超时时间为20分钟 client_max_body_size 20G; # 最大允许上传的文件大小 location / { autoindex on; autoindex_localtime on; set $dest $http_destination; if (-d $request_filename) { # 对目录请求、对URI自动添加“/” rewrite ^(.*[^/])$ $1/; set $dest $dest/; } if ($request_method ~ (MOVE|COPY)) { # 对MOVE|COPY方法强制添加Destination请求头 more_set_input_headers 'Destination: $dest'; } if ($request_method ~ MKCOL) { rewrite ^(.*[^/])$ $1/ break; } dav_methods PUT DELETE MKCOL COPY MOVE; # DAV支持的请求方法 dav_ext_methods PROPFIND OPTIONS LOCK UNLOCK; # DAV扩展支持的请求方法 dav_ext_lock zone=davlock; # DAV扩展锁绑定的内存区域 create_full_put_path on; # 启用创建目录支持 dav_access user:rw group:r all:r; # 设置创建的文件及目录的访问权限 auth_basic "Authorized Users WebDAV"; auth_basic_user_file /etc/nginx/conf/.davpasswd; # webdav密码文件 } } 密码文件示例: ...

一月 12, 2023 · 2 分钟 · 244 字 · Me