- 博客(340)
- 收藏
- 关注
原创 linux内核网络中的互斥 “每日读书”
网络代码中广泛使用上锁本书中每项主题下可能都会发现上锁的议题对众多程序设计类型而言尤其是针对内核的程序设计互斥上锁机制以及同步都是一般性主题而且相当有趣复杂linux不但引入互斥而且对一些方法做了优化本节只总结在网络代码中所见到的上锁机制建议参阅ORelly出版的深入理解linux内核和linux设备驱动程序中深入而详尽的讨论。每种。
2024-03-25 23:05:35 259
原创 ARM汇编程序设计 注释 “每日读书“
熟悉了ARM体系结构和常用的汇编指令我们就可以尝试编写简单的ARM汇编程序了。在一段完整的汇编程序中不仅包含了各种汇编指令和伪指令还包含了各种伪指令。伪操作可以让程序员更加方便的编写汇编程序实现更加复杂的逻辑功能。351ARM汇编程序格式ARM汇编程序是以段section为单位进行组织的。在一个汇编文件中可以有不同的section分为。
2024-03-20 23:06:11 426
原创 linux内核网络-使用协议族创建socket“每日读书“
我们回到sockcreate函数中继续往下分析创建了socket以后代码1150行与1153行在netfamilies数组中检查对应family的协议族操作表有没有安装回忆下服务器程序创建socket时代码。serversockfdsocket;我们先不关心其他参数重点注意传递的family。
2024-03-19 11:03:57 328
原创 intel至强系列CPU以及介绍
英特尔至强 Silver 4214Y 处理器(16.5M 高速缓存,2.20 GHz)|2019年二季度|12|3.20 GHz|2.20 GHz|16.5 MB|85 W||||英特尔至强 Silver 4410Y 处理器(30M 高速缓存,2.00 GHz)|2023年一季度|12|3.90 GHz|2.00 GHz|30 MB|150 W||
2024-03-14 16:55:39 330
原创 C语言属性声明“每日读书”
当编译器遇到一个函数调用时,它会尝试将这个调用替换为函数的代码本身,这被称为内联函数。是一个内联函数的声明,告诉编译器这个函数应该被内联。当编译器遇到一个函数调用时,它会尝试将这个调用替换为函数的代码本身,这被称为内联函数。声明的函数, 可以在自己的文件中重新定义一个同名函数,最终编译器编译的时候,会选择定义的函数,如果没有重新定义这个函数,那么编译器就会执行。:这是一个别名,是一种类型别名声明,可以用来给类型取别名,这样就可以用更简洁的方式来引用一个类型,增强代码的可读性。地址对齐,就可以这样定义。
2024-03-14 09:44:44 271
原创 linux内核网络揭秘《二》“每日读书”
(例如,net_device结构的释放函数就是dev_put)(如处理数据的协议,或者接收的给定数据封包来自的设备驱动程序)
2024-03-13 21:49:08 454
原创 GCC编译选项作用 “每日读书”
执行全局的共同子表达式消除,它可以在编译时分析代码中的数据流,并消除一些重复计算的子表达式,从而减少程序的运行时间和空间复杂度。:执行预测性的共同子表达式消除,它可以在编译时分析代码中的数据流,并预测哪些表达式可以被消除,从而减少程序的运行时间和。:执行部分预取,它可以在编译时分析代码中的数据流,并预测哪些数据可以被提前读取,从而减少程序的运行时间和空间复杂度。:执行循环剥皮,它可以将一些循环中的操作提取到循环体外执行,从而减少循环的执行次数,提高程序的运行效率。
2024-03-08 09:46:07 253
原创 3.6 C语言和汇编语言混合编程 “每日读书”
在ARM平台下,无论是C程序,还是汇编程序,只要大家遵守ARM子程序之间的参数传递和调用规则,就可以很方便的在C程序中调用汇编子程序,或者在一个汇编程序中调用C程序。我们在main.c 中定义了main函数和sum函数,在一个汇编文件SUM.S中定义了一个汇编子程序SUM_ASM。1 子程序间要通过寄存器R0-R3 传递参数,当参数大于4个时,剩余的参数使用堆栈来传递。4 r12作为调用过程中的临时寄存器,一般用来保存函数的栈帧基址,记作FP。5 r13作为堆栈指针寄存器,一般记作SP。
2024-03-07 22:37:24 425
原创 ARM GNU 汇编 “每日读书“
在GNUARM汇编程序中如果我们想定义一个浮点数那么可以使用下面的伪操作来定义。标签,命令ffloat314equf31415我们可以使用float伪操作定义一个浮点数f并初始化为314如果你想将这个浮点数重新赋值为31415则可以通过equ伪操作来完成。equ伪操作除了给数据赋值还可以把常量定义在代码段中。
2024-03-07 08:03:51 855
原创 BSS段的小秘密 “每日读书“
通过上面的学习我们已经对程序编译运行的整个流程有了一个基本的了解但是还是遗漏了一点内容那就是关于BSS段的加载与运行。对于未初始化的全局变量和静态局部变量编译器将其放置在BSS段中BSS段不占用可执行文件存储空间的早期的计算机存储器比较昂贵节省磁盘空间。虽然BSS段在可执行文件中不占用空间但是当程序加载到内存的时候加载器会在内存中。
2024-03-06 23:15:57 197
原创 socket创建<二>
假如把上述结构都合在一起,socket的定义中,必然形成一个庞然大物,很多与具体协议相关的结构变量大多数时间都是处于不使用的空闲状态,但是分配结构空间时,还是要同事为他们开辟相应的内存空间,这样的使用方法不灵活还要浪费大量的系统内存。sk_buff数据包结构体是一个非常重要的数据结构,每个协议都适用该结构体用于封装,载运数据包,也就是说,每一个数据包都要用一个sk_buff,数据结构来表示,这里只列出重要的部分的内容。//数据包销毁的函数。
2024-02-29 23:19:38 550
原创 socket的创建
define sk_state __sk_common.skc_state //链接状态。#define sk_family __sk_common_skc_family //地址族。*结构inet_timewait_sock也会使用sock_common,*用于后备队列使用,它总是使用自旋锁并且 懒散式的访问,因此而定义*所以不要在__sk_common前面添加任何内容*//socket的类型。(比如文件节点inode)
2024-02-22 23:25:02 348
原创 网络文件系统
在分析sockcreate过程之前必须先了解一下网络的初始化入口这有助于理解后面的分析过程。我们先介绍一个与文件系统有关的结构变量sockfstype。在2626内核的netsocketc中。代码清单sockfstype结构变量的定义staticstructfilesystemtype。
2024-02-22 18:05:00 615 1
原创 sys_socketcall 代码片段分析
读者可以根据图11和代码清单11所列出的函数在glibc源码中看到它们都会执行系统调用syssocketcall函数函数syssocketcall是内核提供给socket通信的总入口对于这个函数分析我们把重点放在与路线有关的内容上因此只摘取了syssocketcall函数中关键的代码部分如代码清单1。
2024-02-21 23:40:11 341
原创 socket函数到系统调用的过程
linux应用程序使用的C运行库是GNU的glibc读者可以从GNU的官方网站下载该库的源码文件也可以从Linux的发布网站下载本书例子中使用的glibc版本是236服务器程序客户端程序调用的库函数均可在glibc源码中找到。例如服务器程序调用的socket函数读者就可以打开目录glibc236中的soc。
2024-02-21 10:46:27 625
原创 3.7 GNU ARM汇编语言
在ARM平台下从事嵌入式软件开发大家会遇到各种不同的集成开发环境和编译器例如IARADSIRVDSKeilMDKRealVidewMDKARM交叉编译器aarmlinuxgcc等如果将这些不同的IDE归类一般可以分为两大类一类IDE内部集成了ARM编译器另一类则使用开源的GNUGCCforARM编译器。为了方便在后续。
2024-02-04 23:38:43 869
原创 程序的编译、链接、安装和运行
在windows下开发一个C程序会用到集成开发环境比如VC++Keil之类的。IDE使用方便IDE工具为我们封装好了工程管理器编译器汇编器链接器调试器二进制工具等。嵌入式开发环境一般不太一样处理器平台和软件生态碎片化多样化。为了提高性价比不同的嵌入式系统往往采取更灵活的配置不同的CPU平台不同大小的存储不同的启动方式导致我们在编译程序时有时候不仅要考虑。
2024-01-29 23:47:10 97
原创 pixel_avg2_w20_neon x264像素宽度为20的均值计算
vst1.32 {d2[0]}, [r0,:32], r1 //vst1.32 {d2[0]}, [r0,:32], r1 指令表示将寄存器 存储回去。vst1.32 {d6[0]}, [r0,:32], r1 //d6[0] 低 32位 存储到 r0的位置 最后计算的结果d6存储回去。//d2 中的数据的低 32 位存储到内存地址 [r0 + r1] 处。//vst1.32 {d2[1]}, [r0,:32], r1 的意思是将寄存器 d2 中的数据的高 32 位存储到内存地址。
2024-01-19 17:21:01 379
原创 arm寻址方式
栈是程序运行过程中非常重要的一段内存空间,栈是C语言运行的基础,函数内的局部变量,函数调用过程中要传递的参数,函数的返回值一般是保存在栈中的。不同的ARM指令又有不同的寻址方式,比较常见的寻址方式有寄存器殉职,立即寻址,寄存器偏移寻址,寄存器间接寻址,多寄存器寻址,相对寻址。在多寄存器寻址中,用大括号{}括起来的是寄存器列表,寄存器之间用逗号隔开,如果是连续的寄存器,还可以使用连接符-连接,如r0-r3,就表示r0,r1,r2,r3这4个寄存器。ARM中的B,BL,ADR指令其实都是采用相对寻址的,
2024-01-18 22:48:57 608
原创 ffmpeg中AVFrame解码linesize确定
总结:ffmpeg的AVFrame linesize对齐方式和机器支持的simd有关,avx512就是64字节,avx256就是32字节。//每次将最低有效二进制位+1,这样做的目的,比如当前是16的整数倍,调整为32的整数倍。解码视频分辨率 720x1280 , 解码后 AVFrame linesize 768。由上面代码可见,AVFrame的linesize源自于 pool的linesize。解码视频分辨率 480x640, 解码后AVFrame linesize 512。linesize计算过程。
2024-01-18 17:04:36 641
原创 x264中的avg_w8函数汇编实现
arm环境下,寄存器传递参数有4个,寄存器r0,r1,r2,r3。src2 计算源数据地址2, i_src2 计算源数据linesize。src1 计算源数据地址1,i_src1 计算源数据linesize。dst 结果存储地址, i_dst 存储结果的linesize。ldr ip, [sp, #4]. 最后一个参数height。ldr lr, [sp, #4] 倒数第二个参数height。入栈都是反向入栈的,最后的参数最先入栈。一 对应的c语言实现。
2024-01-17 18:35:17 439
原创 符号重定位和段重定位
即使在将两种重定位同意对待的链接器中,此二者仍然有一个重要区别,符号引入会包括两个参数,符号所在的段的基地址和符号在段内的偏移地址,而段就只有基地址,没有偏移量了。重定位和符号解析所要求的条件有些许不同,对于重定位,需要调整的基地址的数量相当小,也就是一个输入文件中的段的个数,不过按目标文件格式的要求。一旦链接器决定了每个段的位置,它就需要相应的调整程序中存储的符号地址。调整程序中的段间引用,需要根据目标地址新的段地址进行重新计算并调整,相对地址的引用,则需要根据目标段地址以及引用者所在段的地址进行调整。
2024-01-13 11:06:13 377
原创 K001 ENCP视频编码芯片
根据经验和试跑的结果,将目标频率设定成140MHZ,而4K@30fps @140M的吞吐率指标实际上也就意味着,每个LCU 的处理时间只有560个周期,综合考虑该周期约束和前面提及的面积约束后,K001 ENCP 不得不通过降低编码质量的方式来换取编码性能,因此K001 ENCP 只能提供一个中下水平的编码质量。(1)第1级LCU流水线流水线将唤醒模块IME进行整像素运动估计,如果开启了工具Lip 第1级LCU流水线还将唤醒模块RMD进行粗略的模式估计。(2)第2级LCU流水线将唤醒FME进行分像素预测。
2024-01-07 10:18:36 362
原创 linux内核tcp syn seq读取
/ 获取随机数,用随机数生成密钥,存入net_secret。这样在接受连接一端,就会判断seq是符合递增的逻辑的,不会拒绝这次syn请求。2.1 复用之前的timewait端口连接的最后一次的序列号。*选择64 ns周期的时钟是可以的。*对于10 Mb/s以太网,1 MHz时钟是合适的。通过上面的seq_scale 生成最终的随机数seq。tcp_v4_init_seq 参数是链接四元组。*进一步的阅读表明,这是假设2 Mb/s的网络。tcp_v4_init_seq 函数。尽可能接近RFC 793。
2024-01-03 16:19:18 510
原创 程序的重定位
并为其确定将要加载到的地址,但是,这个程序被加载时,所预设的那个加载地址可能不可用。一旦链接器确定了每一个段的位置,需要根据这个段的地址修改存储区中所有与之相关的地址信息,在大多数体系结构中,数据中的地址都是绝对的,嵌入到指令中的地址可能是绝对的,也可能是相对的。相比链接时重定位,加载时重定位比较简单,链接时重定位,需要根据段的大小和段的位置重新定位程序中的地址项,而在加载时,整个程序会被当成一个巨大的段,加载器的重定位只需要判断原计划的加载地址和实际的加载地址之间的差异即可。7.1 硬件和软件重定位。
2024-01-02 23:33:33 378
原创 x265 getResidual 函数解释
在这里,d4 表示一个 64 位的 NEON 寄存器(双字寄存器),而 q2 表示两个 64 位寄存器组成的 128 位 NEON 寄存器。因此,d4 可以是 q2 的一部分,即 q2 可以包含 d4。这意味着在某些情况下,可以将 d4 视为 q2 的一部分数据,或者从 q2 中提取出 d4 的数据进行操作。simd 寄存器 r0 = r0 + r3;simd 寄存器 r1 = r1 + r3;simd 寄存器 r0 = r0 + r3;simd寄存器 r1 = r1 + r3;/*将结果保存到 r2。
2024-01-02 14:49:00 333
原创 3.5.3 伪操作
一个C程序经过预处理后,这些预处理命令一般会全部消失,预处理后的代码变成了一个完全由C语言关键字和标准语法构成的原汁原味的C程序,然后编译器才能对这些源程序进行语法,语义分析,最后变异成二进制可执行文件,在整个编译过程中,编译器是不认识这些预处理命令的,如果编译之前不坐处理,则编译器就会报错。同理,汇编中,为了编程方便,也有助记符,方便对汇编程序做各种处理,如使用AREA来定义一个段section, 使用GBLA来定义一个数据,使用ENTRY来制定汇编程序入口,这些指令助记符统称为伪指令或者伪操作。
2023-12-31 15:27:13 438
原创 3.5 ARM汇编程序设计
ARM汇编程序是以段为单位进行组织的,在一个汇编文件中,可以有不同的section, 分为代码段,数据段等,各个段之间相互独立,一个ARM汇编程序至少要有一个代码段。一个代码段,一个数据段,两个段相互独立。在C程序中,我们可以使用//或者/**/ 来注释代码,在汇编程序中,我们同样也可以添加注释,我们使用分号,来注释代码,在一个空行的行首或者一条指令语句的末尾添加一个分号,然后就可以在分号后面添加注释。在局部标号的饮用格式中,由大括号{}括起来的部分是可选项,N表示局部标号,其余的参数说明如下。
2023-12-27 00:15:02 370
原创 HEVC帧间预测
这种模式下,如果解码端按照相同的方式建立候选列表,则只需要传输最优项在列表中的索引即可,大大节省了编码比特数。AMVP模式也需要构建MV候选列表,与合并模式的区别在于,AMVP的候选列表仅包含2个候选项,并且候选项只有空域和时域两种类型,并且从列表中选取的最优项并不直接作为当前块的MV,而是作为预测运动矢量MVP并进行差分编码,也就是对这运动矢量餐叉MVD进行编码,AMVP模式下,解码端按照相同的方式建立候选列表,则仅仅需要传输MVD与最优项在列表中的索引即可。
2023-12-20 08:01:00 369
原创 hevc编码块划分和帧内模式
为了提供更精确的预测以及提高帧内预测的编码效率,H265相对H264做了许多改进,H265 具有更丰富的预测单元尺寸以及更多的PU划分方式,并且帧内预测模式的的数量也大大增加,对于亮度块帧内预测。考虑到相邻PU的预测模式之间具有较大的相似性,H265对亮度预测模式编码时,会根据相邻块的预测模式建立最可能模式(most probable modes, MPM)列表,列表中包含3种预选模式,如果当前PU的最优预测模式位于MPM列表中,则仅仅需要编码该模式。色度预测模式数量较少,编码时采用直接编码。
2023-12-13 22:50:49 468
原创 HEVC参考帧技术
b) 当接收到POC=1的片头中传输的RPS信息(描述了解码POC=1的帧时,DPB的状态,即POC=0和2的帧用作当前帧的short-term参考,poc=4的帧用作后续帧的参考)后,对DPB中的帧进行状态的标记,将POC=2和2的帧标记为Used for short-termreference,并且保留POC=0的帧,以用作后续参考,然后解码POC=1 帧,解码完成,将POC=1的帧放入DPB中,此时,DPB中有POC=0,4,2,1四帧。中有三个参考帧,分别是POC=0,4,2的帧。
2023-11-21 12:03:05 232
原创 B Label, BL Label 指令
BL跳转指令表示带链接的跳转,在跳转之前,BL指令会先将当前指令的下一条指令地址(即返回地址)保存到LR寄存器中,然后跳转到label处执行,BL指令一半用在函数调用的场合,主函数在跳转到自函数执行之前,会先将返回地址,即当前跳转指令的吓一条指令地址保存到LR寄存器中,自函数执行结束后,LR寄存器中的地址将被赋值给PC,处理器就可以返回到原来的主函数中继续运行了。常见的移位操作有逻辑移位和算数移位,两者的区别是,逻辑移位无论是左移还是右移,空缺的一律补0,而算数移位则不同,左移补0,右移补符号位。
2023-11-21 00:19:21 199
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人