定制一个最小的linux 系统
定制一个最小的linux 系统
一个操作系统宏观上分为两个部分,kernel和shell(核和壳),kernel就是操作系统内核,shell在kernel之上,提供与用户交互的界面,包括CLI(命令行界面)和GUI(图形用户界面)。除此之外还有基础运行库(如c库、posix)等基础软件。只有kernel,不能算作一个操作系统,因为什么也做不了。本文通过linux内核和busybox工具集,制作一个最简单的linux系统。
环境准备安装必要的软件包
sudo apt updatesudo apt upgradesudo apt install build-essential git kconfig-frontends flex bison libelf-dev bc libssl-dev qemu qemu-system-x86
开始编译 linux-kernel建议直接从https://www.kernel.org/ 下载 tar -xvJf linux-5.15.175.tar.xz
官方这个这个拉下来大概5g多git clone https://github.com/t ...
Python 调试手段
Python 调试手段基础环境安装pip
# python 2.7wget https://bootstrap.pypa.io/pip/2.7/get-pip.py --no-check-certificate# python 3.8wget https://bootstrap.pypa.io/get-pip.py --no-check-certificate# 运行安装脚本,如果有代理直接可以/bin/python get-pip.py# 没有代理,则需要手动下载三个文件到root目录# pip-20.3.4-py2.py3-none-any.whl# setuptools-44.1.1-py2.py3-none-any.whl# wheel-0.37.1-py2.py3-none-any.whl/bin/python get-pip.py --no-index --find-links=/root# 验证pip安装/bin/python -m pip --version
参考链接pip、whl包下载https://pypi.org/https://github.com/pyp ...
dpdk解析报文协议-基于l2fwd
dpdk解析报文协议-基于l2fwd0 前置条件1、这里需要两台虚拟机,配置了相同的虚拟网络,可以通过tcpreplay在一台虚拟机回放报文,在另一台虚拟机通过tcpdump -i 网卡名 捕获到。
具体配置可参考https://www.jb51.net/server/2946942fw.htm
2、需要dpdk环境配置完成
3、大致了解计算机网络的以太网层、ip层、tcp/udp层、应用层http等之间的关系,如下图所示
1 l2fwd运行进入example中的l2fwd代码目录下,执行下列命令
export RTE_TARGET=x86_64-native-linuxapp-gccexport RTE_SDK=/home/chen/code/dpdk/dpdk-stable-19.11.14make# 运行sudo ./build/l2fwd -l 0-1 -- -p 0x3 -T 1
如果一切正常,则应该输出下图,可以通过在另一台虚拟机回放相关报文,观察统计信息变化情况
# 另一台虚拟机sudo tcpreplay -i ens38 xxxx. ...
深入理解C指针
深入理解C指针#C语言 # #C指针 #
1 认识指针指针:一个存放内存地址的变量
1.1 指针和内存
阅读指针声明时候,可以选择倒过来读,会更容易理解。
指针被赋值为NULL时候,会被解释为二进制0.
void指针具有和char指针相同的形式和内存对齐方式。只能用作数据指针,不能用作函数指针。
全局指针和静态指针在程序启动时候被初始化为NULL。
1.2 指针的类型和长度size_t类型是无符号整数,经常用于循环计数器、数组索引等。
在部分for循环中 如果中间的判断条件为 size_t a >= 0,则可能会出错,该循环不会停止
例如 for (szie_t i = n; i >= 0; i--) {...}, 当i为零时,由于是无符号整数,再减1还为整数,所以一直循环。(如果希望使用size_t 中间判断可以改为 i != SIZE_MAX)
指针的长度可以通过sizeof操作符判断
1.3 指针操作符
1.3.1 指针算数运算
指针加上/减去整数给指针加上⼀个整数实际上加的数是这个整 ...
Nginx源码阅读(1)
0 环境配置版本:Nginx-1.22.1 (稳定版本)
1 整体代码结构
core:存储核心代码,一些自定义的数据结构,例如字符串、数字、链表、散列表、基数树、红黑树等。还有一些结结构体
event:事件处理模块相关的,select、epoll、poll、kqueue等
http:处理http请求相关的代码
mail:邮件服务器相关
misc:性能分析工具gperftools、兼容性分析工具
os:跨平台实现的代码
stream:反向代理相关功能
2 Nginx基础架构和设计理念2.1 Nginx进程模型(1)异步非阻塞(2)CPU绑定(3)负载均衡2.2 模块化设计接口规范struct ngx_module_s { ngx_uint_t ctx_index; ngx_uint_t index; char *name; ngx_uint_t spare0; ngx_uint_t spare1; ngx_uint_t ...
力扣-43. 字符串相乘,清晰易懂
43. 字符串相乘思路:模拟竖向除法,一些边界情况需要考虑到,需要提前把相乘结果的最大位数预留出来,最后根据实际情况进行缩减,同时进位的时候也需要考虑最高位的进位。
代码class Solution {public: string multiply(string num1, string num2) { // 模拟数学方法 // 确保num1是较长的 if (num1.size() < num2.size()) { swap(num1, num2); } int l1 = num1.size(), l2 = num2.size(); string ret(l1 + l2, '0'); // 最坏情况长度是l1+l2,有些情况可能不是,需要删除高位多余的0 for (int i = l2 - 1; i >= 0; -- i) { // nums2从后往前遍历, ...
c++ 编译 报错 未定义的引用(模板类的声明实现)
遇到的问题有两种情况。一个是static没初始化。一个是模板类实现和定义分开写。
这里主要记录一下模板类实现和定义分开写报错的问题(都放在.h文件中就不会报错)
自己尝试用“传统”方法,及在.h文件里声明,在.cpp文件里定义,然后在main函数里包含.h头文件,这样会报链接错误。
这是因为函数模板要被实例化后才能成为真正的函数,在使用函数模板的源文件中包含函数模板的头文件,如果该头文件中只有声明,没有定义,那编译器无法实例化该模板,最终导致链接错误。
解决办法,方法0、实现和声明写在一个文件方法1、 在main函数里包含.cpp方法2、在实现的.cpp文件中显式实例化模板对象。
参考链接 https://blog.csdn.net/qq_41230365/article/details/80207819
ubuntu18升级安装cmake_超详细(亲测成功2022年7月13日)
由于clion远程开发要求的cmake版本较高,当前系统sudo apt-get的版本不够,需要升级。在网上找了很多教程,都是有这样那样的错误,或者没有写详细。
1、去https://cmake.org/files/下载所需版本的源码。也可以使用wget下载,例如:wget https://cmake.org/files/v3.22/cmake-3.22.1.tar.gz
2、解压tar -xvzf cmake-3.22.1.tar.gz
3、 最后把文件夹的名字改一下,放在合适目录,这里我放在了/usr/local/bin/cmake
4、进入cmake目录,./bootstrapmakesudo make install
5、重点,建立软链接,(很多博客建立软链接只是把这个文件夹建立了,这里需要的是把cmake/bin目录下的几个文件全部映射到/usr/bin/下面)sudo ln -sf /usr/local/bin/cmake/bin/* /usr/bin/
6、执行以下命令可检查安装版本cmake --v ...
yolov5可视化检测界面打包为exe可执行程序
由于csdn和公众号都没有提醒功能,所以评论私信可能回复不及时,如有紧急问题,可以通过我的个人博客评论,即可快速回复。 https://www.blogca.cn/
效果展示:
0 准备工作
yolov5环境配置完毕
安装pyinstaller,命令为 pip install pyinstaller
ps: 为了避免可能的错误,所有操作请在英文路径下进行。
1 修改detect_qt5.py或者相关文件如果是使用我的检测界面的,应该是修改detect_qt5.py这个文件,其他代码根据自己情况选择。修改下图中的红色框内的代码,替换为下面两行任意一行即可。
device = torch.device('cuda:0') # gpu版本,只使用gpudevice = torch.device('cpu') #cpu版本,只使用cpu
2 打包exe# 切换到yolov5根目录,使用这个指令即可pyinstaller ui_yolov5.py --hidden-import "models.yolo&quo ...
linux下c++运行出现segmentation fault查看错误原因
segmentation fault的中文解释所谓的段错误 就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它指向的gdt表, 后13位保存相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,指向的gdt是由以64位为一个单位的表,在这张表中 就保存着程序运行的代码段以及数据段的起始地址以及与此相应的段限和页面交换还有程序运行级别还有内存粒度等等的信息。一旦一个程序发生了越界访 问,cpu就会产生相应的异常保护,于是segmentation fault就出现了
查看原因1、生成core文件。
# 查询core file sizeulimit -a# 把core文件大小设置为无限制ulimit -c unlimited# 把core文件的生成路径写入到 /proc/sys/kernel/core_pattern 中,这里普通用户可能权限不够,最好另开一个root终端执行# 前面的路径为core文件生成的路径,可以选择当前工作目录,或是在指定的地方echo "/home/c ...
yolov5训练自己数据集(ultralytics版本)
0 准备工作
环境配置,参考这里
下载一个官方yolov5s.pt模型,放置在yolov5根目录下,下载链接这里或者这里
准备数据集,格式如下所示,每个图片有其对应的xml格式标注文件。
yolov5├── models├── runs├── utils├── data│ ├── project01│ │ ├── images│ │ │ ├── 1.jpg│ │ │ ├── 2.jpg│ │ │ ├── ...│ │ ├── xml│ │ │ ├── 1.xml│ │ │ ├── 2.xml│ │ │ ├── ...
1 划分数据集修改代码中的 –xml_path 和data/project01/labels ,这里是’data/project01/xml’,如果是和我一样在yolov5的data目录下新建的文件夹,那么直接把project01替换为你的文件夹名称。随后运行代码即可
train_percent 为训练集比例,一般训练集:验证集 , ...
Pyqt搭建YOLOV5目标检测界面
本项目1.0版本github地址:https://github.com/chenanga/qt5_yolov5_1.0本项目2.0版本github地址:https://github.com/chenanga/qt5_yolov5_2.0(2.0版本是优化后的,视频检测和图片检测都比较快)
大家觉得有用的话,帮忙点点star,感谢大家!
2022.5.25更新大家有问题的话尽量在评论区问,问之前可以看一下评论区有没有类似错误的解决方法。
2021.11.19 更新
下面的代码片段大家可以参考着实现,如果直接拖拽到最新版的yolov5文件夹中运行可能会出错,应该我当时那个代码片段写的比较早,后续yolov5更新了,有些函数名有变动,所以直接运行会出错。我这里有当时和这个代码片段对应的yolov5的代码,但是不太知道这是哪个版本的yolov5。所以有需要的朋友直接在公众号:万能的小陈 后台回复 qtv5,获取整个文件夹以及模型,配置环境后可以直接运行,配置环境教程可以参考这里注:压缩包名字为qt5_yolov5_1.0的对应原始版本,也就是下面代码片段可以直接用的,qt5_yolov5 ...