生如夏花的博客

专注于工业物联网行业数据采集,嵌入式Linux系统裁剪,5G智慧网关软件开发等

PKCS之数据块填充算法

PKCS(Public Key Cryptography Standards)公钥加密标准包含了一系列公钥密码学标准,其中包含了数据填充的相关规范。

当涉及到块加密算法(例如AES)时,PKCS#7(扩展了PKCS#5)是一种常用的填充方式。

当数据长度不是加密算法所要求块大小(AES块大小为16字节)的整数倍时,就需要使用填充算法来确保数据能够被正确地加密和解密。

IO多路转接之select函数

当一个进程需要从多个文件描述中读,并写入多个文件描述符中(例如TCP服务器)。

  1. 如果采用阻塞I/O,那么前面的描述符中没有数据时就会阻塞,这样即使后面的描述符有数据也无法读取,写描述符同理。
  2. 如果采用非阻I/O,那么就需要不断轮询所有描述符(浪费CPU时间)。

当一个进程需要对一个文件描述符同时进行读写,两者并没有前后关系。如果采用阻塞I/O,那么没有数据读就会阻塞,进而导致进程无法处理写入,写阻塞时同理。

上述问题的一个解决方法是采用多线程,每个线程中对一个描述符进行阻塞I/O,缺点是线程实现复杂,同时进程支持的线程数量有限。

struct数据对齐

C语言结构体不同字段之间按照系统位数进行数据对齐,32位系统4字节对齐,64位系统8字节对齐。

GCC编译器默认会进行数据对齐,但也提供了专用属性__attribute__((packed))使结构体采用紧凑模式,不对数据进行对齐,此时sizeof获得的大小为结构体各字段的大小。

Linux内核编译

基于Ubuntu23.04编译最新版Linux内核(6.8.9),并解决编译过程中的相关问题。

根据出现的问题,需要安装一下软件:sudo apt install flex bc libelf-dev,并禁用系统相关证书:

scripts/config --disable SYSTEM_TRUSTED_KEYS
scripts/config --disable SYSTEM_REVOCATION_KEYS

文件锁之flock

文件锁的作用:当第一个进程正在读或修改文件的某个部分时,使用文件锁可以阻止其他进程修改文件的相同部分。

因此文件锁可用于多个进程之间进行同步,防止进程间的竞争状态。

Linux系统支持两组给文件加锁的不同API,分别是fcntlflock。本节主要记录flock的实现原理以及使用方式。

文件锁之fcntl

文件锁的作用:当第一个进程正在读或修改文件的某个部分时,使用文件锁可以阻止其他进程修改文件的相同部分。

因此文件锁可用于多个进程之间进行同步,防止进程间的竞争状态。

Linux系统支持两组给文件加锁的不同API,分别是fcntlflock。本节主要记录fcntl的实现原理以及使用方式。

任意多个进程在同一个给定字节上都可以有一把共享读锁,但一个给定字节上仅能有一个进程持有一把独占写锁