<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Raymond430的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Raymond430</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Raymond430]]></copyright><item><title><![CDATA[char/short/int/long/float/double之间的隐式类型转换规则]]></title><link>https://blog.youkuaiyun.com/Raymond430/article/details/140856364</link><guid>https://blog.youkuaiyun.com/Raymond430/article/details/140856364</guid><author>Raymond430</author><pubDate>Thu, 01 Aug 2024 20:17:19 +0800</pubDate><description><![CDATA[在C和C++编程语言中，隐式类型转换（也称为自动类型转换）是编译器在没有显式指示的情况下自动进行的类型转换。]]></description><category></category></item><item><title><![CDATA[TCP拥塞控制机制的原理]]></title><link>https://blog.youkuaiyun.com/Raymond430/article/details/140839521</link><guid>https://blog.youkuaiyun.com/Raymond430/article/details/140839521</guid><author>Raymond430</author><pubDate>Thu, 01 Aug 2024 09:47:47 +0800</pubDate><description><![CDATA[TCP拥塞控制是TCP中较为复杂且关键的一部分，它与TCP的许多机制有关联。本文在不深入其他TCP内容的前提下，解释TCP拥塞控制的原理，帮助读者更好地理解这一机制。在复杂的网络中，数据通过多个节点（如路由器）转发到目的地。路由器的内存有限，若同时接收到的数据过多，会导致部分数据被丢弃或处理延迟，称为网络拥塞。这不仅导致数据包丢失，还会增加TCP重传次数，进一步加剧拥塞。TCP的拥塞控制通过调整数据发送速率来应对网络拥塞，确保数据传输效率和网络资源利用率。在网络空闲时，提高发送速率；]]></description><category></category></item><item><title><![CDATA[## 运算符]]></title><link>https://blog.youkuaiyun.com/Raymond430/article/details/140654284</link><guid>https://blog.youkuaiyun.com/Raymond430/article/details/140654284</guid><author>Raymond430</author><pubDate>Wed, 24 Jul 2024 09:45:04 +0800</pubDate><description><![CDATA[#运算符的主要作用是将宏参数连接在一起形成一个新的标记，用于动态生成标识符或代码段。这使得宏在生成代码时更加灵活和强大。通过使用##运算符，可以简化重复代码的编写，提高代码的可维护性和可读性。]]></description><category></category></item><item><title><![CDATA[预处理器宏]]></title><link>https://blog.youkuaiyun.com/Raymond430/article/details/140653448</link><guid>https://blog.youkuaiyun.com/Raymond430/article/details/140653448</guid><author>Raymond430</author><pubDate>Wed, 24 Jul 2024 09:21:49 +0800</pubDate><description><![CDATA[宏定义使用#define其中，NAME是宏名，是宏的替换文本。预处理器宏是C语言中一个非常灵活和强大的工具，适用于代码替换、参数化和条件编译。理解并正确使用宏可以使代码更简洁、更易维护。可变参数宏和条件编译特别有用，允许根据不同的编译条件生成不同的代码，从而使代码更具适应性和可调试性。]]></description><category></category></item><item><title><![CDATA[ioctl操作实现的原理]]></title><link>https://blog.youkuaiyun.com/Raymond430/article/details/140644727</link><guid>https://blog.youkuaiyun.com/Raymond430/article/details/140644727</guid><author>Raymond430</author><pubDate>Tue, 23 Jul 2024 19:51:48 +0800</pubDate><description><![CDATA[ioctl用户空间调用ioctl：通过文件描述符和命令码发送控制命令。内核接收命令：内核将调用对应驱动程序的ioctl函数。命令解码和处理：驱动程序解码命令码并执行相应的操作。数据复制：安全地在用户空间和内核空间之间复制数据。返回结果：将处理结果返回给用户空间。]]></description><category></category></item><item><title><![CDATA[字符设备驱动程序的读写操作详解]]></title><link>https://blog.youkuaiyun.com/Raymond430/article/details/140632118</link><guid>https://blog.youkuaiyun.com/Raymond430/article/details/140632118</guid><author>Raymond430</author><pubDate>Tue, 23 Jul 2024 12:06:44 +0800</pubDate><description><![CDATA[在 Linux 内核开发中，用户空间和内核空间的数据传输是至关重要的。由于两者有不同的访问权限和地址空间，直接使用memcpy进行传输是不安全的。为解决这个问题，内核提供了专门的函数和。本博客将详细介绍这些函数的使用场景、参数和返回值，并通过实际代码示例展示如何在设备驱动开发中实现安全的数据传输。此外，还会讨论put_user和get_user函数，帮助读者更好地理解和掌握 Linux 内核中用户空间和内核空间之间的数据传输方法。]]></description><category></category></item><item><title><![CDATA[从系统调用到设备驱动：详解open、syscall_open和drv_open]]></title><link>https://blog.youkuaiyun.com/Raymond430/article/details/140622755</link><guid>https://blog.youkuaiyun.com/Raymond430/article/details/140622755</guid><author>Raymond430</author><pubDate>Tue, 23 Jul 2024 00:52:11 +0800</pubDate><description><![CDATA[未找到则创建新的struct inode对象，pnode指向该对象，并从文件系统中读取文件的元信息到该对象*//*将struct file对象地址填入进程的描述符数组，得到对应位置的下标赋值给fd*//*用devno在字符设备链表查找对应节点，并将该节点的地址赋值给pcdev*/）中实现，会触发内核中的相应处理函数陷入内核空间，最终调用具体的文件或设备驱动程序的。/*创建struct file对象，并将该对象的地址赋值给pfile*/位于具体的设备驱动程序代码中，是设备驱动程序中的具体实现函数，是。]]></description><category></category></item><item><title><![CDATA[详解字符设备驱动框架及操作函数的实现原理]]></title><link>https://blog.youkuaiyun.com/Raymond430/article/details/140622231</link><guid>https://blog.youkuaiyun.com/Raymond430/article/details/140622231</guid><author>Raymond430</author><pubDate>Tue, 23 Jul 2024 00:17:06 +0800</pubDate><description><![CDATA[设备的操作函数如果比喻是桩的话（性质类似于设备操作函数的函数，在一些场合被称为桩函数），则：驱动实现设备操作函数 ----------- 做桩insmod调用的init函数主要作用 --------- 钉桩rmmod调用的exitt函数主要作用 --------- 拔桩应用层通过系统调用函数间接调用这些设备操作函数 ------- 用桩 是 Linux 内核中定义的一个结构体，用于描述文件和设备的操作接口。每个文件或设备都关联一个  对象，其中包含了对文件或设备进行操作的函数指针。这个设计使得内核可以通过统]]></description><category></category></item><item><title><![CDATA[GCC编译过程]]></title><link>https://blog.youkuaiyun.com/Raymond430/article/details/140423572</link><guid>https://blog.youkuaiyun.com/Raymond430/article/details/140423572</guid><author>Raymond430</author><pubDate>Sun, 14 Jul 2024 21:34:38 +0800</pubDate><description><![CDATA[开头表示预处理指令，不是语句，不能编译不能执行，只在预处理阶段处理这些指令。预处理是编译过程的第一步，主要将不能编译的头文件、宏定义、注释等内容处理掉，由预处理器。与所需的库文件（如 C 标准库）链接起来，解决所有符号引用，生成最终的可执行文件。链接器将多个目标文件和库文件链接成最终的可执行文件：例如，下图中，链接过程中，编译是将预处理后的源代码转换为汇编代码的过程，由 GCC 编译器本身完成。：处理宏定义、文件包含和条件编译，生成扩展的源代码文件。的定义，将其链接到最终的可执行文件中。]]></description><category></category></item><item><title><![CDATA[为什么机器码和汇编语言需要区分不同的CPU架构？]]></title><link>https://blog.youkuaiyun.com/Raymond430/article/details/140419702</link><guid>https://blog.youkuaiyun.com/Raymond430/article/details/140419702</guid><author>Raymond430</author><pubDate>Sun, 14 Jul 2024 17:23:31 +0800</pubDate><description><![CDATA[CPU唯一识别的编码是机器码，机器码是处理器直接执行的二进制指令，不同的机器码表示不同的运算，汇编语言是机器码的符号化。不同的CPU因为架构不同，内部的硬件结构不一样，有不同的指令集和寄存器配置，直接使用机器码或汇编语言编写的程序无法在不同架构间移植。所以，一条在 x86 架构上合法的机器指令在 ARM 架构上可能是无效的，甚至没有对应的指令。例如，ARM精简指令集（RISC）没有原生的除法指令，需要通过一系列指令来实现除法操作，而 x86 复杂指令集（CISC）则有直接的除法指令。]]></description><category></category></item><item><title><![CDATA[SD卡存储结构]]></title><link>https://blog.youkuaiyun.com/Raymond430/article/details/140322651</link><guid>https://blog.youkuaiyun.com/Raymond430/article/details/140322651</guid><author>Raymond430</author><pubDate>Wed, 10 Jul 2024 14:13:24 +0800</pubDate><description><![CDATA[SD卡的存储结构由控制器、闪存芯片和接口组成，逻辑上则分为引导区、保留区、用户数据区、文件分配表和文件目录。控制器通过管理存储单元、执行磨损均衡和坏块管理，确保SD卡的数据存储可靠性和使用寿命。]]></description><category></category></item><item><title><![CDATA[辨析常量指针、指针常量、常量引用、引用常量的区别]]></title><link>https://blog.youkuaiyun.com/Raymond430/article/details/140289735</link><guid>https://blog.youkuaiyun.com/Raymond430/article/details/140289735</guid><author>Raymond430</author><pubDate>Tue, 09 Jul 2024 10:54:58 +0800</pubDate><description><![CDATA[的区别在于一个是引用所绑定的值是常量，另一个是引用本身是常量（实际上，引用本身不能是常量，只能是常量引用）。指针常量是指该指针本身是常量，即指针一旦初始化后不能再指向其他地址，但可以通过该指针修改其指向对象的值。引用常量是指引用本身是常量，一旦初始化后不能再绑定其他变量，但可以通过该引用修改所绑定变量的值。常量指针是指其指向的对象是常量，不能通过该指针修改所指向的值，但可以修改指针本身指向的地址。的主要区别在于一个是指针指向的值是常量，另一个是指针本身是常量。const读作常量，*读作指针，按照顺序读。]]></description><category></category></item><item><title><![CDATA[const的用法（定义和用途）]]></title><link>https://blog.youkuaiyun.com/Raymond430/article/details/140289555</link><guid>https://blog.youkuaiyun.com/Raymond430/article/details/140289555</guid><author>Raymond430</author><pubDate>Tue, 09 Jul 2024 10:49:53 +0800</pubDate><description><![CDATA[常量变量（Constant Variables）定义：常量变量是指一旦初始化后就不能再被修改的变量。用法示例：// 错误，常量变量不能被修改常量指针（Pointer to Constant）定义：指向常量的指针，意味着不能通过该指针修改它所指向的值，但可以改变指针本身指向的地址。用法示例：int a = 10;*ptr = 20;// 错误，不能通过 ptr 修改它指向的值ptr = &b;// 合法，ptr 可以指向其他地址指针常量（Constant Pointer）定义。]]></description><category></category></item><item><title><![CDATA[详解volatile 关键字]]></title><link>https://blog.youkuaiyun.com/Raymond430/article/details/140277947</link><guid>https://blog.youkuaiyun.com/Raymond430/article/details/140277947</guid><author>Raymond430</author><pubDate>Mon, 08 Jul 2024 20:27:51 +0800</pubDate><description><![CDATA[硬件优化内存访问速度低于 CPU 处理速度，使用硬件高速缓存（Cache）加速内存访问。现代 CPU 指令可以乱序执行，以充分利用指令流水线，提高执行速度。软件优化程序员优化：在编写代码时进行优化。编译器优化将内存变量缓存到寄存器。调整指令顺序，充分利用 CPU 指令流水线，如重新排序读写指令。对常规内存进行优化时，这些优化通常是透明且高效的。内存屏障解决编译器优化或硬件重新排序引起的问题。内存屏障确保特定顺序执行的操作之间的顺序性。Linux 提供了一个宏函数。]]></description><category></category></item><item><title><![CDATA[2021-10-15 C语言 函数]]></title><link>https://blog.youkuaiyun.com/Raymond430/article/details/120791145</link><guid>https://blog.youkuaiyun.com/Raymond430/article/details/120791145</guid><author>Raymond430</author><pubDate>Fri, 15 Oct 2021 21:51:27 +0800</pubDate><description><![CDATA[Day8 函数
函数的基本用法
1.定义
函数是一个完成特定功能的代码模块，其程序代码独立，通常要求有返回值，也可以是空值。
一般形式如下：
&lt;数据类型&gt;&lt;函数名称&gt;(&lt;形式参数说明&gt;){
语句序列；
return [(&lt;表达式&gt;)];
}

①　&lt;数据类型&gt;是整个函数的返回值类型，return [(&lt;表达式&gt;)]语句中表达式的值要和函数的&lt;数据类型&gt;保持一致。如无返回值应该写为void型。
②　&lt;形式参数说明&gt;]]></description><category></category></item><item><title><![CDATA[2021-09-28 C语言 指针专题（二）]]></title><link>https://blog.youkuaiyun.com/Raymond430/article/details/120536925</link><guid>https://blog.youkuaiyun.com/Raymond430/article/details/120536925</guid><author>Raymond430</author><pubDate>Tue, 28 Sep 2021 20:35:38 +0800</pubDate><description><![CDATA[Day7 指针专题（二）
字符指针与字符串
C语言通过使用字符数组来处理字符串。通常我们把char数据类型的指针变量称为字符指针变量，字符指针变量与字符数组有着密切关系，它也被用来处理字符串。
1.初始化字符指针是把内存中字符串的首地址赋予指针，并不是把该字符串复制到指针中，可通过指针将字符串的内容做修改。
例：
#include &lt;stdio.h&gt;
#include &lt;ctype.h&gt;

int main(int argc, char *argv[])
{
        char]]></description><category></category></item><item><title><![CDATA[2021-09-25 C语言 指针专题（一）]]></title><link>https://blog.youkuaiyun.com/Raymond430/article/details/120474662</link><guid>https://blog.youkuaiyun.com/Raymond430/article/details/120474662</guid><author>Raymond430</author><pubDate>Sat, 25 Sep 2021 17:40:09 +0800</pubDate><description><![CDATA[Day6指针专题（一）
指针
1.C程序设计中使用指针可以：
(1)使程序简洁、紧凑、高效
(2)有效的表示复杂的数据结构
(3)动态分配内存
(4)得到多于一个的函数返回值
2.在计算机内存中，每个字节单元（1Byte=8Bits）都有一个编号称为地址；在C语言中，内存单元的地址称为指针，专门用来存放地址的变量称为指针变量。在不影响理解的情况下，有时对地址、指针和指针变量不区分统称指针。
3.指针变量的说明：
(1)一般形式：
&lt;存储类型&gt; &lt;数据类型&gt; * &lt;指针变量名&g]]></description><category></category></item><item><title><![CDATA[2021-09-17 C语言 数组和字符串]]></title><link>https://blog.youkuaiyun.com/Raymond430/article/details/120356163</link><guid>https://blog.youkuaiyun.com/Raymond430/article/details/120356163</guid><author>Raymond430</author><pubDate>Fri, 17 Sep 2021 20:37:36 +0800</pubDate><description><![CDATA[Day5 数组和字符串
数组概述
①　构造数组类型之一。
②　数组是具有一定顺序关系的若干个变量的集合，组成数组的各个变量称为数组的元素。
③　数组中各元素的数据类型要求相同，用数组名和下标确定。数组可以是一维的也可以是多维的。
一维数组
1.定义
所谓一维数组是指只有一个下标的数组，它在计算机的内存中是连续存储的。C语言中，一维数组的说明一般形式如下：
&lt;存储类型&gt; &lt;数据类型&gt; &lt;数组名&gt; [&lt;表达式&gt;]
例:
int a[6] ;

数组名表示内存首地址]]></description><category></category></item><item><title><![CDATA[2021-09-14 C语言 控制语句]]></title><link>https://blog.youkuaiyun.com/Raymond430/article/details/120298890</link><guid>https://blog.youkuaiyun.com/Raymond430/article/details/120298890</guid><author>Raymond430</author><pubDate>Tue, 14 Sep 2021 23:27:27 +0800</pubDate><description><![CDATA[Day4控制语句
分支结构：if()~else、switch
循环结构：for()、while()、do~while()、goto
辅助控制：contine、break、return
分支结构
1.if-else语句
1.1.一般形式：
if(表达式)
	语句块1;
else
	语句块2；

1.2.常见形式
1.2.1. 简化形式：if(表达式) 语句块 ；
例：if(x&gt;y) printf(“%d”,x) ;
1.2.2. 阶梯形式：（命令行模式下输入gg=G美化代码）
if(表达式1) 语句块1]]></description><category></category></item><item><title><![CDATA[2021-09-09 C语言 输入输出专题]]></title><link>https://blog.youkuaiyun.com/Raymond430/article/details/120216229</link><guid>https://blog.youkuaiyun.com/Raymond430/article/details/120216229</guid><author>Raymond430</author><pubDate>Fri, 10 Sep 2021 10:22:01 +0800</pubDate><description><![CDATA[**
Day3输入输出专题
**
C语言没有I/O语句，I/O操作由函数实现
#include &lt;stdio.h&gt;
1.字符输出函数putchar( )
格式：putchar©
参数：C为字符常量、变量或表达式
功能：把字符c输出到显示器上
反值：正常，为显示的代码值
例：
int c ;char a ;c = 65 ;a = ‘b’ ;
putchar©;putchar(‘\n’);putchar(a);
显示结果为：
A
B
2.格式输出函数printf
格式：printf(“格式控制串”,]]></description><category></category></item></channel></rss>