自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

团长的专栏

让总结成为一种习惯

  • 博客(176)
  • 资源 (7)
  • 收藏
  • 关注

原创 C语言拾遗

C语言拾遗,用了这么多年的c语言,发现很多地方还是不知道,不少地方还是似是而非

2024-04-05 14:39:10 290

转载 Linux中执行Shell脚本的三种实现方式----是否在子shell中执行的问题

这篇文章主要介绍了Linux中执行Shell脚本的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教−。

2024-03-13 22:01:16 48

原创 makefile中静态库链接顺序对链接的影响

例如:libtest2.a依赖libtest1.a,可执行文件test依赖libtest2.a,则链接顺序为:-llibtest2.a -l libtest1.a,而不能反过来,否则会出现链接错误,某些符号找不到。在链接静态库时,如果静态库之间存在依赖关系,则存在依赖关系的静态库在链接时存在链接顺序的问题,否则会出现找不到链接符号的错误,undefined reference to `XXX'.) -l(上层逻辑lib) -l(中间封装lib) -l(基础lib) -l(系统lib) -o $@

2024-01-18 20:15:03 469

转载 深入理解Linux2.6内核的Initrd机制解析

initrd 的英文含义是 boot loader iniTIalized RAM disk,就是由 boot loader 初始化的内存盘。在 linux内核启动前, boot loader 会将存储介质中的 initrd 文件加载到内存,内核启动时会在访问真正的文件系统前先访问该内存中的 initrd 文件系统。

2023-12-15 20:37:56 151

转载 ramfs、tmpfs、rootfs、ramdisk介绍

内核在启动初始化过程中会解压缩initrd文件,然后将解压后的initrd挂载为根目录,然后执行根目录中的/init脚本(cpio格式的initrd为/init,而image格式的initrd为/initrc),您就可以在这个脚本中运行initrd文件系统中的udevd,让它来自动加载realfs(真实文件系统)存放设备的驱动程序以及在/dev目录下建立必要的设备节点。ramdisk的大小是固定的,安装在其上的文件系统大小也是固定的。

2023-12-15 20:28:11 318

原创 SSL/TLS认证握手过程

client读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后,利用对应 CA的公钥解密签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性,即公钥合法。客户端会内置信任CA的证书信息(包含公钥),如果CA不被信任,则找不到对应 CA的证书,证书也会被判定非法。哈,有人的地方就有江湖,有江湖的地方就没有绝对的安全。但SSL/TLS确实可以极大程度保证信息安全。签名的产生算法:首先,使用散列函数计算公开的明文信息的信息摘要,然后,采用 CA的私钥对信息摘要进行加密,密文即签名。

2023-05-23 20:04:16 2309

转载 传输层安全协议TLS-协议解析

握手协议如字面所言,是在加密通信之前,对于加密使用的算法套件及加密密钥进行协商,这和在两个陌生人开始聊天前,通常都需要礼节性的握手类似。这就像你俩已经聊过天了,在上次聊天中,约定好了以后聊天时使用的方式。版本发布已有十年时间,期间互联网需求及密码学都发生了翻天覆地的变化,经过长时间需求累计和修订,此版本相较之前版本,无论是性能还是安全方面都可谓是有了较大的发展,因此本文主要针对。再把水搅浑点,事实上,握手阶段中的一些消息也都是经过加密的,而且在握手阶段使用的加密密钥同应用数据传输时使用的加密密钥是不同的。

2023-05-23 19:52:20 417

转载 传输层安全协议TLS-密码学概述

比如平时大家都喜欢在网上买东西,付款时需要输入账户密码,如果网上传输的是实际密码本身,黑客只要简单窃听下网线上的消息即可获取交易密码,所以在实际的交易过程中不能直接传输密码原文,必须使用密钥对交易的密码进行加密再传输。然而,要正确使用数字签名,有一个大前提,那就是用于验证签名的公钥必须属于真正的发送者。以上两个威胁中黑客只使用窃听等被动攻击手段,并没有实施篡改或拦截消息等其他主动攻击,然而现实中,黑客往往更加强力,具备主动攻击的能力,同样随着攻击者的攻击能力升级,也会带来更加难以解决的对安全通信的威胁。

2023-05-23 19:45:38 355

原创 c拾遗-二级指针、数组内函数

1、c语言中二级指针用途1:一般被用在多维数组的环境中,一个二级指针可以指向一个二维数组;用途2:二级指针作为函数参数使用时,可以通过函数修改实参指针值的目的。

2022-12-16 18:39:17 483

转载 wireshark抓包出现“TCP segment of a reassembled PDU”的解释

为什么大家看到这个以后总是会往MSS,TSO上联系呢?也许第一个解释这个的人是个高手,而且以MSS/MTU/TSO的观点解释了这个问题,还有一种可能就是TSO等技术让人觉得太牛逼,毕竟是底层硬件机制吧,抓包机制又是作用于网卡层面的,所以很自然会觉得TSO会有关联。 事实上,这个跟TSO没有关系!跟MSS有一定的关系但不是全部因果关系,在阐述“TCP segment of a reassembled PDU”之前,先把TSO理清再说。当有人问题“这个包会不会被TSO分段”这类问题时,只要看该T

2022-12-05 10:30:19 2362

转载 虚拟内存与物理内存的联系与区别

操作系统有虚拟内存与物理内存的概念。在很久以前,还没有虚拟内存概念的时候,程序寻址用的都是物理地址。程序能寻址的范围是有限的,这取决于CPU的地址线条数。比如在32位平台下,寻址的范围是2^32也就是4G。并且这是固定的,如果没有虚拟内存,且每次开启一个进程都给4G的物理内存,就可能会出现很多问题:因为我的物理内存时有限的,当有多个进程要执行的时候,都要给4G内存,很显然你内存小一点,这很快就分配完了,于是没有得到分配资源的进程就只能等待。当一个进程执行完了以后,再将等待的进程装入内存。这种频繁的装入内

2022-05-31 15:32:04 908 1

转载 链接脚本基本语法

本文绝大部分翻译自https://users.informatik.haw-hamburg.de/~krabat/FH-Labor/gnupro/5_GNUPro_Utilities/c_Using_LD/ldLinker_scripts.html最后一小部分翻译自:Builtin Functions (LD)加上了一些我自己的备注。链接脚本控制每次链接。这样的脚本是用链接器命令语言编写的。链接脚本的主要目的是描述如何将输入文件中的各个section(节)映射到输出文件中,并控制输出文件的内存布

2022-05-27 18:48:19 3047

转载 链接脚本(Linker Scripts)语法和规则解析(翻译自官方手册)

原链接:链接脚本(Linker Scripts)语法和规则解析(翻译自官方手册)_BSP-路人甲的博客-CSDN博客_链接脚本语法 为了便于与英文原文对照学习与理解(部分翻译可能不准确),本文中的每个子章节标题和引用使用的都是官方手册英文原称。命令及命令行选项统一使用斜体书写。高频小节会用蓝色字体标出。3 Linker Scripts每个链接都由一个链接脚本控制。该脚本使用链接器命令语言编写。链接脚本的主要目的是描述如何将输入文件中的各个部分映射到输出文件中,并控制输出文件的内存布局。大多数

2022-05-17 21:03:26 5891

原创 c语言中的0、‘0’、‘\0’、“0”及NULL

c语言中的0、‘0’、‘\0’、“0”及NULLASCII表字符的表示方法:①单引号表示法:例如 ‘A’②十进制表示法:直接使用该字符在ASCII表中的序号(即十进制值),例如65③转义字符表示:使用 ‘\index’,其中index为该字符在ASCII表中的(八进制或16进制)值,例如 ’\101’(八进制)和 ’\0x41’(16进制)。使用该方法时,\ 后面的字符值只能使用该字符在ASCII表中的八进制值和16进制值,且默认使用八进制;使用16进制需要在 \ 后面加0x。上面的’A’、65、

2022-04-20 22:20:52 4341 1

原创 初识flash芯片----写之前为什么要先擦除

虽然一开始工作就接触过flash芯片,但都是应用层次的接触,并没有直接接触到flash驱动。直到最近要基于驱动接口直接操作flash芯片,才发现自己对它的使用特定一点都不了解。先说一下自己的问题,原本打算对flash中的存储空间进行覆盖写,即写过数据后不擦除直接用新的数据进行覆盖。没想到验证的时候一直乱码,查了资料才知道,原来flash芯片不支持覆盖写,只能在擦除过的区域进行写操作,想要重写数据,必须进行擦除,而且擦除一般是按照扇区或者是块进行擦除。根本原因其实是flash芯片的写操作只能将1变为0

2022-03-27 20:58:01 15061 12

转载 Linux多线程操作pthread_t

进程概念进程是表示资源分配的基本单位,又是调度运行的基本单位。例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格、内存空间、磁盘空间、I/O设备等。然后,把该进程放人进程的就绪队列。进程调度程序选中它,为它分配CPU以及其它有关资源,该进程才真正运行。所以,进程是系统中的并发执行的单位。在Mac、Windows NT等采用微内核结构的操作系统中,进程的功能发生了变化:它只是资源分配的基本单位,而不再是调度运行的单位。在微内核系统中,真正调度运行的基本单位是线程。因此,实现并发

2021-10-16 19:50:50 796

转载 python中使用c类型的数组

Python 在 ctypes 中为我们提供了类似C语言的数据类型,它的用途(我理解的)可能是:(1) 与 其他语言(如 C、Delphi 等)写的动态连接库DLL 进行交换数据,因为 python 的 数据与 DLL难以进行数据交换。(2) python 的字符串一旦形成,是不可变的,为了算法的需要,我们有时需要对字符串进行原位操作 ( in place ),而不想浪费另外的内存空间。(3) python 具有很简明的语法,人们乐于使用。在解决实际问题时,字符串的处理占据了很大的开发量。

2021-05-24 23:15:57 3013

转载 Python值传递还是引用传递

Python值传递还是引用传递Python作为一门动态语言,变量本身的类型是不固定的,因此更加灵活。那Python到底是值传递还是引用传递呢?问题引出本人在本周写代码时,遇到这么一个让我注意的问题,问题可以抽象如下:def func(val1): val2 = val1 val2.append(1) ...a = []...(一系列对a的操作)b = afunc(a)print(b)当我执行上述后,发现“b”的值也发生了改变。由此引发了我对Python...

2021-05-24 23:07:31 1748

原创 socket链接中几种常见的错误

做一个简单的总结,请大家多多补充1. ETIMEOUT: connection timeoutsocket通信中,如果server端没有发送ACK SYN分片响应client端的SYN分片,connect函数则会返回timeout错误2. ECONNREFUSED: connection refused当client端收到server端的RST报文,connect函数则会返回connection refused错误返回RST报文的三种情况:目的地为某端口的SYN到达,然而该端口上没有正在

2021-05-21 20:42:17 2381 4

原创 linux系统资源监控命令

最近问题调试用到了几个资源监控命令,记录一下问题简单说就是linux下面一个发包线程会卡顿几秒钟,造成报文发送中断,通过监控最终发现是io资源紧张影响了线程写日志,进而阻塞了线程发包1. top 查看cpu 内存等资源以及进程/线程的运行情况 top -b -d 1 -i >> top.log //不接受交互,一秒钟打印一次输出,并将其重定向到log文件2. mpstat cpu的使用情况 mpstat -P ALL >> mpsta...

2021-05-01 19:41:16 585

原创 linux网络-数据包的发送过程

继上一篇介绍了数据包的接收过程后,本文将介绍在Linux系统中,数据包是如何一步一步从应用程序到网卡并最终发送出去的。如果英文没有问题,强烈建议阅读后面参考里的文章,里面介绍的更详细。本文只讨论以太网的物理网卡,并且以一个UDP包的发送过程作为示例,由于本人对协议栈的代码不熟,有些地方可能理解有误,欢迎指正socket层socket(...):创建一个socket结构体,并初始化相应的操作函数,由于我们定义的是UDP的socket,所以里面存放的都是跟UDP相关的函数s...

2021-04-18 22:53:23 464

原创 Linux网络-数据包接收过程

本文将介绍在Linux系统中,数据包是如何一步一步从网卡传到进程手中的。如果英文没有问题,强烈建议阅读后面参考里的两篇文章,里面介绍的更详细。本文只讨论以太网的物理网卡,不涉及虚拟设备,并且以一个UDP包的接收过程作为示例.本示例里列出的函数调用关系来自于kernel 3.13.0,如果你的内核不是这个版本,函数名称和相关路径可能不一样,但背后的原理应该是一样的(或者有细微差别)网卡到内存网卡需要有驱动才能工作,驱动是加载到内核中的模块,负责衔接网卡和内核的网络模块,驱动在加载的时候将自

2021-04-18 22:48:13 1627

原创 子shell以及什么时候进入子shell

最近写shell脚本程序,碰到一个问题:需要一个全局变量来反复保存和更新一些统计信息,但每次在shell主程序的函数中更新完后,主程序中的值却没有变化,仍是初始值后来发现执行更新操作的函数是后台执行的,若将其变成前台执行则全局变量每次都可以顺利更新和保存。查得下面这篇文章,原来后台执行的函数是在子shell中执行的,父子shell和父子进程一样,都是单通的,子shell所继承的父shell变量是一个副本,其改动只在子shell中生效,并不会影响父shell,要想将其回传父shell,则需要考虑进程间

2021-01-31 22:45:43 920 5

转载 C语言调用so动态库的两种方式

方式1:类似静态库的调用(使用头文件)这种方式生成的程序会在启动时候就加载so动态库。add.hint add(int x, int y);add.c#include "add.h"int add(int x, int y) { return (x + y);}main.c#include <stdio.h>#include "add.h"int main(){ int sum = add(7, 8); printf("7+

2020-12-11 23:16:03 4071 1

转载 C语言localtime和asctime时间函数中的陷阱

晚上调试程序,碰到一个奇怪的问题:在程序的多个地方调用了time和localtime函数获得当前系统时间,然后在程序运行结束后一次性打印程序前面几次获得的系统时间,但是打印出来的几处时间居然都是最后一个时刻的时间。后来尝试把每次获得的时间通过本地变量保存一份,统一打印的时候打印本地保存的变量值,才能输出期望的结果。关于这个问题在网上找到了一篇解释:在编写C语言的应用程序时,为了获取或者打印一些跟时间有关的信息,我们经常会使用到C语言自带的一些时间函数,诸如:time、localtime、ctim

2020-11-26 23:18:09 960

原创 python子进程调用shell命令的返回值问题

接触python不久,最近碰到一个棘手的问题,关于subprocess.Popen通过ret=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)的形式,在shell中执行cmd命令通过ret.returncode获得返回值通过retout=ret.comunication()[0]获取输出问题就在于cmd的形式和返回值及返回输出上:如果cmd中带有重定向操作,那么retoutd就无法获得cmd的输出;如果cmd中指定后台.

2020-11-01 22:41:09 1132 2

原创 git切换分支相互影响的问题

问题描述: 今天遇到一个git分支切换的问题,我在分支A上做了修改,然后切换到其他分支后发现其他分支上也存在A分支上的修改。(我记得之前碰到这种情况,是无法切换分支的,git会提醒当前A分支上有未提交的改动,这次虽然能切换了(当时就感觉奇怪),果然又碰到现在这个问题)原因:如果当前分支所做的修改没有提交就切换去其他分支也会看到相同的修改,所以解决这个问题有两个办法。 解决办法:用git add和git commit提交修改,只要用 git status 检查工作区和暂存区是干净的就可以了。 那..

2020-10-16 23:19:15 5329 4

原创 c语言中sizeof详解

解析C语言中的sizeof一、sizeof的概念sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。二、sizeof的使用方法1、用于数据类型 sizeof使用形式:sizeof(type)  数据类型必须用括号括住。如sizeof(int)。2、用于变量 sizeof使用形式:sizeof(var_name)或..

2020-10-15 23:55:19 131260 4

原创 git 常用命令总结

git clone /vob/xx_workspace/sdk_xx zhangsan_xx_gz //克隆一个分支到xx_xx_gzgit clone [email protected]:/vob/xx_workspace/sdk_xx zhangsan_xx/cd zhangsan_xx_gzgit checkout master //切换到master分支,master分支是创建工作区是默认创建的分支,可以直接切换远程分支git checkout filenam...

2020-09-30 23:27:14 229

原创 git分支介绍

.1 Git 分支 - 何谓分支何谓分支为了理解 Git 分支的实现方式,我们需要回顾一下 Git 是如何储存数据的。或许你还记得第一章的内容,Git 保存的不是文件差异或者变化量,而只是一系列文件快照。在 Git 中提交时,会保存一个提交(commit)对象,该对象包含一个指向暂存内容快照的指针,包含本次提交的作者等相关附属信息,包含零个或多个指向该提交对象的父对象指针:首次提交是没有直接祖先的,普通提交有一个祖先,由两个或多个分支合并产生的提交则有多个祖先。为直观起见,我们假设在工作目录

2020-09-30 22:24:00 265

转载 交换机端口vlan tag/untag处理情况

为了理解VLAN内报文的转发,就必须要知道交换机对于不同VLAN报文的tag/untag的处理原则。首先,需要明确一点就是,在交换机的内部,为了快速高效的处理,报文都是带tag转发的。其实,这点很好理解,因为交换机上很可能会配置多个VLAN,那不同VLAN流量区分只有依靠tag标签。下面从报文入和报文出两个方向来介绍。l报文入方向:在入方向上,交换机的根本任务就是决定该报文是否允许进入该端口,根据入报文的tag/untag的属性以及端口属性,细分为如下情况:1)...

2020-09-29 23:07:25 10221

原创 vlan原理详解

1.为什么需要VLAN1.1什么是VLAN?VLAN(Virtual LAN),翻译成中文是“虚拟局域网”。LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络。VLAN所指的LAN特指使用路由器分割的网络——也就是广播域。在此让我们先复习一下广播域的概念。广播域,指的是广播帧(目标MAC地址全部为1)所能传递到的范围,亦即能够直接通信的范围。严格地说,并不仅仅是广播帧,多播帧(Multicast Frame)和目标不明的单播帧(Unknown Unicast F.

2020-09-29 23:01:21 734

原创 DHCP协议说明及报文分析

DHCP几个概念:DHCP Client:DHCP客户端,通过DHCP协议请求IP地址的客户端。DHCP客户端是接口级的概念,如果一个主机有多个以太接口,则该主机上的每个接口都可以配置成一个DHCP 客户端。交换机上每个Vlan接口也可以配置成一个DHCP客户端。DHCP Server:DHCP 服务端,负责为DHCP客户端提供IP地址,并且负责管理分配的IP地址。DHCP Relay:DHCP中继器,DHCP客户端跨网段申请IP地址的时候,实现DHCP报文的转发功能。DHCP Securi

2020-09-29 22:50:21 6451 2

转载 C语言中移位操作

先要了解一下C语言里所有的位运算都是指二进制数的位运算。即使输入的是十进制的数,在内存中也是存储为二进制形式。“<<”用法:格式是:a<<m,a和m必须是整型表达式,要求m>=0。功能:将整型数a按二进制位向左移动m位,高位移出后,低位补0。“>>”用法:格式是:a>>m,a和m必须是整型表达式,要求m>=0。功能...

2019-07-25 18:19:06 27821 1

原创 Linux内核事件通知链

Linux内核事件通知链一、概念:大多数内核子系统都是相互独立的,因此某个子系统可能对其它子系统产生的事件感兴趣。为了满足这个需求,也即让某个子系统在发生某个事件时通知其它的子系统,Linux内核提供了通知链的机制。通知链表只能够在内核的子系统之间使用,而不能够在内核与用户空间之间进行事件的通知。通知链表是一个函数链表,链表上的每一个节点都注册了一个函数。当某个事情发生时,链表上所有节点对...

2019-06-21 14:11:47 1583

转载 Linux slab 分配器剖析

Linux slab 分配器剖析了解 Linux 内存管理的方式动态内存管理内存管理的目标是提供一种方法,为实现各种目的而在各个用户之间实现内存共享。内存管理方法应该实现以下两个功能:最小化管理内存所需的时间 最大化用于一般应用的可用内存(最小化管理开销)内存管理实际上是一种关于权衡的零和游戏。您可以开发一种使用少量内存进行管理的算法,但是要花费更多时间来管理可用内存。也可...

2019-06-21 13:33:23 303

转载 Linux写时拷贝(COW)

COW技术初窥: 在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,linux中引入了“写时复制“技术,也就是只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。 那么子进程的物理空间没有代码,怎么去取指令执行exec系统调用呢? 在fork之后exec之前两个进程用...

2019-05-30 17:25:21 2016

原创 多进程引用动态链接库中的全局变量问题

多进程引用动态链接库中的全局变量问题现象描述:前提:存在一个动态库libvlan.so,存在一个应用console。做法:在console中调用libvlan.so中的两个APIs,分别是设置和获取动态库中一个全局变量的值。结果:在console中的操作没有问题,设置和获取都正常;但在动态库中打印该全局变量,其值并没有改变。结论:动态库中的全局变量,在被其他进程使用...

2019-05-23 16:37:09 6919

转载 linux内核中的IS_ERR()、PTR_ERR()和ERR_PTR()

linux内核中的IS_ERR()、PTR_ERR()和ERR_PTR()在看内核源码的时候,经常会遇到IS_ERR,比如在linux/arch/arm/kernel/sys_arm.c中asmlinkage int sys_execve(char __user *filenamei, char __user * __user *argv,char __user * __...

2019-05-23 16:12:40 3235

转载 automake,autoconf使用详解

作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Makefile,如果要想写出一个符合自由软件惯例的Makefile就不那么容易了.在本文中,将给大家介绍如何使用autoconf和automake两个工具来帮助我们自动地生成符合自由软件惯例的 Makefile,这样就可以象常见的 GNU程序一样,...

2019-03-29 18:27:36 640

lwip嵌入式tcpip协议栈详解,pdf带目录,老衲五木

lwip网络协议栈; 嵌入式网络协议栈入门材料; 出自老衲五木;

2022-02-05

粒子群算法解决TSP问题

粒子群算法解决旅行商问题,c++实现,完整源代码,可直接运行

2015-06-20

zigbee无线网络和收发器 译文 mac部分

zigbee无线网络和收发器一书的MAC部分的译文,主要介绍了802.15.4协议的mac层

2015-04-10

zigbee网络建立与加入

TI公司推出的zigbee协议栈,介绍了网络的建立过程,并对节点加入网络做了分析,对代码进行了详细的说明

2015-02-19

zigbee开发工具使用说明

zigbee开发环境安装说明,zigbee协议栈安装说明以及仿真器使用和驱动程序安装说明

2014-10-17

ZigBee.Wireless.Networks.and.Transceivers

zigbee无线网络和收发器 被称作zigbee领域的葵花宝典,全书虽为英文,但读起来也并不困难,通俗易懂,结构清晰

2014-07-23

计算机专业英语

计算机专业的必备英语知识,还附有最新计算机领域的新动态

2012-11-09

空空如也

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

TA关注的人

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