<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[团长的专栏]]></title><description><![CDATA[让总结成为一种习惯]]></description><link>https://blog.youkuaiyun.com/frank_jb</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; frank_jb]]></copyright><item><title><![CDATA[Netfilter 与struct nf_hook_ops 相关]]></title><link>https://blog.youkuaiyun.com/frank_jb/article/details/147569654</link><guid>https://blog.youkuaiyun.com/frank_jb/article/details/147569654</guid><author>frank_jb</author><pubDate>Sun, 27 Apr 2025 22:30:40 +0800</pubDate><description><![CDATA[1、协议/地址簇相关（#include <linux/socket.h>）) */2、hook返回值int thresh;p->pf = pf;p->sk = sk;//hook函数由 指定,其函数声明如下: nf_hookfn *hook#define NF_DROP 0 ----丢弃，释放sk_buff结构#define NF_ACCEPT 1 ----继续正常传输数据报(按照5个钩子点正常传输)]]></description><category></category></item><item><title><![CDATA[C语言拾遗]]></title><link>https://blog.youkuaiyun.com/frank_jb/article/details/137400007</link><guid>https://blog.youkuaiyun.com/frank_jb/article/details/137400007</guid><author>frank_jb</author><pubDate>Fri, 05 Apr 2024 14:39:10 +0800</pubDate><description><![CDATA[C语言拾遗，用了这么多年的c语言，发现很多地方还是不知道，不少地方还是似是而非]]></description><category></category></item><item><title><![CDATA[Linux中执行Shell脚本的三种实现方式----是否在子shell中执行的问题]]></title><link>https://blog.youkuaiyun.com/frank_jb/article/details/136692921</link><guid>https://blog.youkuaiyun.com/frank_jb/article/details/136692921</guid><author>frank_jb</author><pubDate>Wed, 13 Mar 2024 22:01:16 +0800</pubDate><description><![CDATA[这篇文章主要介绍了Linux中执行Shell脚本的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教−。]]></description><category></category></item><item><title><![CDATA[makefile中静态库链接顺序对链接的影响]]></title><link>https://blog.youkuaiyun.com/frank_jb/article/details/135683096</link><guid>https://blog.youkuaiyun.com/frank_jb/article/details/135683096</guid><author>frank_jb</author><pubDate>Thu, 18 Jan 2024 20:15:03 +0800</pubDate><description><![CDATA[例如：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 $@]]></description><category></category></item><item><title><![CDATA[深入理解Linux2.6内核的Initrd机制解析]]></title><link>https://blog.youkuaiyun.com/frank_jb/article/details/135024806</link><guid>https://blog.youkuaiyun.com/frank_jb/article/details/135024806</guid><author>frank_jb</author><pubDate>Fri, 15 Dec 2023 20:37:56 +0800</pubDate><description><![CDATA[initrd 的英文含义是 boot loader iniTIalized RAM disk，就是由 boot loader 初始化的内存盘。在 linux内核启动前， boot loader 会将存储介质中的 initrd 文件加载到内存，内核启动时会在访问真正的文件系统前先访问该内存中的 initrd 文件系统。]]></description><category></category></item><item><title><![CDATA[ramfs、tmpfs、rootfs、ramdisk介绍]]></title><link>https://blog.youkuaiyun.com/frank_jb/article/details/135024566</link><guid>https://blog.youkuaiyun.com/frank_jb/article/details/135024566</guid><author>frank_jb</author><pubDate>Fri, 15 Dec 2023 20:28:11 +0800</pubDate><description><![CDATA[内核在启动初始化过程中会解压缩initrd文件，然后将解压后的initrd挂载为根目录，然后执行根目录中的/init脚本（cpio格式的initrd为/init,而image格式的initrd为/initrc），您就可以在这个脚本中运行initrd文件系统中的udevd，让它来自动加载realfs（真实文件系统）存放设备的驱动程序以及在/dev目录下建立必要的设备节点。ramdisk的大小是固定的，安装在其上的文件系统大小也是固定的。]]></description><category></category></item><item><title><![CDATA[SSL/TLS认证握手过程]]></title><link>https://blog.youkuaiyun.com/frank_jb/article/details/130834444</link><guid>https://blog.youkuaiyun.com/frank_jb/article/details/130834444</guid><author>frank_jb</author><pubDate>Tue, 23 May 2023 20:04:16 +0800</pubDate><description><![CDATA[client读取证书中的相关的明文信息，采用相同的散列函数计算得到信息摘要，然后，利用对应 CA的公钥解密签名数据，对比证书的信息摘要，如果一致，则可以确认证书的合法性，即公钥合法。客户端会内置信任CA的证书信息(包含公钥)，如果CA不被信任，则找不到对应 CA的证书，证书也会被判定非法。哈，有人的地方就有江湖，有江湖的地方就没有绝对的安全。但SSL/TLS确实可以极大程度保证信息安全。签名的产生算法：首先，使用散列函数计算公开的明文信息的信息摘要，然后，采用 CA的私钥对信息摘要进行加密，密文即签名。]]></description><category></category></item><item><title><![CDATA[传输层安全协议TLS-协议解析]]></title><link>https://blog.youkuaiyun.com/frank_jb/article/details/130834278</link><guid>https://blog.youkuaiyun.com/frank_jb/article/details/130834278</guid><author>frank_jb</author><pubDate>Tue, 23 May 2023 19:52:20 +0800</pubDate><description><![CDATA[握手协议如字面所言，是在加密通信之前，对于加密使用的算法套件及加密密钥进行协商，这和在两个陌生人开始聊天前，通常都需要礼节性的握手类似。这就像你俩已经聊过天了，在上次聊天中，约定好了以后聊天时使用的方式。版本发布已有十年时间，期间互联网需求及密码学都发生了翻天覆地的变化，经过长时间需求累计和修订，此版本相较之前版本，无论是性能还是安全方面都可谓是有了较大的发展，因此本文主要针对。再把水搅浑点，事实上，握手阶段中的一些消息也都是经过加密的，而且在握手阶段使用的加密密钥同应用数据传输时使用的加密密钥是不同的。]]></description><category></category></item><item><title><![CDATA[传输层安全协议TLS-密码学概述]]></title><link>https://blog.youkuaiyun.com/frank_jb/article/details/130834124</link><guid>https://blog.youkuaiyun.com/frank_jb/article/details/130834124</guid><author>frank_jb</author><pubDate>Tue, 23 May 2023 19:45:38 +0800</pubDate><description><![CDATA[比如平时大家都喜欢在网上买东西，付款时需要输入账户密码，如果网上传输的是实际密码本身，黑客只要简单窃听下网线上的消息即可获取交易密码，所以在实际的交易过程中不能直接传输密码原文，必须使用密钥对交易的密码进行加密再传输。然而，要正确使用数字签名，有一个大前提，那就是用于验证签名的公钥必须属于真正的发送者。以上两个威胁中黑客只使用窃听等被动攻击手段，并没有实施篡改或拦截消息等其他主动攻击，然而现实中，黑客往往更加强力，具备主动攻击的能力，同样随着攻击者的攻击能力升级，也会带来更加难以解决的对安全通信的威胁。]]></description><category></category></item><item><title><![CDATA[c拾遗-二级指针、数组内函数]]></title><link>https://blog.youkuaiyun.com/frank_jb/article/details/128346557</link><guid>https://blog.youkuaiyun.com/frank_jb/article/details/128346557</guid><author>frank_jb</author><pubDate>Fri, 16 Dec 2022 18:39:17 +0800</pubDate><description><![CDATA[1、c语言中二级指针

用途1：一般被用在多维数组的环境中，一个二级指针可以指向一个二维数组；
用途2：二级指针作为函数参数使用时，可以通过函数修改实参指针值的目的。]]></description><category></category></item><item><title><![CDATA[wireshark抓包出现“TCP segment of a reassembled PDU”的解释]]></title><link>https://blog.youkuaiyun.com/frank_jb/article/details/128182436</link><guid>https://blog.youkuaiyun.com/frank_jb/article/details/128182436</guid><author>frank_jb</author><pubDate>Mon, 05 Dec 2022 10:30:19 +0800</pubDate><description><![CDATA[为什么大家看到这个以后总是会往MSS，TSO上联系呢？也许第一个解释这个的人是个高手，而且以MSS/MTU/TSO的观点解释了这个问题，还有一种可能就是TSO等技术让人觉得太牛逼，毕竟是底层硬件机制吧，抓包机制又是作用于网卡层面的，所以很自然会觉得TSO会有关联。
        事实上，这个跟TSO没有关系！跟MSS有一定的关系但不是全部因果关系，在阐述“TCP segment of a reassembled PDU”之前，先把TSO理清再说。当有人问题“这个包会不会被TSO分段”这类问题时，只要看该T]]></description><category></category></item><item><title><![CDATA[虚拟内存与物理内存的联系与区别]]></title><link>https://blog.youkuaiyun.com/frank_jb/article/details/125066585</link><guid>https://blog.youkuaiyun.com/frank_jb/article/details/125066585</guid><author>frank_jb</author><pubDate>Tue, 31 May 2022 15:32:04 +0800</pubDate><description><![CDATA[操作系统有虚拟内存与物理内存的概念。在很久以前，还没有虚拟内存概念的时候，程序寻址用的都是物理地址。程序能寻址的范围是有限的，这取决于CPU的地址线条数。比如在32位平台下，寻址的范围是2^32也就是4G。并且这是固定的，如果没有虚拟内存，且每次开启一个进程都给4G的物理内存，就可能会出现很多问题：

因为我的物理内存时有限的，当有多个进程要执行的时候，都要给4G内存，很显然你内存小一点，这很快就分配完了，于是没有得到分配资源的进程就只能等待。当一个进程执行完了以后，再将等待的进程装入内存。这种频繁的装入内]]></description><category></category></item><item><title><![CDATA[链接脚本基本语法]]></title><link>https://blog.youkuaiyun.com/frank_jb/article/details/125009135</link><guid>https://blog.youkuaiyun.com/frank_jb/article/details/125009135</guid><author>frank_jb</author><pubDate>Fri, 27 May 2022 18:48:19 +0800</pubDate><description><![CDATA[本文绝大部分翻译自https://users.informatik.haw-hamburg.de/~krabat/FH-Labor/gnupro/5_GNUPro_Utilities/c_Using_LD/ldLinker_scripts.html

最后一小部分翻译自：Builtin Functions (LD)

加上了一些我自己的备注。

链接脚本控制每次链接。这样的脚本是用链接器命令语言编写的。链接脚本的主要目的是描述如何将输入文件中的各个section（节）映射到输出文件中，并控制输出文件的内存布]]></description><category></category></item><item><title><![CDATA[链接脚本(Linker Scripts)语法和规则解析(翻译自官方手册)]]></title><link>https://blog.youkuaiyun.com/frank_jb/article/details/124828490</link><guid>https://blog.youkuaiyun.com/frank_jb/article/details/124828490</guid><author>frank_jb</author><pubDate>Tue, 17 May 2022 21:03:26 +0800</pubDate><description><![CDATA[原链接：链接脚本(Linker Scripts)语法和规则解析(翻译自官方手册)_BSP-路人甲的博客-优快云博客_链接脚本语法　

为了便于与英文原文对照学习与理解(部分翻译可能不准确)，本文中的每个子章节标题和引用使用的都是官方手册英文原称。命令及命令行选项统一使用斜体书写。高频小节会用蓝色字体标出。


3 Linker Scripts
每个链接都由一个链接脚本控制。该脚本使用链接器命令语言编写。

链接脚本的主要目的是描述如何将输入文件中的各个部分映射到输出文件中，并控制输出文件的内存布局。大多数]]></description><category></category></item><item><title><![CDATA[c语言中的0、‘0’、‘\0’、“0”及NULL]]></title><link>https://blog.youkuaiyun.com/frank_jb/article/details/124309094</link><guid>https://blog.youkuaiyun.com/frank_jb/article/details/124309094</guid><author>frank_jb</author><pubDate>Wed, 20 Apr 2022 22:20:52 +0800</pubDate><description><![CDATA[c语言中的0、‘0’、‘\0’、“0”及NULL
ASCII表字符的表示方法：
①单引号表示法：例如 ‘A’
②十进制表示法：直接使用该字符在ASCII表中的序号（即十进制值），例如65
③转义字符表示：使用 ‘\index’，其中index为该字符在ASCII表中的（八进制或16进制）值，例如 ’\101’（八进制）和 ’\0x41’（16进制）。使用该方法时，\ 后面的字符值只能使用该字符在ASCII表中的八进制值和16进制值，且默认使用八进制；使用16进制需要在 \ 后面加0x。
上面的’A’、65、]]></description><category></category></item><item><title><![CDATA[初识flash芯片----写之前为什么要先擦除]]></title><link>https://blog.youkuaiyun.com/frank_jb/article/details/123781097</link><guid>https://blog.youkuaiyun.com/frank_jb/article/details/123781097</guid><author>frank_jb</author><pubDate>Sun, 27 Mar 2022 20:58:01 +0800</pubDate><description><![CDATA[虽然一开始工作就接触过flash芯片，但都是应用层次的接触，并没有直接接触到flash驱动。

直到最近要基于驱动接口直接操作flash芯片，才发现自己对它的使用特定一点都不了解。

先说一下自己的问题，原本打算对flash中的存储空间进行覆盖写，即写过数据后不擦除直接用新的数据进行覆盖。没想到验证的时候一直乱码，查了资料才知道，原来flash芯片不支持覆盖写，只能在擦除过的区域进行写操作，想要重写数据，必须进行擦除，而且擦除一般是按照扇区或者是块进行擦除。根本原因其实是flash芯片的写操作只能将1变为0]]></description><category></category></item><item><title><![CDATA[Linux多线程操作pthread_t]]></title><link>https://blog.youkuaiyun.com/frank_jb/article/details/120802853</link><guid>https://blog.youkuaiyun.com/frank_jb/article/details/120802853</guid><author>frank_jb</author><pubDate>Sat, 16 Oct 2021 19:50:50 +0800</pubDate><description><![CDATA[进程概念

进程是表示资源分配的基本单位，又是调度运行的基本单位。例如，用户运行自己的程序，系统就创建一个进程，并为它分配资源，包括各种表格、内存空间、磁盘空间、I／O设备等。然后，把该进程放人进程的就绪队列。进程调度程序选中它，为它分配CPU以及其它有关资源，该进程才真正运行。所以，进程是系统中的并发执行的单位。

在Mac、Windows NT等采用微内核结构的操作系统中，进程的功能发生了变化：它只是资源分配的基本单位，而不再是调度运行的单位。在微内核系统中，真正调度运行的基本单位是线程。因此，实现并发]]></description><category></category></item><item><title><![CDATA[python中使用c类型的数组]]></title><link>https://blog.youkuaiyun.com/frank_jb/article/details/117235066</link><guid>https://blog.youkuaiyun.com/frank_jb/article/details/117235066</guid><author>frank_jb</author><pubDate>Mon, 24 May 2021 23:15:57 +0800</pubDate><description><![CDATA[Python 在 ctypes 中为我们提供了类似C语言的数据类型，

它的用途（我理解的）可能是：

(1) 与 其他语言（如 C、Delphi 等）写的动态连接库DLL 进行交换数据，因为 python 的 数据与 DLL难以进行数据交换。

(2) python 的字符串一旦形成，是不可变的，为了算法的需要，我们有时需要对字符串进行原位操作 ( in place ),而不想浪费另外的内存空间。

(3) python 具有很简明的语法，人们乐于使用。在解决实际问题时，字符串的处理占据了很大的开发量。
]]></description><category></category></item><item><title><![CDATA[Python值传递还是引用传递]]></title><link>https://blog.youkuaiyun.com/frank_jb/article/details/117234947</link><guid>https://blog.youkuaiyun.com/frank_jb/article/details/117234947</guid><author>frank_jb</author><pubDate>Mon, 24 May 2021 23:07:31 +0800</pubDate><description><![CDATA[Python值传递还是引用传递
Python作为一门动态语言，变量本身的类型是不固定的，因此更加灵活。那Python到底是值传递还是引用传递呢？

问题引出
本人在本周写代码时，遇到这么一个让我注意的问题，问题可以抽象如下:


def func(val1):
  val2 = val1
  val2.append(1)
  ...

a = []
...(一系列对a的操作)
b = a
func(a)
print(b)


当我执行上述后，发现“b”的值也发生了改变。由此引发了我对Python...]]></description><category></category></item><item><title><![CDATA[socket链接中几种常见的错误]]></title><link>https://blog.youkuaiyun.com/frank_jb/article/details/117134260</link><guid>https://blog.youkuaiyun.com/frank_jb/article/details/117134260</guid><author>frank_jb</author><pubDate>Fri, 21 May 2021 20:42:17 +0800</pubDate><description><![CDATA[做一个简单的总结，请大家多多补充

1. ETIMEOUT： connection timeout

socket通信中，如果server端没有发送ACK SYN分片响应client端的SYN分片，connect函数则会返回timeout错误

2. ECONNREFUSED： connection refused

当client端收到server端的RST报文，connect函数则会返回connection refused错误

返回RST报文的三种情况：目的地为某端口的SYN到达，然而该端口上没有正在]]></description><category></category></item></channel></rss>