自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(49)
  • 资源 (1)
  • 收藏
  • 关注

原创 内核线程创建

**

2024-03-29 17:57:50 172

原创 phy link检测机制记录

phy link 检测

2023-08-29 16:07:36 457

原创 flexE记录

flexe 是OIF制定的技术标准,通过在IEEE802.3基础上引入FlexE Shim 层实现了MAC和PHY层的解耦,从而实现了灵活的速率匹配。灵活以太网基于Client和Group架构,可以支持任意多个不同的client 在任意一组PHY(FlexE Group)上映射和传输,从而实现捆绑、通道化、子速率功能。

2023-08-02 20:24:16 182

原创 mdio总线扫描phy设备和phy驱动注册

mdio总线扫描phy设备,和phy设备驱动注册流程

2023-06-29 10:38:44 695

转载 kvm与qemu关系记录

KVM(Kernel-based Virtual Machine)包含一个为处理器提供底层虚拟化、可加载的核心 模块kvm.ko(kvm-intel.ko或kvm-amd.ko),使用QEMU(QEMU-KVM)作为虚拟机上层 控制工具。

2023-06-14 10:52:38 128

原创 pcie简介

每个PCIE设备都有自己的独立的一段配置空间,该部分空间属于是这个设备的(可能是一段e2prom),设备在出厂时,配置空间是有默认初始值的。如上图所示,pci的配置空间是256字节,其中64字节是标准配置空间header,后面的192字节是Capability结构,展示pci能提供的能力。CPU发出一个物理地址,RC检查该地址,如果发现该内存空间地址是某个PCIe设备空间的映射,就会触发其产生TLP,去访问对应的PCIe设备,读取或者写入PCIe设备)一颗典型的PCI总线树如图。

2023-05-15 16:42:03 3813

原创 kgdb调试

echo g > /proc/sysrq-trigger" 这个指令是触发kgdb运行的,输入该指令后,内核就会停下,等待远端gdb连接。ttymxc0是所需使用的串口设备名,115200代表波特率,kgdbwait 是一个启动参数,也可以选择不添加该选项。所以需要给它传递一些参数。到这里已经可以调试内核和编入内核的驱动了,问题是我们更多的工作是调试动态加载的驱动,kgdb调试,在该方式下一共需要两台设备,其中一台为本地的被调试设备,gdb停下来了,剩下的工作就是一个普通的gdb了,你可以给内核下断点,

2023-05-06 16:14:39 383 2

原创 DPDK kni源码阅读笔记

应用层通过调用ioctrl系统调用接口, 来为网卡在内核里面创建一个虚拟的netdev设备, 主要是将用户态里面的记录报文的队列信息数据结构 传到 内核里面来,这样用户态和用户态就可以同时来操作这个队列,实现报文到内核传输的方式。DPDK 实现了驱动用户态化, 即用户层可以直接读写网卡的寄存器,网卡接收到报文以后,直接将报文写入用户态的申请的内存中。那为什么又要将用户态的报文发往内核呢?因为dpdk没有协议栈,而有的报文需要协议栈处理,所以kni就出来了,他解决了用户态的报文和内核交互的过程。

2023-03-30 17:14:45 157

原创 debugfs记录

【代码】debugfs记录。

2023-03-23 16:36:14 59

原创 异步处理方式

应用层通过poll,陷入内核,在poll里面poll_wait, 然后在中断里面wake_up_interruptible。应用层OPen这个uio设备,然后通过poll的方式陷入内核,进入uio的poll驱动,使线程挂起,3、通过创建uio设备的方式,创建uio设备,uio设备还可以方便mmap设备资源。2、通过open普通文件(提供poll函数), 在内核创建等待队列的方式。然后在设备的中断处理函数里面去uio_event_notify.1、通过open普通文件,在内核里面使用信号量的方式。

2023-03-20 20:10:48 115

原创 mempool地使用

【代码】mempool地使用。

2023-03-17 17:03:12 270

原创 kernel内存分配图

内存分配图

2023-02-24 11:17:48 95

原创 gdb笔记

GDB调试方法有3种:直接调试:gdb [exec file],用于直接仿真一个执行程序附属调试:gdb attach pid,用于直接调试一个已运行的程序(ubuntu注意权限问题)核心转存调试:gdb [exec file] [core-dump file],用于调试core-dump文件

2022-11-17 20:11:28 598

转载 uboot驱动框架

全文耗时一周,精心汇总20000余字,希望对大家有所帮助,感觉可以的点赞,关注,不迷路,后续还有更多干货!看文章前,答应我,静下心来,慢慢品!

2022-11-09 19:53:55 615

原创 GDB调试命令

GDB常见命令

2022-10-28 15:53:14 377

原创 linux下core dump【总结】

core dump

2022-10-26 19:47:41 180

原创 【Cache】

在处理器速度不断增加的形势下,处理器处理数据的能力也得到了大大的提升,但是数据是储存在内存中的,虽然随着DDR2\DDR3\DDR4的技术不断推出,内存的吞吐率得到了大大提升,但是对于处理器来讲,仍然很慢。一般来讲,处理器要从内存中直接读取数据要花大概几百个时钟周期,在这几百个时钟周期内,处理器除了等待,什么也不能做。在这种情况下,才提出了cache的概念,其目的是为了匹配处理器和内存之间存在的巨大的速度鸿沟。一般来讲,Cache由三级组成,一级(L1)最快,但是容量最小,三级(LLC,last level

2022-06-27 16:28:16 1778

原创 【Linux 伙伴系统】

伙伴系统(buddy system) 是操作系统中最常用的一种动态内存存储管理方法,在用户提出申请时,分配一块大小合适的内存块给用户,反之在用户释放内存块时回收。在伙伴系统中,内存块是2的order次幂,Linux内核中order的最大值用MAX_ORDER 来表示,通常是11,也就是把所有的空闲页面分组成11个内存块链表,每个内存块链表分别包括1、2、4、8、16、32、…、1024个连续的页面。1024个页面对应着4MB大小的连续物理内存。物理内存在linux内核中分出几个zone来管理,总额根据内核的

2022-06-22 15:22:47 475

转载 linux HZ

Linux核心几个重要跟时间有关的名词或变数,底下将介绍HZ、tick与jiffies。Linux核心每隔固定周期会发出timer interrupt (IRQ 0),HZ是用来定义每一秒有几次timer interrupts。举例来说,HZ为1000,代表每秒有1000次timer interrupts。 HZ可在编译核心时设定,其中HZ可设定100、250、300或1000。以小弟的核心版本预设值为250。具体可以使用 make menuconfig ->Kernel Features ->Timer

2022-06-21 16:57:52 637

原创 【操作命令记录】

1、显示匹配进程ps -aux | grep XXX2、显示匹配进程XXX下面的AA线程pstree -p PID(XXX) | grep AA3、显示内核打印信息dmesg4、看一个进程与核的亲和性cat /proc/PID/status/* cpus_allowed:表示可以被几个核调度 // cpus_allowed_list表示可调度的cpu掩码 */...

2022-06-21 11:08:07 50

原创 内存管理-理论

内存管理理论

2022-06-04 20:41:43 73

原创 【Linux 中断管理机制】

2022-06-03 15:44:46 944

原创 NAPI 流程

napi 流程记录1、初始化一个napi_struct。此时 NAPI的状态为 NAPI_STATE_SCHED状态。。void netif_napi_add(struct net_device *dev, struct napi_struct *napi, int (*poll)(struct napi_struct *, int), int weight){ INIT_LIST_HEAD(&napi->poll_list); hrtimer_init(&nap

2022-05-25 15:44:55 489

原创 【POLL 机制简单例子】

POLL 实现简单举例内核下面需要做的事情实现一个字符设备内核下面需要做的事情实现一个字符设备首先需要实现file_operations 。static const struct file_operations xxx_fops = { .owner = THIS_MODULE, .open = xxx_open, .release = xxx_release, .read = xxx_read, .write = xxx_write, .mmap = xxx_mmap, .

2022-05-25 10:28:40 156

原创 linux poll机制窥探

linux poll机制窥探内核框架sys_poll 源码驱动程序UIO框架里面的poll实现内核框架对于系统调用poll或select,它们对应的内核函数都是sys_poll,文件位于fs/select.csys_poll 源码SYSCALL_DEFINE3(poll, struct pollfd __user *, ufds, unsigned int, nfds, int, timeout_msecs){ struct timespec64 end_time, *to = NULL;

2022-05-24 15:43:37 195

原创 dpdk大页内存

dpdk大页内存大页内存使用设置大页个数//设置256个大页,每个大页2M,则将256写入下面这个文件中 echo 256 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages挂载大页设置完大页后,为了让大页生效,需要挂载大页文件系统。例如将hugetlbfs挂载到/mnt/huge。刚挂载完时/mnt/huge目录是空的,里面没有一个文件,直到有进程使用共享内存方式使用了这个大页系统为止,才会在这个目录下创建大页文件。

2022-05-08 19:56:59 846

转载 DPDK之PMD原理

转载

2022-05-08 18:36:37 117

转载 DPDK之PMD原理

转载文章:转载

2022-05-08 17:57:53 87

原创 DPDK中断管理

DPDK中断机制浅析DPDK中断管理igb_uio的创建linux中uio设备的创建内核事件通知DPDK的中断任务线程创建 epoll网卡注册的中断回调DPDK中断管理DPDK中的网卡都是PCI设备,多数中断都属于PCI_MSIX类型的中断。igb_uio的创建下面是igb_uio创建过程部分代码。static intigbuio_pci_probe(struct pci_dev *dev, const struct pci_device_id *id){ /* 省略代码 */

2022-05-08 17:01:51 824

原创 【 boot下面的配置开关】

boot下的配置项boot下面的配置开关问题由来boot下面的配置开关在boot下面有多个文件配置开关,以FT2000C举例。bootloader/configs/FT2004C_defconfig 默认配置文件和 bootloader/include/autoconf.mk这两个文件分别在 bootloader/ft20040-pld.sh 和 bootloader/Makefile中被用到。bootloader/ft20040-pld.sh:make /FT2004C_defconfig

2022-04-19 16:10:56 214

原创 【MMP多个地址】

MMP多个地址空间到用户态在另外一个文章中,我们实现了将内核空间申请的一片内存映射到用户空间,今天我们将内核空间申请的多个地址空间映射到用户态里面,原理都是一样的。1、ko文件内容:#include <linux/module.h>#include <linux/init.h>#include <linux/fs.h>#include <linux/cdev.h>#include <asm/uaccess.h>#include &l

2021-12-24 17:08:33 448

原创 【设备节点创建】

创建设备节点1、静态创建设备文件节点2、动态创建设备文件节点本文章详细讲解如何在dev/下面创建设备节点,有通过mknod 静态创建方式和使用Linux为我们提供的接口动态创建两种方式。1、静态创建设备文件节点我们可以在启动脚本里面提前创建好一个设备节点。/* 设备节点名称为create_node , 设备的主设备号为 1300, 从设备号为 0, 设备为字符设备 */mknode /dev/create_node c 1300 0然后我们编写设备的驱动文件。#include &lt

2021-12-22 15:47:00 1842

原创 【uio设备实例】

在有的场景中,我们需要将硬件资源(物理地址、地址长度)等信息告诉应用程序,然后将这一片地址mmap到用户空间,这样以后,我们在用户空间就可以直接读写(如*paddr = 1)这个区域了。UIO设备给我们提供了一种简单的方式,因为UIO自己实现了struct file_operations 里面的所有接口包括mmap。这样方便我们做内存映射。实验:创建uio设备,并在/dev下面创建相应的文件,然后在用户层去映射UIO记录的那片内存,并进行读写操作。1、ko文件如下:#include <linux

2021-12-21 17:43:38 463

原创 linux任务优先级

linux 任务优先级简单记录优先级优先级进程PCB描述符struct task_struct 数据结构中有3个成员描述进程的优先级。 struct task_struct {....int prio;int static_prio;int normal_prio;unsigned int rt_priority;...};static_prio是静态优先级,在进程启动时分配。内核不储存nace值,取而代之的是static_prio。内核中有宏 NICE_TO_PRIO()实现由NI

2021-12-20 16:49:32 535

转载 【linux 调度策略】

linux 任务优先级linux调度linux调度在Linux中,线程是由进程来实现,线程就是轻量级进程( lightweight process ),因此在Linux中,线程的调度是按照进程的调度方式来进行调度的,也就是说线程是调度单元。Linux这样实现的线程的好处的之一是:线程调度直接使用进程调度就可以了,没必要再搞一个进程内的线程调度器。在Linux中,调度器是基于线程的调度策略(scheduling policy)和静态调度优先级(static scheduling priority)来决定那

2021-12-17 17:35:15 234

原创 mmap实验例子

mmap内存映射实现实验内容:在内核下面申请4K大小的内存(kmalloc申请的物理连续内存),在应用程序中通过mmap把内核态下申请的内存块映射到用户空间,然后在应用程序中通过read,write操作读写内核空间数据,最后读取用户态映射的地址空间,看内容是否和内核数据空间一致。我的编译工具:/opt/gcc-linaro-6.2.1-2016.11-x86_64_aarch64-linux-gun/bin/arrch64-linux-gun-gcc内核实现:#include <linux/

2021-11-09 17:14:22 1303

原创 napi机制

napi简要记录netif_napi_add软中断NIC硬件中断napi_threaded_poll任务函数软中断处理函数netif_napi_add创建了一个内核任务,调用napi_kthread_create函数创建了一个napi任务,任务函数为:napi_threaded_poll软中断在 net/core/dev.c 文件中,有一个函数 net_dev_init(),里面为每一个CPU初始化了skb的队列,还是我们的软中断: NET_TX_SOFTIRQ和NET_RX_SOFTIRQ,对

2021-09-02 17:34:56 637

转载 kmalloc/kfree,vmalloc/vfree函数用法和区别

转载

2021-08-17 20:17:23 119

转载 DMA和cache一致性问题

转载

2021-08-17 20:15:22 50

转载 于linux内存管理中DMA ZONE和dma_alloc_coherent若干误解的澄清

转载

2021-08-17 20:13:48 119

有关RDMA相关内容有关RDMA相关内容

有关RDMA相关内容

2023-05-15

网卡相关和gdb调试网卡相关和gdb调试

网卡相关和gdb调试

2023-05-15

用户态与内核态的交互实现

用户态与内核态的交互实现

2023-05-08

igb-uio源码,igb-uio源码,igb-uio源码

igb_uio源码

2023-03-23

mmap实验源文件源文件实现

mmap实验源文件

2021-11-09

空空如也

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

TA关注的人

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