- 博客(367)
- 收藏
- 关注
原创 x265 costCoeffNxN_c函数 实现原理
costCoeffNxN_c函数用来计算NxN 系数编码代价,通过数组预估的bitsStatic uint32_t costCoeffNxN_c(const uint16_t *scan, const coeff_t *coeff, intptr_t trSize, uint16_t *absCoeff, const uint8_t *tabSigCtx, uint32_t subCoeffFlag, uint8_t *baseCtx, int offset, int scanPosSigOff, int
2024-07-25 12:10:25 694
原创 linux内核网络源码 链上通知事件
通知信息由定义于kernelsysc中的notifiercallchain产生而此函数只是按照优先级次序调用对此链注册的所有回调函数。注意回调函数是在调用notifiercallchain的进程上下文ontext中执行的。然而回调函数也可以实现成把通知信息排进某处的队列然后唤醒查看此通知信息的进程。i。
2024-05-11 10:29:03 442
原创 linux内核网络源码分析--定义链
通知链列表元素的类型是notifierblock其定义如下structnotifierblockint;structnotifierblocknext;intpriority;;notifiercall是要执行的函数next用于链接列表的元素而priority代表的是。
2024-05-07 23:22:40 384
原创 linux内核网络源码--通知链
内核的很多子系统之间有很强的依赖性其中一个子系统侦测到或者产生的事件其他子系统可能都有兴趣为了实现这种交互需求linux使用了所谓的通知链。本章我们将看到通知链如何声明以及网络代码定义了哪些链内核子系统如何向通知链注册。内核子系统如何在链上产生通知信息。注意通知连只在内核子系统之间使用内核和用户空间之间的通知信息则是依赖其他机制如第三章所介绍。
2024-05-07 08:39:50 915
原创 linux内核源码分析--核心网络文件和目录
图32显示了在procsys中由网络代码所使用的主要目录就每个目录而言都列出了在哪一章描述其文件。procsysnetbridgeipv4corerouteneighconf图32procsysnet中的核心目录根据前借所述我们来看net中的树根是如何定义的以及在引导期间如何注册。对于。
2024-05-02 11:29:16 738
原创 linux内核网络-sysctl:目录/proc/sys
用户在procsys下看到一个文件实际上是一个内核变量就没个变量而言内核可以定义要将其放在procsys的何处与相同内核组建或者功能相联系的变量通常都位于同一个目录中例如在procsysnetipv4里可以找到与IPv4相关的文件。命名多数时候文件名只是简单的命名为相关联的内核变量相同的名字但是有时候为了更友好一点。
2024-04-24 08:36:52 408
原创 linux内核源码分析--通用函数指针
除了稍早讨论的netdevice结构的列表管理字段外还有一些字段用于管理一些结构确保这些结构在不需要时能予以删除。atomictrefcnt引用计数此计数器变为零之前设备无法除名参见第八章。intwatchdogtimeostructtimerlistwatchdogtimer配合先前讨论的。
2024-04-22 11:58:37 349
原创 linux 内核网络源码--流量管理“每日读书”
linux的流量控制子系统已有长足的进步并且代表着linux内核实力的一方面。相关联的内核选项为Devicedriversnetworkingsupportnetworkingoptions?Qosandorfairqueueingnetdevice结构中的相关字段包括st。
2024-04-22 00:21:11 378
原创 linux内核网络-列表管理“每日读书”
列表管理netdevice数据结构均被插入到一个全局列表和两个hash表中对此在第八章中予以描述下列字段用于完成这些任务。structnetdevicenext把每个netdevice数据结构链接为全局列表中的下一个元素structhlistnodenamehliststructhl。
2024-04-18 23:33:25 379
原创 linux内核源码分析--混杂模式“没每日读书”
某些网络管理任务会要求一个系统接收在一条共享缆线传输的所有帧而不是仅限于地址直接指定给该系统的帧一个设备如果可以接收所有封包意味着其处于混杂模式。例如应用程序检查其局域网段的性能或者安全缺陷时就需要使用这种模式。桥接代码也会用到混杂模式。最后不幸的是对恶意的窥探者而言这种模式显然有其价值所在。由于这个原因除非数据被加密否则局域网络上。
2024-04-18 13:03:25 363
原创 linux内核网络-标识符“每日读书”
有些配置字段由内核根据网络设备的各种类给定一个默认值,而其他字段给驱动程序填写,如前所述,驱动程序可以改变默认值,而有些字段甚至可以在执行期间通过像ifconfig 和ip。的命令予以改变,事实上,有些参数,--base_addr, if_port dma以及irq 通常是在设备模块加载时由用户设置的,另一方面,虚拟设备不会使用这些参数。这些字段描述设备所用的共享内存,用于设备鱼内核沟通,其初始化和访问智慧在设备驱动程序内进行, 较高分层不需要关心这些字段。设备自有内存映射到IO内存的起始地址。
2024-04-15 15:16:07 298
原创 linux内核网络-列表管理函数“每日读书”
这些函数会操作skbuff元素列表列表也称为队列(queue)函数完整的列表参见和一些最常用的函数如下。skbqueueheadinit用一个元素为空的队列对sk_buffheadskbqueueheadskbqueuetail把一个缓冲区分别添加到队列的头或尾skbdequeueskbd。
2024-04-11 11:12:26 435
原创 x265中量化函数neon汇编实现分析
mul v6.4s, v6.4s, v7.4s //系数 = 系数 * qscale int tmplevel = abs(level) * quantScale;sshl v16.4s, v6.4s, v2.4s //level << qBits >> qBits8 左移 -qBits8 >> 右移qBits8。cmeq v16.4s, v7.4s, v17.4s //v7和v17做比较,结果存储到v16, v17 = 0在这里。
2024-04-11 07:45:40 327
原创 x264中8x8 INTRA预测边缘像素块构造
static void predict_8x8_filter_c( pixel *src, pixel edge[36], int i_neighbor, int i_filters ){ int have_lt = i_neighbor & MB_TOPLEFT; if( i_filters & MB_LEFT ) //总是true { edge[15] = (src[(0)+(-1)*32] + 2*src[(-1)+(-1)*32] + src[(-1)+(0)*3
2024-04-09 18:05:03 675
原创 缓冲区的克隆和拷贝
当同一个缓冲区需要由不同的消费者个被处理时那些消费者可能修改skbuff喵舒服的内容但是内核不需要完全拷贝skbuff结构和相关联的数据缓冲区。相反为了提高效率内核可以克隆原始值也就是只拷贝skbuff结构然后使用引用计数以免过早释放共享的数据块缓冲区的克隆由skbclone函数实现。使用克隆的情况的一个例子就是当一个输入。
2024-04-09 12:04:57 694
原创 x264 8x8 水平预测汇编分析
dup v0.8b, v16.b[14] //b[14] 这个字节 横向拷贝给v0 的8字节,第0行的 首个字节。st1 {v0.8b}, [x0], x7 // 存储到内存中,也就是把8个字节存入src 然后src += 32。st1 {v4.8b}, [x0], x7 //存储到内存中,也就是把8个字节存入src 然后src += 32。dup v6.8b, v16.b[8] //第6 行首个字节。
2024-04-08 23:30:12 343
原创 x264中的亮度垂直预测汇编neon分析
pixel4 top[2] = { MPIXEL_X4( edge+16 ), //取int32 4个像素数据。st1 {v0.8b}, [x0], x7 //循环赋值8行,到src像素数据。ld1 {v0.8b}, [x1] //x1位置 读入edge 8字节到v0。add x1, x1, #16 //偏移16字节。
2024-04-08 23:22:29 226
原创 linux内核网络--skb_shared_info结构和skb_shinfo函数“每日读书”
如图2-5所示,数据缓冲区尾端有个名为skb_shared_info的数据结构,用以保持此数据区块的附加信息,此数据结构紧接在标记数据尾端的end指针之后,此数据结构的定义如下,
2024-04-08 23:05:38 547
原创 x264中的色度水平和垂直预测
i < 8;i++ )for循环8行4个像素都是1个字节的拼接到一起横向赋值给一行的前4字节横向赋值给一行的后4字节src += 32;换到下一行32是颜色像素数据的偏移一行的前4字节32是颜色像素数据的偏移一行后 4字i < 8;i++ )8行数据垂直赋值下来垂直一行的前4字节垂直一行的后4字节src += 32;
2024-04-07 07:58:43 823
原创 x264 arm64汇编分析 quant8x8_neon分析
QUANT_TWO v0.8h, v1.8h, v2, v3, v4.16b//调用自定义的QUANT_TWO函数进行量化处理。QUANT_TWO v0.8h, v1.8h, v2, v3, v5.16b//再次强调QUANT_TWO函数进行量化处理。ld1 {v2.8h, v3.8h}, [x1], #32 //从地址x1加载数据到neon寄存器v2和v3,并跳过。ld1 {v0.8h, v1.8h}, [x2], #32 //从地址x2加载数据到neon寄存v0和v1,并跳过。
2024-04-01 19:14:27 603
原创 linux 内核网络sk_buff布局字段 “每日读书”
像任何双向链表一样,通过每个sk_buff 结构中的next和prev字段实现联系,next字段只想前,prev指向后,但是,这个表还有另一项必要需求,每个sk_buff 结构必须能够快速找到整个表的头,为了实现这个,在表的开端额外增加一个sk_buff_head 结构作为一种哑元元素,sk_buff_head结构是,sk_buff 有些字段只是为了方便搜寻以及组织数据结构本身,内核在一个双向链表中维护所有的sk_buff结构,但是该表的组织比传统的双向链表更为复杂。qlen 代表表中的元素的数目,
2024-04-01 11:43:43 371
原创 Sub8x8_dct8_neon 函数分析
/ 对 v3.8h、v5.8h、v30.8h、v29.8h、v20.8h 和 v21.8h 进行 SUMSUB_SHR2 操作,结果存储在 v3.8h。// 对 v1.8h、v7.8h、v22.8h、v31.8h、v16.8h 和 v17.8h 进行 SUMSUB_SHR 操作,结果存储在 v1.8h。// 对 v2.8h、v6.8h、v26.8h、v27.8h、v18.8h 和 v19.8h 进行 SUMSUB_SHR 操作,结果存储在 v2.8h。
2024-03-30 05:50:51 625
原创 linux内核网络中的互斥 “每日读书”
网络代码中广泛使用上锁本书中每项主题下可能都会发现上锁的议题对众多程序设计类型而言尤其是针对内核的程序设计互斥上锁机制以及同步都是一般性主题而且相当有趣复杂linux不但引入互斥而且对一些方法做了优化本节只总结在网络代码中所见到的上锁机制建议参阅ORelly出版的深入理解linux内核和linux设备驱动程序中深入而详尽的讨论。每种。
2024-03-25 23:05:35 290
原创 ARM汇编程序设计 注释 “每日读书“
熟悉了ARM体系结构和常用的汇编指令我们就可以尝试编写简单的ARM汇编程序了。在一段完整的汇编程序中不仅包含了各种汇编指令和伪指令还包含了各种伪指令。伪操作可以让程序员更加方便的编写汇编程序实现更加复杂的逻辑功能。351ARM汇编程序格式ARM汇编程序是以段section为单位进行组织的。在一个汇编文件中可以有不同的section分为。
2024-03-20 23:06:11 491
原创 linux内核网络-使用协议族创建socket“每日读书“
我们回到sockcreate函数中继续往下分析创建了socket以后代码1150行与1153行在netfamilies数组中检查对应family的协议族操作表有没有安装回忆下服务器程序创建socket时代码。serversockfdsocket;我们先不关心其他参数重点注意传递的family。
2024-03-19 11:03:57 364
原创 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 1813
原创 C语言属性声明“每日读书”
当编译器遇到一个函数调用时,它会尝试将这个调用替换为函数的代码本身,这被称为内联函数。是一个内联函数的声明,告诉编译器这个函数应该被内联。当编译器遇到一个函数调用时,它会尝试将这个调用替换为函数的代码本身,这被称为内联函数。声明的函数, 可以在自己的文件中重新定义一个同名函数,最终编译器编译的时候,会选择定义的函数,如果没有重新定义这个函数,那么编译器就会执行。:这是一个别名,是一种类型别名声明,可以用来给类型取别名,这样就可以用更简洁的方式来引用一个类型,增强代码的可读性。地址对齐,就可以这样定义。
2024-03-14 09:44:44 301
原创 linux内核网络揭秘《二》“每日读书”
(例如,net_device结构的释放函数就是dev_put)(如处理数据的协议,或者接收的给定数据封包来自的设备驱动程序)
2024-03-13 21:49:08 495
原创 GCC编译选项作用 “每日读书”
执行全局的共同子表达式消除,它可以在编译时分析代码中的数据流,并消除一些重复计算的子表达式,从而减少程序的运行时间和空间复杂度。:执行预测性的共同子表达式消除,它可以在编译时分析代码中的数据流,并预测哪些表达式可以被消除,从而减少程序的运行时间和。:执行部分预取,它可以在编译时分析代码中的数据流,并预测哪些数据可以被提前读取,从而减少程序的运行时间和空间复杂度。:执行循环剥皮,它可以将一些循环中的操作提取到循环体外执行,从而减少循环的执行次数,提高程序的运行效率。
2024-03-08 09:46:07 331
原创 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 477
原创 ARM GNU 汇编 “每日读书“
在GNUARM汇编程序中如果我们想定义一个浮点数那么可以使用下面的伪操作来定义。标签,命令ffloat314equf31415我们可以使用float伪操作定义一个浮点数f并初始化为314如果你想将这个浮点数重新赋值为31415则可以通过equ伪操作来完成。equ伪操作除了给数据赋值还可以把常量定义在代码段中。
2024-03-07 08:03:51 898
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人