自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

hhhlizhao的博客

为中国IT业的进步而奋笔!

  • 博客(113)
  • 资源 (3)
  • 收藏
  • 关注

原创 TCP三次握手第一次握手不需要携带ACK,最后一次握手不需要携带SYN

在做一个tcp报文相关的需求验证时发现,用打流仪构造了3个tcp报文,用来进行tcp的连接。报文构造好后依次打流3次,发现tcp三次握手未成功,检查报文发现第一个tcp报文设置了ACK字段为1,最后一个报文设置了SYN标识为1,怀疑为这两处设置错误导致未建连。将第一报文ACK字段设为0,最后一个SYN标识也设为0后,再次打流tcp成功established。tcp报文是严谨的,必须遵循严谨的定义,任何一个字段设置不当都可能导致三次握手的失败。tcp三次握手的完整过程如下。

2024-04-09 21:34:19 69

原创 linux gdb反汇编定位问题

从汇编指令可看出,加载补丁后在原函数基础上加了8字节的偏移,补丁的原理就是在原来函数基础上加上跳转,到补丁函数地址执行,之所以是8字节,因为ldr指令和br各占4字节,总共是8字节,这也是为什么有些函数太小就无法做补丁的原因,因为函数本身大小没有达到汇编跳转指令的大小。日前解决一现网问题遇到补丁加载未生效现象,想要验证流程是否走进补丁代码,由于补丁函数和原函数名称一样,且修改代码较少,通过普通gdb方法难以看出是否走进补丁,但可用gdb反汇编方法来验证。

2023-12-18 12:27:31 118

原创 C/C++语言的安全编码规范

安全编码的内容非常广泛,涉及变量、断言、函数、循环、异常机制、类、安全退出、字符串/数组操作、整数、内存、不安全函数、文件输入/输出、敏感信息处理等各方面,这里简略叙述最重要的内存、函数、字符串处理等几个模块,以期能达到举一反三作用,引导大家树立安全编码思想。通过函数参数传递数组或一块内存进行写操作时,函数参数必须同时传递数组元素个数或所传递的内存块大小,否则函数在使用数组下标或访问内存偏移时,无法判断下标或便宜的合法范围,产生越界访问的漏洞。3、通过防御性的编码策略来弥补潜在的编码人员的疏忽。

2023-12-11 00:07:24 302

原创 C++11新特性

long long类型:长整型,占8字节,可表示范围-2^63 ~ 2 ^ 63 - 1。要使用long long 类型的整数必须标注对应的后缀:对于有符号的long long 类型,后缀用"LL"或者"II"标识,就比如"10LL"就表示有符号超长整数10。对于无符号的long long 类型,后缀用"ULL"或者"UII"标识,就比如"10ULL"就表示无符号超长整数10。

2023-11-19 19:00:23 33

原创 C语言指针强转的本质

该函数里面先是将传入的指针强转为了pub_head_t类型,之后又偏移了该结构体大小的位置,继续读取值,看到这里我产生了一丝疑问,传入的指针指向某块内存,该块内存数据被强制转换为了pub_head_t结构体类型,那么该内存块的大小应该就是该指针类型的大小,为什么后面又偏移了sizeof(pub_head_t)去读取数据?C语言指针类型强转的本质是,原指针指向的内存数据类型会被转换为所转换指针的类型,其范围是该指针类型的大小,而不是原指针指向的整块内存。其中的结构体变量类型如下。

2023-11-16 21:40:45 171

原创 Linux内存管理--smaps文件详解

比如该区域所映射的物理内存部分同时也被另一个进程映射了,且该部分物理内存的大小为1000KB,那么该进程分摊其中一半的内存,即Pss=500KB。通过top命令我们已经能看出进程的虚拟空间大小(VIRT)、占用的物理内存(RES)以及和其他进程共享的内存(SHR)。• Rss:驻留内存大小,是进程当前实际占用的物理内存大小,包括进程独自占用的物理内存、和其他进程共享的内存。通过查看进程的smaps文件,可以获取进程每个内存映射块的详细信息,分析这些信息,可帮助定位如内存泄漏等内存问题。

2023-09-10 23:39:30 1942

原创 记录第一篇被”华为开发者联盟鸿蒙专区 “收录的文章

是记录、分享,以及更好的思考。坚持写作的动力是什么?

2023-08-06 21:53:26 2925

原创 Linux内核--内存管理

在计算机出现的早期,其内存资源十分有限,一般只有几十几百KB,当时的程序规模也小,对于当时的程序而言,KB级的内存资源尚足够使用。但随着计算机技术的发展,应用程序的规模不断膨胀,一个难题终于出现在程序员的面前,即应用程序太大,内存已经容纳不下。最初解决该问题的办法是把程序分割成许多分称为覆盖块(overlay)的片段。覆盖块0首先运行,结束时调用另一个覆盖块继续运行。虽然覆盖块的交换是由OS 完成的,但是必须先由程序员先进行分割,这是一个费时费力的工作,而且相当枯燥。

2023-07-23 19:35:20 243

原创 Linux内核子系统--进程管理剖析

Linux 是一个计算需求不断变化的非常动态的系统。Linux 计算需求的表示以进程的公共抽象为中心,进程可以是短期的(从命令行执行的命令)或长期的(网络服务)。因此,进程的总体管理及其调度非常重要。在用户空间中,进程由进程标识符 (PID) 表示。从用户的角度来看,PID 是唯一标识进程的数值。PID 在进程的生命周期中不会改变,但 PID 可以在进程终止后重用,因此缓存它们并不总是理想的。在用户空间中,您可以通过多种方式创建进程。

2023-07-22 22:24:14 201

原创 Linux内核--五大子系统

Linux内核有五大核心子系统,分别是进程调度系统、虚拟文件系统(VFS)、内存管理单元(MMU)、网络单元、进程间通信(IPC)。在Linux内核中的主要组件中,五个核心子系统是最为重要的组成部分,它与系统调用接口(System Call Interface)、以及Arch层组成了整个Linux的内核的框架。其中,System Call Interface(SCI)提供从用户空间到内核空间执行接口调用的方法,该接口可以依赖于体系结构,即使在同一处理器系列中也是如此。

2023-07-21 21:43:58 1806

原创 Linux的五种I/O模型

在了解这几种I/O之前,徐要先明确同步异步,阻塞非阻塞的概念。

2023-07-18 22:38:03 315

原创 USB协议总结

在了解USB协议之前,先了解下该总线协议出现的背景。在USB总线出现之前,计算机与键盘、鼠标、扫描仪、打印机都使用专用的接口连接,不同设备的接口不能互用,扩展性很差。每次插拔设备都要关闭计算机,不支持热插拔,通信率也较低。为了解决上述问题,就诞生了USB总线。USB是通用串行总线(Universal Serial Bus)的缩写,它就好像一条管道,管道里流过的东西只要符合USB协议,至于具体流的是什么东西,USB总线并不关心,可以是自来水,可以是污水,也可以是天然气,等等。

2023-07-10 00:06:40 700

原创 SPI通信协议

由图可见,在SCK为奇数(更正:这里应该是偶数)边沿(在这里该边沿为下降沿)时,数据得到有效采样,也就是说,在这个时刻,MISO和MOSI的数据有效,高电平表示数据1,低电平表示数据0,在其它时刻数据并无效,可以理解为为下一次MISO和MOSI的数据传输做准备。图中红色框框即为有效数据被采集的时间点,”CPOL = 0″所在的脉冲信号表示的是用于进行数据同步的SCK,MOSI和MISO线上的数据在每个SCK时钟周期传输一位数据,注意,数据的输入/输出是可以同时进行的。(1)通讯的起始/结束信号。

2023-06-25 20:45:00 328

原创 UART协议总结

发送数据之前,UART之间要约定好数据的传输速率(即每位所占据的时间,其倒数称为波特率)、数据的传输格式(即有多少个数据位、是否使用校验位、是奇校验还是偶校验、有多少个停止位)。(2)当要发送数据时,UART改变TxD数据线的状态(变为0状态)并维持1位的时间,这样接收方检测到开始位后,再等待1.5位的时间就开始一位一位地检测数据线的状态得到所传输的数据。(3)UART一帧中可以有5、6、7或8位的数据,发送方一位一位地改变数据线的状态将它们发送出去,首先发送最低位。(1)设置波特率、传输格式。

2023-06-14 00:06:09 392

原创 IIC协议总结

每个从设备有自己的设备地址,主设备发送START信号后,紧跟着发送想要通信的从设备地址字节,7位器件地址+1位读写标志位(0为写,1为读)。2).发送一个地址字节(包括7位地址码和一位R/W,最后1bit为0,表示写),将地址写入地址计数 器;1). 主控检测到总线处于空闲时,首先发送一个START信号来控制总线,此时总线进入忙状态;6). 主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线。3).主设备通信完成后,发送STOP信号释放总线,总线处于空闲状态。

2023-06-12 00:11:17 388

原创 gdb高级功能commands用法

执行以上设置后,程序每运行到xxx位置时,会触发commands指令,从而自动执行bt、c、end三个动作,之后程序会自动往下走,不影响其运行。gdb的commands命令可以让程序在每次到达断点时自动执行一组命令,以帮助程序员更好观察程序运行过程,定位程序运行问题。在commands中可加入任意gdb指令,以帮助程序员获取更多程序运行信息,灵活使用该功能可提高问题定位效率。

2023-05-30 18:44:26 429

原创 算法总结-深度优先遍历和广度优先遍历

所以广度优先遍历也叫层序遍历,先遍历第一层(节点 1),再遍历第二层(节点 2,3,4),第三层(5,6,7,8),第四层(9,10)。(1)、我们从根节点1开始深度优先遍历,它相邻的节点有2、3、4,依先遍历节点2,再遍历2的右边节点5,再遍历9,至此便无可遍历的节点。对于每个节点来说,先遍历当前节点,然后把右节点压栈,再压左节点(这样弹栈的时候会先拿到左节点遍历,符合深度优先遍历要求)。广度优先遍历,指的是从图的一个未遍历的节点出发,先遍历这个节点的相邻节点,再依次遍历每个相邻节点的相邻节点。

2023-04-11 22:44:59 15265 1

原创 内存泄漏问题定位

VIRT代表进程使用的虚拟内存大小,RES代表进程使用的物理内存大小,SHR代表进程使用的共享内存大小,%MEM代表进程使用的物理内存百分比。如果内存使用率偏高,应关注文件系统内存占用、共享内存占用及各个业务进程内存占用,可用top查看各个进程CPU使用情况。malloc申请内存,并memset后,只是VIRT增长,RES不增长,使用后RES才增长。VIRT:malloc申请,不一定马上使用。RES:内存使用的时候才增长。

2023-03-25 20:09:19 362

原创 算法总结-回溯算法

回溯算法也可以叫做回溯搜索法,它是一种搜索方法。回溯是递归的副产品,只要有递归就会有回溯(递归中隐藏着回溯算法)。所以以下讲解中,回溯函数也就是递归函数,指的都是一个函数。

2023-03-22 22:01:21 546

原创 算法总结-递归

进一步剖析「递归」,先有「递」再有「归」,「递」的意思是将问题拆解成子问题来解决, 子问题再拆解成子子问题,...,直到被拆解的子问题无需再拆分成更细的子问题(即可以求解)。「归」是说最小的子问题解决了,那么它的上一层子问题也就解决了,上一层的子问题解决了,上上层子问题自然也就解决了,....,直到最开始的问题解决。文字说可能有点抽象,那我们就以阶层 f(6) 为例来看下它的「递」和「归」。最简单的递归函数就是阶层函数,factorial函数存在factorial(n-1),因此是递归函数。

2023-03-13 22:48:58 150

原创 Linux时间戳和UTC时间

UNIX时间戳(timestamp):计算机中的UNIX时间戳,是以GMT/UTC时间1970-01-01T00:00:00为起点,到当前具体时间的秒数(不考虑闰秒)。GMT时间:Greenwich Mean Time,格林尼治平时,又称格林尼治平均时间或格林尼治标准时间。中国人常用的北京时间比UTC时间快8个小时。也即UTC时间凌晨0点时,北京时间已经是早上8点,这就是为啥全世界人往往不直接用UTC时间计时原因。它实际上反映了一种约定,即为全世界所认可的一个统一时间,而不是某特定地区的时间。

2023-03-10 20:15:00 1268

原创 static函数被优化问题

定义为static的函数在编译时可能会被优化,在so中可以用nm -D命令查看该函数是否被优化。若能在so中找到该函数,则未被优化,反之则被优化。

2023-02-24 20:14:26 271

原创 addr2line 定位异常栈问题

addr2line命令来自于英文词组”address to line“的缩写,其功能是将函数地址解析成文件名或行号。给出一个可执行文件中的地址或一个可重定位对象中的偏移部分的地址,使用调试信息来找出与之相关的文件名和行号。首先查看异常栈中具体是哪个so出现的异常,并确定偏移地址。0x44a44为异常栈信息中的偏移地址。

2023-02-24 20:08:35 559

原创 gdb中查看堆栈信息

frame n命令可查看某一个frame(函数,栈帧)里的变量值等信息。frame命令可以查看当前frame(函数,栈帧)里的变量值等信息。info locals:打印出当前函数里所有的局部变量的命令。down n:表示往栈顶方向下移n层(n默认值为1)info catch:打印出当前函数中的异常处理信息。n是bt命令返回的数字,标识是哪一个frame。(4)up/down命令,向上或向下移动栈帧。(2) f(frame)命令。(3)frame n命令。(1)bt命令,如下。

2023-02-07 12:18:34 2813

原创 Linux corefile文件定位问题

Linux程序运行遇到异常问题可以通过corefile文件来定位,文件一般位于系统后台/xx/corefile目录,名称为core-xx-xxxx-31480-slot0-cpu0-20210607222740.gz或.bak之类。取出corefile文件,解压,gunzip core-xx.gz,将解压出的corefile文件放到系统后台,用gdb工具进行定位, gdb /usr/local/bin/secmng core-xxx。

2023-02-07 12:17:31 435

原创 gdb加载符号表

(1) info sharedlibrary --查询符号表地址。加载的地址为第一个命令查到的地址。

2023-02-05 17:08:51 1793

原创 gdb常用命令

在当前行号的前面或者后面的offset行停住,offset为自然数。set print elements 0: 显示完全打印信息。查看当前堆栈(断点所在的调用栈)。直接回车表示,重复上一次命令。查看当前栈帧中的信息。

2023-02-05 17:06:27 1055

原创 git rebase执行失败恢复方法

(3)执行git rebase --abort终止上一次的错误操作;(4)从第一步git rebase -i HEAD~xxx重新开始。git reset --hard e56ba47d 或。(2)找到rebase的节点,如上,输入。(1)git reflog查看日志。

2023-02-05 16:56:58 2663

原创 git合并提交记录

如果一个MR提交了很多次,就会引入很多条提交记录,这时候想要精简提交记录,删除无用的记录,就可以使用git rebase操作。以上步骤执行后会弹出commit信息窗口,使用dd命令删除我们想要删除的commit信息。执行rebase操作后会出现如下界面,将要清除的提交记录由pick改为squash。git rebase -i HEAD~3 --这里以合并3条提交记录为例。可以删除所有commit信息,只保留第一条。3、删除多余的commit记录。4、提交修改后的commit。

2023-02-05 16:53:32 4567

原创 git生成密钥方法

若省略-f,则命令运行之后会提示输入一个文件名,以保存刚才生成的SSH key密钥:"Enter file in which to save the key (/c/Users/xxx(用户名)/.ssh/id_rsa):"这时正常情况下会生成id_rsa.pub和id_rsa文件。打开Git Bash,查看ls ~/.ssh下是否有密钥文件id_rsa*,有的话可先进行备份。将以上生成的id_rsa.pub文件中的密钥拷贝出来,添加到GitHub上的SSH Keys中。-f 指定密钥文件存储文件名。

2023-02-05 16:47:42 13201

原创 git pull强制覆盖本地修改

git reset --hard origin/develop --或git reset --hard HEAD。git reset --hard HEAD --git reset后是否不需要clean?验证仍然需要clean。有时本地代码做了修改,但又想放弃这部分修改,又不想另拉代码做开发,这时可用如下方法覆盖先前修改。git clean --验证未成功。

2023-02-05 16:34:27 5044

原创 git命令总结

指的是某个branch在服务器上的最新状态,我们可以在本地通过它查看刚取回的更新信息:git log -p FETCH_HEAD。git stash save "test-cmd-stash":作用同上,但可以给stash添加注释信息。git stash:命令会把所有未提交的修改保存到git堆栈(包括git add和未add的)。git stash --keep-inde:只会把未git add的保存到git堆栈。git stash clear:删除所有缓存的stash。命令将拉取的内容合并到当前分支。

2023-02-05 16:30:13 395

原创 GIT拉取代码本地修改与远程仓代码冲突问题

这个问题的引发原因是本地代码进行了修改,但事先又没有进行git pull进行更新,这时用git pull拉取远程仓代码进行更新时,就会报本地代码合远程仓代码冲突的错误:“Your local changes to the following files would be overwritten by merge: ...”。c、git stash --keep-index,这时就会只备份没有git add的文件。这时更新的代码和我修改的没有冲突的了,所以可以git pull成功。git status查看。

2023-02-05 16:26:24 2062

原创 git解决代码冲突问题

也可git log查看代码提交历史。a、进入本地代码根目录,执行git remote add upstream xxx操作(若添加错,可用git remote remove upstream 回退),添加远程战队仓地址。这里的代码冲突,指的是在由远程个人仓推送到远程公共仓的过程中,报了代码冲突的问题。其原因是公共仓中有人改了相同的代码,但本个人仓中又没有及时更新,所以提交就会报代码冲突的问题。e、git push origin xxx将解决过冲突的代码推到远程仓(此处是推到了个人仓的远程分支)。

2023-02-05 16:01:49 2144 1

原创 Windows Git开发及提交代码流程

公司中代码仓一般有个人仓和公共仓,进行代码开发时一般要在github中fork公共仓代码到个人仓,然后本地下载个人仓代码进行开发。开发完成后提交代码也是提交到个人仓,之后再同步到公共仓,在这个过程中,一般较为正规的流程是还需要commiter和其他开发对代码进行review,确定无误后才可以合入公共仓,通过这种白盒检视的方法可以有效提高软件质量,减少问题流出率。首先需要安装GIT TortoiseGit工具,安装好后即可在Windows上直接进行git各种操作,十分方便。1、使用git下载代码。

2023-02-05 15:55:34 445

原创 函数指针用法详述

在编译器进行编译时,会为程序中的函数分配一段存储空间,用于存放函数,该存储空间位于内存的代码段,它的首地址就称为函数的地址,函数名表示的也是这个地址。既然是地址,我们就可以定义一个指针变量来表示它,这个指针变量就是函数指针。指针变量如何定义?虽然同样是指向一个地址,但指向函数的指针变量同指向变量的指针变量的定义方式不同。函数指针的定义方式如下:这个语句就定义了一个指向函数的指针变量 p。

2023-02-02 20:26:56 224

原创 算法总结--快慢指针

快慢指针

2022-12-21 23:40:39 583

原创 Docker容器使用基础

执行 sudo docker commit -a "nathan" -m "create new img" eda05ad514f8 consul:v0 命令以容器为基础生成新的镜像 consul:v0。docker run base-centos echo "hello world" --但这会留下一个已退出的容器。后台运行的docker,可以使用docker start name 或 ID先启动,然后用。docker ps -a:查看正在运行和已经退出(停止)的容器。

2022-10-06 22:46:39 414

原创 Ubuntu 20.04安装SElinux

修改过之后一定要reboot系统才能生效。另外,开启了SElinux有可能导致ssh服务无法使用,从而影响ssh登陆功能,需要修改其规则才可。或修改配置文件/etc/selinux/config,将SELINUX=disabled改为 SELINUX=enforcing。Ubuntu默认安装的安全组件为AppArmor,要安装SElinux需要先移除AppArmor。1.使用systemctl停止Apparmor服务。4.安装SELinux及相关包。5.查看SELinux安装情况。

2022-10-06 22:43:21 2924

原创 Depends:xxx but it is not going to be installed

出现这个问题时,首先查看/etc/apt/source.list确保源说正确的,如果源未正确设置,则按正确方法设置源,然后执行sudo apt-get update更新源。如果已确保源是正确的,但该问题还是存在,则安装aptitude对依赖关系进行智能处理。

2022-10-05 21:20:55 2666

用于linux下基于ftp的vsftp服务器源码vsftpd-3.0.2.tar.gz

基于ftp协议的linux服务器,可用于linux与Windows之间的数据传输,也可用于嵌入式linux与Windows的数据传输

2017-01-08

linux下vsftp服务器源码vsftpd-3.0.2.tar.gz

2017-01-08

Linux系统安装教程

Linux系统安装教程,十分适合初学者和新手使用。

2015-08-19

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除