自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(97)
  • 资源 (3)
  • 收藏
  • 关注

转载 linux驱动之并发与竞态

在应用程序下经常会遇到的问题,提供了多种机制来解决这一问题。在中也同样有类似问题,即。并发访问会导致。一个好的驱动程序可以良好地解决这一问题,本文将整理并记录当前内核中的多种。

2023-04-26 15:28:32 493

原创 PCIe Legacy Interrupts & MSI/MSIX 区别

在PCIe总线中,MSI和MSI-X中断机制使用存储器写请求TLP向处理器提交中断请求,下文为简便起见将传递MSI/MSI-X中断消息的存储器写报文简称为MSI/MSI-X报文。当PCIe桥收到PCI设备的INTx信号后,并不能将其直接转换为MSI/MSI-X中断报文,因为PCI设备使用INTx信号进行中断请求的机制与电平触发方式类似,而MSI/MSI-X中断机制与边沿触发方式类似。而在PCIe总线中,PCIe设备必须支持MSI或者MSI-X中断请求机制,而可以不支持INTx中断消息。

2023-04-13 14:46:52 896

原创 PIP 安装包之后运行无法识别

PIP 安装包之后运行无法识别

2022-07-03 08:12:22 813

转载 OPENWRT自动编译加载KO

OpenWrt能实现自动加载ko操作

2022-05-17 10:27:03 1161

转载 Linux 保留内存memreserve & reserved-memory

1. 概述在linux启动过程中会打印出如下信息,这些信息为我们呈现出系统下的保留内存空间情况。Reserved memory: created DMA memory pool at 0x4c000000, size 8 MiBOF: reserved mem: initialized node vram@4c000000, compatible id shared-dma-pool本文只介绍基本的保留内存,不涉及CMA部分内容保留内存的初始化流程如下图所示:本文所说的保留内存

2022-03-15 14:06:29 7077

转载 /proc/iomem 的信息如何获得

我们以高通IPQ4019芯片为例进行一下示例说明step1 在/proc/iomem中看一下iomem_resource的情况[root@Abloomy:~]# cat /proc/iomem060f8800-060f88ff : qscratch_base078af000-078af1ff : msm_serial_hsl //step1 78af000 是SOC上串口的物理地址。见下面的device信息078b5000-078b55ff : spi_qsd....8800..

2022-03-03 17:45:37 454

转载 elf load view & execution view

From :https://www.keil.com/support/man/docs/armlink/armlink_pge1362065902090.htmLoad view and execution view of an imageImage regions are placed in the system memory map at load time. The location of the regions in memory might change during execution.

2021-05-10 11:30:26 246

转载 Device Driver Design Patterns ——State Container & container_of()

=============================DeviceDriverDesignPatterns=============================Thisdocumentdescribesafewcommondesignpatternsfoundindevicedrivers.Itislikelythatsubsystemmaintainerswillaskdriverdeveloperstoconformto...

2021-04-15 11:20:01 109

转载 Platform Device Drivers

Platform Device DriversWe all know about Plug and Play devices. They are handled by the kernel as soon as they are plugged in. These may be USB or PCI Express, or any other auto-discovered devices. But, other device types also exist, which are not hot-pl

2021-04-13 23:29:56 505

转载 driver makefile kernel 版本号

在编写与Linux Kernel相关的代码时,移植是个大问题。一般来说,Linux的主版本号不一致,那就可以基本想着重写代码了。而次版本号的不一致,也会为代码的移植带来不小的麻烦。例如最近项目中用到的Netlink和Netfilter框架,在主版本号为3,次版本号不一致的情况下,编程接口会存在一些变动。如果想让同一份代码可以在不同的版本上编译运行,一般来说就需要在定义编译选项,然后根据编译选项,编译代码。在Makefile中加入如下版本判断。如果kernel比3.6要新,那就定义了宏..

2021-04-13 21:34:42 347

原创 linux driver kthread example

1. 创建kthread/***kthread_run-createandwakeathread.*@threadfn:thefunctiontorununtilsignal_pending(current).*@data:dataptrfor@threadfn.*@namefmt:printf-stylenameforthethread.**Description:Convenientwrapperfor...

2021-04-08 23:18:50 263

转载 linux driver completion

Documentation/scheduler/completion.txt================================================Completions-"waitforcompletion"barrierAPIs================================================Introduction:-------------Ifyouhaveoneormorethreadsthat...

2021-04-08 22:13:12 113

转载 Workqueues

WorkqueuesWorkqueues are used to schedule actions to run in process context. The base unit with which they work is called work. There are two types of work:structwork_struct- it schedules a task to run at a later time structdelayed_work- it schedu...

2021-04-02 14:57:57 92

转载 linux struct resource

I/O ports and I/O memory are two conceptual ways of supporting communication between device drivers and devices.So that the various drivers do not interfere with each other, it is essential to reserve ports and I/O memory ranges prior to use by a driver.

2021-03-30 10:59:56 321

转载 list_for_each_entry

offsetof宏定义:#define offsetof(TYPE, MEMBER) ((size_t)&((TYPE *)0)->MEMBER)该宏先将0转换成TYPE型指针,即形成一个指向地址0的TYPE指针,然后对TYPE中的MEMBER成员进行取址,而整个TYPE结构体的起始地址是0,那么这里取得的MEMBER的地址实际上等同于在TYPE中的相对偏移量。container_of定义:/*** container_of - cast a member.

2021-03-29 22:12:30 1020

转载 create_singlethread_workqueue & queue_work

The functioncreate_singlethread_workqueue()will create a work queue. A work queue is just a queue to which you submit work. "work" here means any function that you would want to run at a given point in time. This work will be executed by a single worker ..

2021-03-28 22:30:26 190

转载 linux core dump

Linux下core dump在linux下开发时,如果程序突然崩溃了,也没有任何日志。这时可以查看core文件。从core文件中分析原因,通过gdb看出程序挂在哪里,分析前后的变量,找出问题的原因。Core Dump当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。我们可以认为 core dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来

2021-03-18 10:46:16 83

转载 2021-03-17

windows 下 putty 登陆服务器 显示remote host 图形界面本文需要下载 putty.exe 和 pscp.exe :http://www.chiark.greenend.org.uk/~sgtatham/putty/download.htmlXming 主程序和字体:https://sourceforge.net/projects/xming/一、putty 的使用1. 连接服务器下载 putty,无需安装直接运行 putty.exe 进入下面的界面:按照.

2021-03-17 13:53:39 113

转载 浅析长度为0的数组

浅析长度为0的数组Part1转自:http://my.oschina.net/u/176416/blog/33054 长度为0的数组在标准c和c++中是不允许的,如果使用长度为0的数组,编译时会产生错误,提示数组长度不能为0。但在GNUc中,这种用法却是合法的。它的最典型的用法就是位于数组中的最后一项,如上面所示,这样做主要是为了方便内存缓冲区的管理。如果你将上面的长度为0的数组换为指针,那么在分配内存时,需采用两步:首先,需为结构体分配一块内存空间;其次再为结构体中的成员变量分配内存...

2021-03-16 19:36:57 655

转载 C 指定元素初始化方法 指定初始化器

指定初始化器的概念C90 标准要求初始化程序中的元素以固定的顺序出现,与要初始化的数组或结构体中的元素顺序相同。但是在新标准 C99 中,增加了一个新的特性:指定初始化器。利用该特性可以初始化指定的数组或者结构体元素。数组的指定初始化器#一维数组的指定初始化器#利用指定初始化器的特性,我们可以这样定义并初始化一个数组:int a[6] = {[4] = 10,[2] = 25}; 上述的初始化就等同于如下方式:int a[6] = {0,0,25,0,10,0}; 可以看到通

2021-01-21 11:23:00 419

原创 linux fork 注意点

Rule The rule of fork 1 After a successful fork, execution in both the parent and child process continues at the instruction following the fork 2 To determine whether you are running in the parent or child process, use the fork return valu.

2020-11-02 20:03:31 160

转载 IOMMU 扫盲

本文主要介绍下IOMMU的相关知识点,相关细节,将在后续的文章中,结合代码,详细讲解。本文内容是对相关材料的汇总,并非原创。详情参见文章末尾的参考资料。1. 什么是IOMMUIOMMU(Input/Output Memory Management Unit)是一个内存管理单元(Memory Management Unit),它的作用是连接DMA-capable I/O总线(Direct Memory Access-capable I/O Bus)和主存(main memory)。传统的内存管理单元

2020-10-27 10:12:42 6112

转载 如何修改linux下的内存大小、起始地址

在实际的工作中,由于产品型号的不同,经常需要调整linux所管理的内存的大小,而内核在启动阶段,会两次去解析从uboot传递过来的关于内存的信息,具体如下:一、解析从uboot传递过来的tag(在parse_tags中处理)在uboot的do_bootm_linux()函数中,会创建一系列需要传递给内核的tag,所有的tag以链表形式链接到指定的物理内存中。setup_start_tag用来建立起始的tag,而起始的物理地址由bd->bi_boot_params指定:..

2020-10-19 17:17:16 1863

转载 /dev/mem 实现原理

这几天研究了下/dev/mem。发现功能非常奇妙,通过mmap能够将物理地址映射到用户空间的虚拟地址上。在用户空间完毕对设备寄存器的操作,于是上网搜了一些/dev/mem的资料。网上的说法也非常统一,/dev/mem是物理内存的全映像,能够用来訪问物理内存,一般使用方法是open("/dev/mem",O_RDWR|O_SYNC),接着就能够用mmap来訪问物理内存以及外设的IO资源,这就是实现用户空间驱动的一种方法。用户空间驱动听起来非常酷。可是对于/dev/mem,我认为没那么简单,有2个地方.

2020-10-19 16:36:14 2246

转载 files list file for package ‘xxx‘ missing

错误files list file for package 'xxx' missing; assuming package has no files currently installed的解决方法apt-get install或apt-get purge时报错“files list file for package 'xxx' missing; assuming package has no files currently installed”,其中xxx是具体的包名。方法1:sudo a.

2020-10-16 10:06:50 644

转载 详解static inline关键字

本文章为知乎用户@徐yang哟原创,禁止抄袭!灵感来源在查stm32的LL库部分函数的API时,有时会查到这种函数:__STATIC_INLINE void LL_GPIO_SetPinOutputType ( GPIO_TypeDef * GPIOx, uint32_t PinMask, uint32_t OutputType);我不禁对__STATIC_INLINE产生了好奇。在查看源文件后,发现这个关键字的定义如下#ifndef __INLINE #..

2020-09-17 16:47:01 4703 2

转载 sizeof是预处理指令吗

我们知道,sizeof是在编译期就完成了计算,在运行时已经是一个常数值了。那sizeof能用在类似于#if这样的指令中吗?答案一般是不行。关于预编译条件MSDN明确写着: The expression cannot use sizeof or a type-cast operator.其实,像#include,#if,#define等等这样的是在预处理过程就完成了包含和替换,所以他们是预处理指令。而此时还没有到编译期,还没有类型名称分析,sizeof也就不能用。...

2020-09-17 16:25:22 906

转载 udev 详解

如果你使用Linux比较长时间了,那你就知道,在对待设备文件这块,Linux改变了几次策略。在Linux早期,设备文件仅仅是是一些带有适当的属性集的普通文件,它由mknod命令创建,文件存放在/dev目录下。后来,采用了devfs,一个基于内核的动态设备文件系统,他首次出现在2.3.46 内核中。Mandrake,Gentoo等Linux分发版本采用了这种方式。devfs创建的设备文件是动态的。但是devfs有一些严重的限制,从 2.6.13版本后移走了。目前取代他的便是文本要提到的udev--一个用户空间

2020-09-11 16:57:38 3438

转载 创建sfs 设备节点——device_create

Linux 的设备管理是和文件系统紧密结合的,各种设备都以文件的形式存放在/dev 目录下,称为设备文件。应用程序可以打开、关闭和读写这些设备文件,完成对设备的操作,就像操作普通的数据文件一样。查看/proc/devices 文件可以获知系统中注册的设备,第 1 列为主设备号,第 2 列为设备名,主设备号是与驱动对应的概念,同一类设备一般使用相同的主设备号,不同类的设备一般使用不同的主设备号(但是也不排除在同一主设备号下包含有一定差异的设备)。因为同一驱动可支持多个同类设备,因此用次设备号来描述使用该驱

2020-09-10 20:38:40 210

转载 linux driver debug 开关

打开dev_dbg开关,使其日志输出到控制台内核驱动中(大多数是子系统中)有大量使用dev_dbg打印日志信息,但是这些信息默认是不会输出到控制台的。调试过程中,我们如何打开DEBUG,获取这些dev_dbg日志呢?打开dev_dbg需要满足两个条件:开启DEBUG 调整printk日志级别下面介绍为什么需要这两个条件以及如何修改。开启DEBUG首先看下dev_dbg的定义:#if defined(CONFIG_DYNAMIC_DEBUG)#define dev_dbg(de

2020-09-10 14:02:20 761

转载 linux驱动IS_ERR_VALUE、IS_ERR

Pointers and Error ValuesMany internal kernel functions return a pointer value to the caller. Many of thosefunctions can also fail. In most cases, failure is indicated by returning a NULL pointervalue. This technique works, but it is unable to communica

2020-09-09 15:58:28 529

转载 如何高效的访问内存(数据结构对齐)

影响内存访问速度的因素主要有:1.内存带宽:每秒读写内存的数据量,由硬件配置决定。2.CACHE高速缓冲:CPU与内存之间的缓冲器,当命中率比较高时能大大提供内存平均访问速度。3.TLB转换旁视缓冲:系统虚拟地址向物理地址转换的高速查表机制,转换速度比普通转换机制要快。我们能够优化的只有第2点和第3点。由于CACHE的小容量与SMP的同步竞争,如何最大限度的利用高速缓冲就是我们的明确优化突破口(以常用的数据结构体为例):1.压缩结构体大小:针对CACHE的小容量。2.对结构体进行对齐:针对内存

2020-09-08 15:48:19 445

转载 ____cacheline_aligned和____cacheline_aligned_in_smp

这两个都属于GCC扩展函数。____cacheline_alignedinstructs the compiler to instantiate a struct or variable at an address corresponding to the beginning of an L1 cache line, for the specific architecture, i.e., so that it is L1 cache-line aligned.____cacheline_al...

2020-09-08 13:34:53 651

转载 pread & pwrite

1 缘由在阅读seastar源码时发现有使用pread函数,这也是第一次认识pread函数,平时用read比较多。2 pread函数函数原型:#include <unistd.h>ssize_t pread(int fd, void *buf, size_t count, off_t offset);ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);pread简单来说就是在指定偏移o

2020-09-07 14:22:18 391

转载 Linux在应用层读写寄存器的方法

可以通过操作/dev/mem设备文件,以及mmap函数,将寄存器的地址映射到用户空间,直接在应用层对寄存器进行操作,示例如下:#include<stdio.h> #include<stdlib.h> #include<time.h> #include<unistd.h> #include<fcntl.h> #include<unistd.h> #include<sys/mma...

2020-09-07 14:20:51 393

转载 gdb调试的基本使用

https://www.cnblogs.com/HKUI/p/8955443.htmlGDB调试启动程序准备调试GDB yourpram或者先输入GDB然后输入file yourpram然后使用run或者r命令开始程序的执行,也可以使用 run parameter将参数传递给该程序参数列表 命令 命令缩写 命令说明 list l 显示多行源代码 ..

2020-09-07 09:43:13 223

转载 2020-09-03

The following is the most common method for checking if file exist:#include <sys/stat.h>bool FileExist(const char* FileName){ struct stat my_stat; return (stat(FileName, &my_stat) == 0);}//Example Usageint main(int argc, char* a

2020-09-03 18:30:37 95

转载 文件IO - O_DIRECT和O_SYNC详解

O_DIRECT和O_SYNC是系统调用open的flag参数。通过指定open的flag参数,以特定的文件描述符打开某一文件。这两个flag会对写盘的性能有很大的影响,因此对这两个flag做一些详细的了解。先看一个open函数的使用例子. 1 2 3 4 5 6 /* Open new or existing file for reading and wrting, sync io and no buffe...

2020-09-02 17:07:43 541

转载 sysfs详解

"sysfs is a ram-based filesystem initially based on ramfs. It provides a meansto export kernel data structures, their attributes, and the linkages between them touserspace.” --- documentation/filesystems/sysfs.txt可 以先把documentation/filesystems/sysfs.txt

2020-09-02 13:21:26 2642

转载 PCI总线及LSPCI命令详解分析

lspci命令详解参考https://blog.csdn.net/huangxuesi/article/details/69959679一、PCI简介 PCI是一种外设总线规范。我们先来看一下什么是总线:总线是一种传输信号的路径或信道。典型情况是,总线是连接于一个或多个导体的电气连线,总 线上连接的所有设备可在同一时间收到所有的传输内容。总线由电气接口和编程接口组成。本文讨论Linux下的设备驱动,所以,重点关注编程接口。 PCI是Peripheral Component In...

2020-09-01 20:45:39 6051

Design_of_Systems_on_a_Chip_Design_and_Test

详细描述了firmware 和硬件接口的一些设计规范, 非常实用。 固件开发入门强烈推荐

2017-10-09

嵌入式Linux基础教程

中文版嵌入式linux基礎教程,對嵌入式linux 的底層應用開發理論講解的非常到位

2015-12-22

精通LINUX设备驱动开发

非常不錯的講解linux驅動開發的書籍,偏向于實際應用,與LDD3結合的看效果會好很多

2015-12-22

空空如也

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

TA关注的人

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