
Linux
文章平均质量分 76
papaofdoudou
我的藏经阁,用数学解释问题,用编程解决问题
展开
-
BSP和Driver的区别
BSP( Board Support Package)是板级支持包,是介于主板硬件和操作系统之间的一层,应该说是属于操作系统的一部分,主要目的是为了支持操作系统,使之能够更好的运行于硬件主板。在OS上的driver一般都是可动态加载的,当然嵌入OS里头直接编进去也就行了,对于一个最小的可运行OS核心来说,BSP是必不可少的,但driver不是。2)Driver,也就是我们常说的驱动,它和你的子设备是密切相关的,相同设备在相同软件平台下驱动基本是可以通用的,和板子的关系不是很大的。原创 2020-11-02 11:57:16 · 8990 阅读 · 0 评论 -
RXE RDMA测试学习环境搭建
RXE的RDMA实现很早就开源在内核主线,想要深入理解RDMA工作原理结合测试用例分析内核代码实现。原创 2024-09-29 23:27:34 · 697 阅读 · 0 评论 -
Corundum FPGA 网卡项目驱动分析
corundum是一款基于FPGA的100G以太网卡解决方案,corundum方案中的所有源码,包括verilog,linux网络驱动程序都是开源的。原创 2024-09-25 08:47:29 · 729 阅读 · 0 评论 -
基于MDEV的PCI设备虚拟化DEMO实现
mdev受控直通体现了架构设计中的控制平面和数据平面分离的思想,平面可以理解为动作发生的地方,也就是让控制信号和数据流动发生在不同的地方,通过mdev设备虚拟化,让访问配置空间,MMIO寄存器这种低带宽配置面操作走trap-and-emulation路径,这是控制路径,而让设备存储访问(比如网络内存,GPU数据存储)以IOMMU DMA MAP的方式直通进行,控制和数据两个方向正交,彼此可以独立变化互不影响,同时兼顾了划分灵活性和访问性能。原创 2024-06-29 19:06:48 · 559 阅读 · 0 评论 -
llama3-70B几个问题答疑
问题几个关于宇宙的问题,答案挺有意思的,很有启发性,记录一下:问题1:既然相对论认为时间是相对的,为何却说宇宙寿命有137亿年?问题2:对于黑洞来说,大爆炸是不是刚刚发生不久的事情?问题3:对于光来说,大爆炸是刚刚发生的事情么?普通PC的USB控制器都是通过PCIE扩展的么?为什么服务器系统广泛通过PCIe接口扩展功能,而非使用内部总线?原创 2024-06-16 10:09:21 · 531 阅读 · 0 评论 -
linux系统几种固定的睡眠(休眠,调度,同步)模式
既然有休眠流程有固定的模式,就可以通过宏定义将这些模式定义出来,通过一个宏接口调用去实现,内和中已经将这些固定的休眠模式定义为wait_event_xxx宏家族,调用这些宏,可以一步到位,实现上述的宏逻辑:注意到condition条件检查被放在了设置任务state状态和进行实际休眠CMD中间,这是一种通用模式,和BARRIER的使用有关,在自己书写休眠过程时必须遵守。原创 2022-10-08 22:38:47 · 722 阅读 · 0 评论 -
LINUX系统CFS调度模型实现思考和仿真
采用绝对优先级没有记忆性,过去的运行记录不会影响当前时刻的调度决策,所以高优先级的线程有绝对优先权。而CFS调度器是有记忆性的,过去的运行记录会体现在线程整体的运行进度中,从而影响当前的调度决策。原创 2024-04-05 00:26:38 · 1173 阅读 · 0 评论 -
LINUX系统如何从多核CPU中隔离核心处理专用用户任务?
需要说明的是,上述隔离cpu的方法仅仅对用户空间的进程有效,对内核的进程无效,所以即便用户态不创建绑定隔离CPU的dedicate 进程,被隔离的cpu也并不是完全空闲的,它可能会执行内核态的一些人物,当前CPU节点上的文件交换操作。原创 2024-03-14 08:28:14 · 1033 阅读 · 0 评论 -
Linux用户态进程可以在持有内核锁的情况下返回用户态么?
检测写一个测试模块,在内核中定义一把互斥锁并获取,然后返回到用户态,观察内核是否报告异常,代码逻辑如下:测试发现,内核并没有报任何的WARNING,似乎说明用户态线程是可以在持有内核锁的情况下返回用户态的,先别急着下结论,我们打开内核的LOCKDEP功能重新编译内核在跑一下看看。原创 2024-03-12 21:59:11 · 125 阅读 · 0 评论 -
mprotect/mlock使用demo
mlock起作用的过程分为两步,第一步,对于已经存在的VMA,将会调用mm_populate将其手动建立物理页面的映射。而对于未来分配的物理页面,则将会调用apply_mlockall_flags设置VM_LOCKED标志,设置此标志后,将来的MMAP函数将会调用__mm_populate分配页面。这样,在加入LRU的逻辑中,判断PageMlocked为真,将会把页面加入LRU_UNEVICTABLE list.所以,最终MLOCKD的效果显示在/proc/meminfo的unenvicible字段。原创 2021-10-14 12:37:29 · 272 阅读 · 0 评论 -
理解PCIE设备透传
1.透传场景下,设备内存映射给VCPU,不会通过DMAR映射给设备自身,设备内存本身就在设备上,设备可以直接访问(通过设备内部的IOMMU),不需要映射给DMAR。资源内存映射给DMAR的情况一般是三方外设通过自身IOMMU DOMAIN(自身设备绑定)访问其他设备上的存储资源。2.透传的设备访问主存仅仅需要一次映射,由DMAR完成IOVA到HPA的翻译。原创 2024-01-19 23:33:40 · 1208 阅读 · 0 评论 -
KVM虚拟机迁移原理与实践
热迁移环境需要满足的几个必要条件:1.热迁移之前,虚拟机安装文件必须要在源主机和目标主机都可以访问的位置上,并且具有相同的访问路径。实现方式可以是通过独立的NFS共享服务,或者是离线拷贝虚拟机镜像文件到目标主机相同的路径下。2.源主机和目标主机必须可以互相访问(SSH,TCP等协议)。3.迁移过程中经常会出现迁移进度条回滚的现象,这可能就是由迁移算法和逻辑决定的,回滚的目的是迁移上把进度条迁移过程中产生的脏页。原创 2023-11-11 23:48:31 · 1825 阅读 · 0 评论 -
CCM&Cache的异同
CCM是Closely coupled memories的缩写,中文名称是紧耦合存储器,哈佛架构下,一般有两种CCM,分别是ICCM和DCCM, ICCM主要用来存储指令和数据,DCCM仅用来存储数据。一般中低端MCU没有提供多级Cache,兼之指令和数据规模较小,会配备CCM存储器,多用于高可靠,高世实时场合。而高性能AP级处理器一般提供了多级CACHE减少存储访问的Latency,不采用CCM的方式。原创 2023-12-24 19:55:34 · 2341 阅读 · 0 评论 -
计算机体系结构的一些总结
广义上来说,按照不同层次的授权等级,可把芯片IP分类为指令集、IP核、芯片架构等。如果说指令集是一本“字典”,那么IP核提供了“段落”的写作方式,芯片架构则可被视作是“整篇文章的提纲”。芯片IP企业作为芯片设计企业的上游供应商,通常以授权的方式,向后者收取专利费用。而芯片设计企业通过购买不同层级的IP授权,可以设计出不同自研程度的芯片产品。原创 2021-02-05 14:02:53 · 1377 阅读 · 0 评论 -
关于操作系统设计的基本原理和设计原则
操作系统设计的精妙之处就在于,在底层硬件之上创造了新的抽象, 对于系统初始化来说, 它呈现了执行流到线程转化这一概念,该概念远远比它的实现细节更加重要,处理器以“取指-执行”为周期开始串行执行指令,而初始化代码将自身转化为一个并发处理系统, 这里的关键之处在于,初始化代码并不是创建一个独立的并发系统,然后跳转到新的系统。原创 2020-03-09 16:17:33 · 7376 阅读 · 1 评论 -
文件共享传输的几种方式
Linux系统下可以通过open/create/socket/socketpair/pipe等系统调用创建文件描述符fds.之后可以基于创建的文件描述符进行IO操作,操作完毕之后执行close(fd)关闭文件描述符。原创 2023-12-05 14:57:32 · 1060 阅读 · 0 评论 -
Linux内核对象引用计数和生命周期管理
int value;int pad;if(!data)2.如果对对象的引用不是临时的(pointer is not temporary),特别是对象会以指针引用的形式传递到异步上下文(另一个被处理器调度的独立线程),必须在传递这个指针引用之前,增加对对象的引用计数。调用kref_get增加引用计数前,如果上下文已经持有了一个引用计数,则kref_get过程不需要锁保护。原创 2023-11-20 22:29:59 · 835 阅读 · 0 评论 -
X86 SMAP(Supervisor Mode Access Prevention)机制引入的内核态访问用户态地址空间的问题分析
所以,内核直接访问用户态指针导致报告page fault错误的原因是直接访问用户态内存触发了SMAP保护,内核提供了配置和API接口关闭这种保护,而本文开头提到的几个宏定义能够安全将访问用户态内存的原因,也是由于在访问器件,关闭了SMAP保护。从普遍意义的角度来讲,内核态访问用户态地址空间是没有任何问题的,只是需要注意不同的架构下实现上会有微小差别,至少目前,没有看到其它架构有类似SMAP机制的实现。原创 2023-10-28 20:15:21 · 864 阅读 · 0 评论 -
OpenGL Mesa库在ubuntu22.04上的编译
安装后,不需要重新启动系统,glxinfo|grep OpenGL将会发现系统的MESA驱动已经被更换。重启后使用的仍然是新编译的MESA驱动。原创 2023-09-19 23:04:47 · 808 阅读 · 0 评论 -
非对称加密系统和LINUX实践
更具体地说,如果一个非对称加密算法被正确设计并且密钥的长度足够长,那么在有限的时间内,从公钥计算出相应的私钥几乎是不可能的,除非有量子计算机等未来的技术出现,可以破解这些数学问题。这意味着在加密和解密之间使用相同的密钥,这个密钥必须保密共享,只有密钥的持有者才能解密数据。总之,非对称加密提供了一种强大的安全机制,可以实现数据的保密性、完整性和身份验证,而不需要在通信方之间共享相同的密钥。这用于确保数据的完整性和真实性。因此,非对称加密系统的安全性依赖于多个因素,包括算法的安全性、密钥的管理和物理安全性等。原创 2023-09-10 20:30:55 · 472 阅读 · 1 评论 -
Linux监测进程打开文件
分析问题过程中,追踪进程打开的文件可以在许多不同情况下有用,体现在以下几个方面:故障排除和调试: 当程序出现问题、崩溃或异常行为时,追踪进程打开的文件可以帮助找出问题的根本原因。这有助于快速定位错误,尤其是在访问文件时发生的错误。性能分析和优化: 了解进程打开了哪些文件可以帮助分析程序的性能问题。如果程序频繁打开和关闭文件,可能会导致性能下降。通过追踪文件操作,可以识别性能瓶颈,从而采取相应的优化措施。权限和安全审计: 在安全方面,追踪进程打开的文件可以帮助监控和审计系统上的文件访问。原创 2023-08-31 22:55:27 · 704 阅读 · 0 评论 -
LINUX页表切换(调度)在不同架构上的实现
Linux页目录存放在 struct mm_struct字段中,通过current->mm->pgd访问。下面分析不同架构下堆栈切换逻辑。原创 2023-08-29 07:45:57 · 230 阅读 · 0 评论 -
搭建Synopsys 数字IC IDE开发化境
6)这先点击 自定义硬件,内存我修改为4GB,处理器数量为2,核心为2。然后记得添加centos镜像,设置好点击关闭,回到上个页面,点击完成。5)磁盘空间我设置为50G,空间没有具体的要求,最好多留一些,方便后面安装更多的软件;4)我这里虚拟机取名为zlcao-eda,将安装路径修改到D盘,这里空间大,下一步;之后使用VMTOOLS完善系统,点击安装TOOLS,前面图中有显示,桌面刷出虚拟盘;8)我这里选择中文,默认选择英文也可以,看个人吧,然后点击继续;1)点击 创建新的虚拟机,默认勾选典型,下一步;原创 2023-08-12 23:56:48 · 565 阅读 · 0 评论 -
基于原子操作的无睡眠锁实现
原子操作是全芯片系统级工程,原子操作的路径可能需要经过多个IP环节,每个环节都需要支持原子操作的硬件基础设施,缺失任何一个环节将无法做到原子操作。比如,GPU设备如果需要原子访问HOST Memory,中间会经过GPU本身的L2->AXI总线->NOC->PCIe->Host Memory等环节,中间每个环节都需要支持原子操作,如果某个环节不支持,比如PCIE不支持发送原子访问包,则无法用HOST 内存实现原子操作。原创 2022-10-03 11:50:23 · 458 阅读 · 0 评论 -
dma-fence简析以及使用demo
dma fence是Linux中用于不同内核模块DMA同步操作的原语,常用于GPU Rending,display buffer等之间的同步,使用DMA FENCE可以减少在用户态的等待,让数据的同步在内核中进行,它是内核中一种比较常用的同步机制,本身的实现和使用并不复杂,其只有两种状态signaled和unsignaled。可能正是因为其本身的精简,在融入其他概念中时,在不同的环境下,赋予了dma-fence不同的含义。所以通常需要根据dma-fence的具体使用的情况来理解其含义。原创 2023-06-13 22:39:19 · 2584 阅读 · 2 评论 -
Verilator仿真环境搭建
Verilator是一种开源的Verilog/SystemVerilog仿真器,可用于编译代码以及代码在线检查,Verilator能够读取Verilog或者SystemVerilog文件,并进行lint checks(基于lint工具的语法检测),并最终将其转换成C++的源文件.cpp和.h。原创 2023-08-06 23:18:58 · 1020 阅读 · 0 评论 -
关于处理器静态&动态内存屏障的原理和应用
barrier();r1 = y;barrier();r2 = x;编译为汇编指令.textrun1:.LFB0:ret.LFE0:run2:.LFB1:ret.LFE1:同样是movl指令,却代表这读和写两个意思,这一点和RISC处理器定义不太一样,无论是ARM,MIPS还是RISCV,读和写分别是两条不同的指令,ARM是ldr/str,MIPS是ld/sw,RISCV则和MIPS是同样的定义。原创 2022-11-01 23:18:10 · 544 阅读 · 2 评论 -
dhrystone和coremark测试比较
关于dhrystone测试,请参考博客比较coremark环境搭建。原创 2022-10-01 20:58:57 · 2184 阅读 · 1 评论 -
一种细粒度资源锁的内核模块实现
本实现参考内核模块中的lock_page/unlock_page以及wait_bit实现,以LOCK PAGE为例,struct page数据结构中的成员flags定义了一个标志位PG_locked,内核通常利用PG_locked来设置一个页锁,lock_page函数用于申请页锁,如果页锁被其他进程占用了,那么进程会睡眠等待。原创 2023-07-02 18:57:55 · 338 阅读 · 0 评论 -
关于内存颗粒的地址映射
通常情况下,在一种硬件体系结构下,一个存储单元只有一个物理地址,但是如果系统设计时兼容了多套寻址方式,则可能存在同一个存储单元存在多个物理地址的情况,将地址类型编码到地址中,硬件会根据编码后的物理地址驱动合适的地址翻译电路寻址到正确的存储单元。原创 2023-06-29 20:43:24 · 1181 阅读 · 0 评论 -
Linux tracing之内核vsyscall&vdso机制分析
由于内核运行在受保护的地质空间上,Linux系统中的用户空间程序无法直接执行内核代码,不能直接调用内核空间中的函数,因此,应用程序以某种方式通知系统,告诉内核自己需要执行一function,希望系统系统切换到内核态,这样内核就可以代表应用程序在内核空间执行系统调用。这个道理就像机场的安检通道,旅客只能通过有限的几个通道进入,并且还要经过严格的安全检查。原创 2023-06-27 09:51:07 · 1151 阅读 · 0 评论 -
Linux tracing之基于uprobe/kprobe的调试调优浅析
经过长期的发展,机制在事件(events)的基础上分别为内核态和用户态提供了追踪调试的功能, 这也构成了 tracepoint 机制的基础, 后期的很多工具, 比如ftrace等都是在其基础上演化而来. 参考由提供的资料来看,在 Linux 动态追踪层面起到了基石的作用, 如下所示:uprobe与krobe对应,动态附加到用户态调用函数的切入点称为uprobe,相比如kprobe 内核函数的稳定性,uprobe 的函数由开发者定义。原创 2023-06-23 22:44:32 · 1949 阅读 · 1 评论 -
Linux Buddy算法&系统分析
例如,LINUX内核设置的MAX_ORDER为11,最大有效取值为10.所以 pfn的低10位为0,也就是PFN必须按1<<10=1024对齐,LINUX页大小为4K,也就是说,硬件设计的时候,只要保证物理地址被映射到4M对齐的地址即可满足BUDDY算法管理的要求。找到一个Buddy头,然后被查询的PAGE在这个buddy 头cover的orer个PAGE中,则这个PAGE是FREE的,如果找不到这样的buddy头,则是已经分配出去,没有在buddy中的PAGE。原创 2023-05-16 07:37:33 · 503 阅读 · 0 评论 -
64/32位Linux系统的差异(地址空间布局,系统调用)对比分析
映射地址:可以看到,对应的地址0x7fd9b8c00000是PSE页,映射了10M,是PMD级的大页映射,也就是2M页面的映射。连续影射了5个PMD大页。这些大页的分配是在mmap后,执行memset(addr, 0x5a, ...)时通过page fault流程进行分配的,对应执行hugetlb_fault的执行流程。原创 2023-05-09 22:41:27 · 2303 阅读 · 0 评论 -
linux iommu group&domain概念分析整理
在Linux系统中,IOMMU是指Input/Output Memory Management Unit是一种硬件设备,用于管理输入输出设备的内存映射以及访问权限。IOMMU可以提高系统的安全性和性能,通过对DMA请求进行隔离和管理,防止恶意设备访问系统内存并提高内存使用效率。在IOMMU的实现中,一个IOMMU设备通常会管理多个I/O设备,而这些IO设备可能需要共享同一块物理内存。为了有效管理这些IO设备,Linux内核使用IOMMU Group进行设备的分组和隔离。原创 2023-04-28 20:27:39 · 4458 阅读 · 0 评论 -
关于Linux ION和Melis3.0系统中物理地址分配的异同分析
问题描述:VPU做缩略图编码的应用中,同样一份jpeg编码库,在Linux中编码出来的缩略图没有问题,但是用Melis系统编码出来的缩略图,顶部有黑线和横杠。Melis编码效果如下图所示:Linux Tina编码出的图像却是这个样子的:Linux可能是白平衡没有做好,色调偏红,这里忽略色调问题,单纯看这个黑线和横杠的问题。解决方案:通过分析,在melis系统上关闭dcache(关闭arm dcache的方法有两种,一种是直接关闭系统控制寄存器SCTLR.M位,另一种是通过页表关闭,原创 2021-05-12 21:22:22 · 650 阅读 · 0 评论 -
深入浅出理解桥接模式
桥接模式即将抽象部分与它的实现部分分离开来,使他们都可以独立变化。桥接模式将继承关系转化成关联关系,它降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量。将抽象部分与他的实现部分分离这句话不是很好理解,其实这并不是将抽象类与他的派生类分离,而是抽象类和它的派生类用来实现自己的对象。这样还是不能理解的话。我们就先来认清什么是抽象化,什么是实现化,什么是脱耦。其概念是将复杂物体的一个或几个特性抽出去而只注意其他特性的行动或过程。在面向对象就是将对象共同的性质抽取出去而形成类的过程。转载 2020-12-22 10:20:31 · 529 阅读 · 0 评论 -
zlramfs模块实现
参考ramfs实现一个Linux ramfs内核模块,作为Linux文件系统分析的一个脚手架。编译:加载:/proc/filesystems查看文件系统注册信息:zlramfs的后端设备为NONE,说明这个文件系统不需要后端磁盘作为介质。原创 2023-04-02 20:12:23 · 233 阅读 · 0 评论 -
利用procrank进行内存使用统计分析
2. 编译,执行make3: 使用, sudo ./procrank4.procrank确定内核分配的地址空间,修改内核测试模块,增加分配4M内存的操作。运行测试用例,然后在运行procrank.之后,加载模块,修改用例,增加对设备节点的打开访问, 重新运行用户太用例:确实打印了出来:可以看到,调用了open后,内核4M内存成功分配了出来,此时运行procrank的结果是:并没有明显变化。原创 2021-07-29 17:10:13 · 2243 阅读 · 0 评论 -
Homebrew NFS Network File Sharing Environment
nfs server 优麒麟 OS作为NFS服务器:nfs client, ubuntu 22.04 作为NFS 客户端:网络拓扑结构,网关1安装在客厅,为了加强卧室信号,用一台小米路由器作为信号中继,拓扑结构如下:NFS Server路由信息,可见前两跳分别是两个网关。原创 2023-03-18 02:22:52 · 370 阅读 · 0 评论