自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(79)
  • 收藏
  • 关注

原创 实用代码、链接、工具汇总

1、 cpu相关:查看CPU的个数https://blog.csdn.net/guowenyan001/article/details/442247592、 Linux中进程的七种状态(1)R运行状态(runing):并不意味着进程一定在运行中,也可以在运行队列里;(2)S睡眠状态(sleeping):进程在等待事件完成;(浅度睡眠,可以被唤醒)(3)D磁盘睡眠状态(Disk sleep):不可中断睡眠(深度睡眠,不可以被唤醒,通常在磁盘写入时发生)(4)T停止状态(stopped):可以通过

2021-12-23 14:37:49 635

原创 国外文献搜索免费下载网站

国外文献搜索免费下砸网站介绍

2024-03-07 15:13:24 349

原创 Ubuntu环境vscode配置Log4cplus库

查看其共享库文件安装到了/usr/local/lib,要把新共享库目录加入到共享库配置文件/etc/ld.so.conf中;(2)查看头文件在/usr /local/include/目录下是否有log4cplus。liblog4cplus.so(我这里是动态库)例如我下载的是2.0.8版本压缩包,需要解压缩。(其中make编译过程比较长,需要10多分钟)3、vscode中配置编译。

2024-01-26 16:08:46 572

原创 年终述职技巧

5W2H法则:what/why/who/when/where/how/how much。响应与前瞻 以人为师(“作者视角”转变为“观众视角”,听懂、感兴趣、认可、有收获)复盘四步法:目标回顾、结果对比、原因分析、总结及行动计划。复盘是一定要有改进的,对个人、组织、业务的影响。S:背景 T:任务 A:行动 R:结果。分类排序:按时间顺序、按结构顺序、按重要性。新目标、新思路、新行动、新规划。要有轻有重、有层次、有结构。工作关键点 工作亮点。复盘问题点 工作改进。未来展望点 工作规划。

2023-11-05 10:33:13 159

原创 【PCIE】completion timeout disable功能总结

pcie

2023-07-29 17:16:20 1940

原创 踩内存问题定位手段汇总

踩内存问题定位

2022-10-16 18:21:15 3212 1

原创 NUMA架构CPU API变更汇总

NUMA架构CPU API函数变更

2022-07-10 18:41:52 210

原创 性能优化分析工具 | perf

perf工具使用指南

2022-07-10 18:09:10 1374

原创 DMA和IOMMU概念理解

DMA:直接存储器访问,它允许不同速度的硬件装置来沟通,而不需要依赖于?CPU?的大量中断负载。DMA 传输将数据从一个地址空间复制到另外一个地址空间。当CPU 初始化这个传输动作,传输动作本身是由 DMA 控制器来实行和完成在实现DMA传输时,是由DMA控制器直接掌管总线,因此,存在着一个总线控制权转移问题。即DMA传输前,CPU要把总线控制权交给DMA控制器,而在结束DMA传输后,DMA控制器应立即把总线控制权再交回给CPU。一个完整的DMA传输过程必须经过DMA请求、DMA响应、DMA传输、DM

2022-04-30 18:15:29 3770

原创 字节对齐探讨

为什么要字节对齐在一些特定处理器上只能从特定的地址开始存取。从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列需要字节对齐的根本原因在于CPU访问数据的效率问题。假设上面整型变量的地址不是自然对齐,比如为0x00000002,则CPU如果取它的值的话需要访问两次内存,第一次取从0x00000002-0x00000003的一个short,第二次取从0x00000004-0x00000005的

2022-04-23 17:56:21 371

原创 内存BANK及RANK的概念

内存颗粒:内存BANK:逻辑BANK而这由许许多多的单元格组成的大表我们就可以理解成逻辑Bank,当然因为制造工艺及数据寻址的原因,不可能让这个表格无限大,一般内存芯片中都是将内存容量分成几个阵列来制造,即多逻辑Bank。随着内存芯片容量的不断增加,逻辑Bank数量也在不断增加,早期的16Mbit之类的芯片采用的还是两个逻辑Bank的设计,现阶段常见内存芯片的Bank一般为4个(不包括Rambus),这点大家可通过内存条的编码进行识别。内存芯片设计时在一个时钟周期内只允许对一个逻辑Bank进行操作(

2022-04-23 17:36:31 2817

原创 电脑拆机清灰及机械硬盘安装记录

这是一个悲惨的故事,陪伴我大学四年的的“小红”,最终还是因为没有得到及时的呵护而烟消玉陨!!!在此放上她的照片以作纪念不知道出风口这里怎么这么容易就断了因为进水抢救不回来了,维修人员说只能换主板。索性不补救了,主要是里面的资料比较重要,还是要把硬盘取出来滴。上工具直接开整!电脑型号:联想S410拆后盖拆硬盘希捷的500G机械硬盘(100-200元)拆内存条三星的DDR3,4GB(100-200元)拆网卡(20元左右)拆风扇和铜管CPU和显卡是集成在主板上的

2022-04-21 21:27:17 2769

原创 网站域名访问

最近申请了一个网站域名,遇到一些疑问列举出来,希望对大家有所帮助。我是在腾讯云上购买的云服务器及域名;域名购买后并不能直接访问,需要与你的云服务器绑定,并且需要进行备案;备案审核资料提交后,腾讯云客服会进行初审并进行电话沟通核实确认审核资料,后面就是进行漫长等待,我这边大概等了7天,审核通过后也不能立马访问网站,一般要等24小时左右。我遇到的问题是审核通过后网站还是访问不了,提示如下:没有找到站点您的请求的Web服务器中没有找到对应的站点!按照上述可能原因进行排查后仍然不行,我是按如下操作排

2022-04-21 20:03:47 1188

原创 初识设备树

什么是设备树?https://blog.csdn.net/qq_16777851/article/details/87202588Device Tree是一种描述硬件的数据结构,它起源于 OpenFirmware (OF)。在Linux 2.6中,ARM架构的板极硬件细节过多地被硬编码在arch/arm/plat-xxx和arch/arm/mach-xxx,采用Device Tree后,许多硬件的细节可以直接透过它传递给Linux,而不再需要在kernel中进行大量的冗余编码。Device Tree由

2022-04-10 11:08:43 109

原创 CPU | 降低流水线停滞的策略

指令流:流水线的概念,每个状态下都有一条指令在执行。execute单元会出现流水线停滞。降低流水线停滞的策略:1、分支预测2、 超标量:一个指令流里可以同时执行两个或多个指令一个线程里面的两个指令同步执行。3、 乱序执行out of order(ooo)a b c d ec要等到a、b 执行完后在执行,可以让c先停滞,让后续的d 、e继续执行然后执行reorder重新排序成c d e。也就是所谓的乱序执行。最终从fetch到commit实际是保序执行的,只是其中的指令流乱序。4、

2022-04-10 11:00:09 573

原创 PCI设备配置空间、BAR空间、BUS总线的理解整理

pcim_iomap bar地址映射,注意不能重复映射!设备在系统的PCI地址空间里申请一段来用,所申请的空间基址和大小保存在BAR寄存器里。BAR里的只是PCI域的地址空间,需要映射到IO地址空间里或者内存空间里之后软件才能使用。映射到IO空间的话,用IO读写指令和函数去访问设备;映射到内存空间的话,首先得到的是物理地址,映射到虚拟地址后就可以像用指针那样访问。IO BAR和MEM BAR分别是映射到IO空间和内存空间的BAR;每个BAR具体干嘛使设备自己定义的,要看手册。一旦BAR的值确

2022-04-09 21:52:44 10902 1

原创 copy_from_user函数的使用

访问用户态内存copy_from_user和copy_to_user这两个函数相信做内核开发的人都非常熟悉,分别是将用户空间的数据拷贝到内核空间以及将内核空间中的数据拷贝到用户空间。copy_from_user函数的功能就不只是从用户空间拷贝数据那样简单了,它还要做一些指针检查以及处理这些问题的方法来自 https://blog.csdn.net/u013750244/article/details/108021600?utm_medium=distribute.pc_relevant.none-ta

2022-04-09 21:25:43 1819

原创 DPDK优化技术

DPDK优化技术:一、内存相关优化点:Cache和内存——软件预取函数rte_prefetch0。Cache一致性——DPDK对很多结构体定义会指定对齐;避免多个核访问同一个内存地址或数据结构,采用每个核对应一个数据结构;每个接收和发送ring队列分别对应一个core。TLB和大页——常规页(4KB),如果程序比较大,可以采用大页(比如2MB),这样只需要一个表项就可以命中。以ubuntu系统为例,通过/etc/default/grub文件配置页大小。DDIO——使得外部网卡和CPU通过LLC .

2022-03-22 10:30:24 1955

原创 SR-IOV的理解

SR-IOV的理解产生背景定义相关概念使用SR-IOV 的优点产生背景在虚拟机中,一切皆虚拟。比如网卡,虚拟机看来好像有一个真实网卡,但是这个网卡是宿主机虚拟出来的硬件,也就是一堆软件代码而已,没有真实硬件。VT-D这个功能可以将物理的PCI-e设备直接分配给虚拟机,让虚拟机直接控制硬件,那么就可以避开上述的问题。但是,虚拟机会独占这个直通的PCI-e设备,一台宿主机可能有成百上千个虚拟机,如果每个虚拟机都给直通一个PCI-e设备,比如网卡,那么该造什么样的主机?拥有100个物理网卡的主机?想象一下也是

2022-03-13 23:38:47 812

原创 makefile文件

= 是最基本的赋值:= 是覆盖之前的值= 是如果没有被赋值过就赋予等号后面的值+= 是添加等号后面的值$(KBUILD_CFLAGS)是定义在根目录Makefile中的变量,它适用于整个内核树。obj-y += disk1/kernel/把disk1/kernel/目录下的文件编译进内核, -y是编译进内核,-m是编译成模块obj-y:把由foo.c 或者 foo.s 文件编译得到foo.o 并连接进内核.obj-m: 则表示该文件作为模块编译.除了y、m以外的obj-x 形式的目标都不.

2022-03-02 18:54:17 2379

原创 硬盘相关知识总结

1、 硬盘挂载https://blog.csdn.net/qq_37403371/article/details/843960992、 硬盘读写检测伪代码:1、 检测硬盘是否在位2、 打开/mnt/hd* 硬盘文件3、 初始化赋值一个CHAR型数组uContextWrite(HDD_CONTEXT_LENGTH=512字节大小,内容形式为5a5a...)4、 执行硬盘写操作,将uContextWrite内容写入硬盘5、 关闭硬盘文件6、 以读方式重新打开硬盘文件7、 读取硬盘内容到一个C

2022-02-24 16:19:52 108

原创 va_start和va_end的使用

函数参数的传递原理:函数参数是以数据结构:栈的形式存取,从右至左入栈。首先是参数的内存存放格式:参数存放在内存的堆栈段中,在执行函数的时候,从最后一个开始入栈。因此栈底高地址,栈顶低地址,举个例子如下:void func(int x, float y, char z);那么,调用函数的时候,实参 char z 先进栈,然后是 float y,最后是 int x,因此在内存中变量的存放次序是 x->y->z,因此,从理论上说,我们只要探测到任意一个变量的地址,并且知道其他变量的类型,通过指

2022-02-22 20:07:50 90

原创 shell脚本命令总结

字符串处理:1、 删除特定字符#Echo “2006-11-21 22:16:30” | sed ‘s/-//g’ | sed ‘s/ //g’ | sed ‘s/://g’得到的结果就是:20061121221630来自 https://blog.csdn.net/u012206617/article/details/82788565例如:# ls -l /dfs/slot2.1/dev/hda:

2022-02-22 16:57:52 229

原创 Linux /sys目录剖析

sysfs 文件系统总是被挂载在 /sys 挂载点上。/sys/devices 这是内核对系统中所有设备的分层次表达模型,也是 /sys 文件系统管理设备的最重要的目录结构,/sys/dev 这个目录下维护一个按字符设备和块设备的主次号码(major:minor)链接到真实的设备(/sys/devices下)的符号链接文件,它是在内核 2.6.26 首次引入;/sys/bus 这是内核设备按总线类型分层放置的目录结构, devices 中的所有设备都是连接于某种总线之下,在这里的每一种具体总线之下可以

2022-02-19 15:44:33 2116

原创 Linux热插拔hotplug处理流程

hotplug将可移动设备连入系统时,系统的后台中会依次发生如下事件:1、内核检测到新硬件插入,然后分别通知hotplug和udev。前者用来装入相应的内核模块(如usb-storage),而后者用来在/dev中创建相应的设备节点(如/dev/sda1)。2、udev创建了相应的设备节点之后,会将这一消息通知hal的守护程序(hald)。当然udev还得保证新创建的设备节点可以被普通用户访问。3、hotplug装入了相应的内核模块之后,会把这一消息通知给hald。4、hald在受到hotp

2022-02-18 09:31:05 1846

原创 支持固定硬盘插槽脚本实例

背景:当设备支持2个及两个以上硬盘槽位时(这里举例有两个硬盘槽位C0和C1),用户无法判断哪个硬盘槽位插的是hda,哪个是hdb,因为内核检测机制是哪个硬盘先被扫描到,哪个就认为是hda。通过修改hotplug脚本,可以实现固定硬盘槽位,比如C0对应hda,C1对应hdb。脚本实例:#一个是disk,表示设备本身,对应的$DEVPATH $MAJOR $MINOR分别是/block/hda0: 8 0#一个是partition,表示设备上的分区,对应的$DEVPATH $MAJOR $MINOR分别是

2022-02-17 19:40:53 504

原创 物理地址、虚拟地址、总线地址&&常规内存、高端内存、I/O内存、设备内存的理解

(1)物理地址CPU地址总线传来的地址,由硬件电路控制其具体含义。物理地址中很大一部分是留给内存条中内存的,但也常被映射到其他存储器上(如显存、bios等)。在程序指令中的虚拟地址经过段映射和页面映射后,就生成了物理地址,这个物理地址被放到CPU的地址线上。(2)总线地址总线的地址线或在地址周期上产生的信号。外设使用的是地址总线,cpu使用的是物理地址。物理地址和总线地址之间的关系有系统设计决定的。在X86平台上,物理地址就是总线地址,这是因为它们共享相同的地址空间。在其他平台上,可能需要转换/映射

2022-02-10 17:58:29 351

原创 list_for_each_entry_rcu的使用方法

遍历带有双向链表结构的结构体变量。它实际上是一个 for 循环,利用传入的 pos 作为循环变量,从表头 head 开始,逐项向后(next 方向)移动 pos,直至又回head(prefetch() 可以不考虑,用于预取以提高遍历速度 )。#define list_for_each_entry_rcu(pos, head, member) \ for (pos = list_entry_rcu((head)->next, typeof(*pos), member); \ prefetch(

2022-02-10 10:50:47 2351

原创 RCU锁机制

RCU(Read-Copy Update),是 Linux 中比较重要的一种同步机制。顾名思义就是“读,拷贝更新”,再直白点是“随意读,但更新数据的时候,需要先复制一份副本,在副本上完成修改,再一次性地替换旧数据”。这是 Linux 内核实现的一种针对“读多写少”的共享数据的同步机制。适用的场景:我们前面说过,每种锁都有自己的适用的场景:spin lock不区分reader和writer,对于那些读写强度不对称的是不适合的,RW spin lcok和seq lock解决了这个问题,不过seq lock倾

2022-02-09 20:16:01 2366

原创 epoll机制的理解

epoll可以理解为event poll,不同于忙轮询和无差别轮询,epoll之会把哪个流发生了怎样的I/O事件通知我们。此时我们对这些流的操作都是有意义的。(复杂度降低到了O(k),k为产生I/O事件的流的个数,也有认为O(1))epoll是通过后台中断的方式来获得就绪的状态,调用epoll_create创建实例,调用epoll_ctl添加或删除监控的文件描述符,调用epoll_wait阻塞住,直到有就绪的文件描述符,通过epoll_event参数返回就绪状态的文件描述符和事件epoll_create

2022-02-09 14:58:18 919

原创 mmap内存映射

常规文件操作为了提高读写效率和保护磁盘,使用了页缓存机制。这样造成读文件时需要先将文件页从磁盘拷贝到页缓存中,由于页缓存处在内核空间,不能被用户进程直接寻址,所以还需要将页缓存中数据页再次拷贝到内存对应的用户空间中。这样,通过了两次数据拷贝过程,才能完成进程对文件内容的获取任务。写操作也是一样,待写入的buffer在内核空间不能直接访问,必须要先拷贝至内核空间对应的主存,再写回磁盘中(延迟写回),也是需要两次数据拷贝。而使用mmap操作文件中,创建新的虚拟内存区域和建立文件磁盘地址和虚拟内存区域映射这.

2022-02-09 10:06:30 308

原创 gdb命令汇总

编译程序时需要加上-g,之后才能用gdb进行调试:gcc -g main.c -o maingdb中命令:回车键:重复上一命令(gdb)help:查看命令帮助,具体命令查询在gdb中输入help + 命令,简写h(gdb)run:重新开始运行文件(run-text:加载文本文件,run-bin:加载二进制文件),简写r(gdb)start:单步执行,运行程序,停在第一执行语句(gdb)list:查看原代码(list-n,从第n行开始查看代码。list+ 函数名:查看具体函数),简写l(gdb)

2022-02-08 17:09:10 660

原创 内核异常报错类型汇总

1、1.内存访问越界a) 由于使用错误的下标,导致数组访问越界b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp等字符串操作函数,将目标字符串读/写爆。应该使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函数防止读写越界。2 多线程程序使用了线程不安全的函数。3 多线程读写的

2022-02-08 17:03:12 7680

原创 list_head

在Linux内核中,提供了一个用来创建双向循环链表的结构 list_head。虽然linux内核是用C语言写的,但是list_head的引入,使得内核数据结构也可以拥有面向对象的特性,通过使用操作list_head 的通用接口很容易实现代码的重用,有点类似于C++的继承机制(希望有机会写篇文章研究一下C语言的面向对象机制)。下面就是kernel中的list_head结构定义:struct list_head {struct list_head *next, *prev;};参考链接:https:/

2022-02-08 11:02:16 969

原创 进程状态汇总

Linux中进程的七种状态(1)R运行状态(runing):并不意味着进程一定在运行中,也可以在运行队列里;(2)S睡眠状态(sleeping):进程在等待事件完成;(浅度睡眠,可以被唤醒)(3)D磁盘睡眠状态(Disk sleep):不可中断睡眠(深度睡眠,不可以被唤醒,通常在磁盘写入时发生)(4)T停止状态(stopped):可以通过发送SIGSTOP信号给进程来停止进程,可以发送SIGCONT信号让进程继续运行(5)X死亡状态(dead):该状态是返回状态,在任务列表中看不到;(6)Z僵尸

2022-02-08 10:59:50 54

原创 .a文件链接库的使用

.a文件链接库的使用举例库是程序代码的集合,是共享程序代码的一种方式。分类一:开源库和闭源库分类二:静态库和动态库的存在形式静态库: .a 和 .framework动态库: .dylib 和 .framework两者区别:静态库:链接时,静态库会被完整地复制到可执行文件中, 被多次使用就有多份冗余拷贝 (左图所示)动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存 。参考链接:https://blog.csdn.net/zjwen

2022-02-08 10:43:59 1296

原创 嵌入式开发专业术语概念汇总

SDK:概念:软件开发工具包(SDK,全称:Software Development Kit)SDK是Software Development Kit的缩写,中文意思是“软件开发工具包”。这是一个覆盖面相当广泛的名词,可以这么说:辅助开发某一类软件的相关文档、范例和工具的集合都可以叫做“SDK”。SDK是一系列文件的组合,它为软件的开发提供一个平台(它为软件开发使用各种API提供便利)API:概念:API(Application Programming Interface,应用程序编程接口)一般是

2022-02-08 10:37:09 2508

原创 mknod

我们的linux操作系统跟外部设备(如磁盘、光盘等)的通信都是通过设备文件进行的,应用程序可以打开、关闭、读写这些设备文件,从而对设备进行读写,这种操作就像读写普通的文件一样easy。linux为不同种类的设备文件提供了相同的接口,比如read(),write(),open(),close()。 所以在系统与设备通信之前,系统首先要建立一个设备文件,这个设备文件存放在/dev目录下。其实系统默认情况下就已经生成了很多设备文件,但有时候我们需要自己手动新建一些设备文件,这个时候就会用到像mkdir, m.

2022-02-08 10:13:56 158

原创 scnprintf和snprintf的区别

int snprintf(char *buf, size_t size, const char *fmt, ...)int scnprintf(char *buf, size_t size, const char *fmt, ...)scnprintf()和snprintf()都不会越界,而且都会在最后面加一个结束符’\0’,返回值的大小都不包含最后的结束符,都会截断,不同之处是:scnprintf()返回的是已经被写入到buf的字符数,而snprintf()返回的是格式化之后得到字符的长度(即将要

2022-02-08 09:38:36 2572

原创 断言assert()

assert 的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向 stderr 打印一条出错信息,然后通过调用 abort 来终止程序运行。1)在函数开始处检验传入参数的合法性2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题错误: assert(i++ < 100)4)assert和后面的语句

2022-02-08 09:24:56 257

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除