- 博客(30)
- 资源 (8)
- 收藏
- 关注
原创 Linux 网卡驱动学习(四)(缓存描述符 Buffer Description)
Linux 网卡驱动学习(缓存描述符 Buffer Description)。BD 描述符包含了报文很多信息,比如长度,报文的缓存地址等等。
2015-07-30 22:12:45 4617
原创 Linux 网卡驱动学习(三)(net_device 等数据结构)
【摘要】前文对网络驱动例子进行一个简单的梳理总结,本文贴出 net_device 的数据结构以及一些驱动中常用的数据结构。1、网络设备驱动结构下图摘自http://blog.chinaunix.net/uid-20672257-id-3147768.html1)、网络协议接口层向网络层协议提供提供统一的数据包收发接口,不论上层协议为ARP还是IP,都通过dev_queue_xmit
2015-07-30 22:01:08 9933
原创 Linux 网卡驱动学习(二)(网络驱动接口小结)
【摘要】前文我们分析了一个虚拟硬件的网络驱动例子,从中我们看到了网络设备的一些接口,其实网络设备驱动和块设备驱动的功能比较类似,都是发送和接收数据包(数据请求)。当然它们实际是有很多不同的。1、引言首先块设备在/dev目录下有设备节点,而网络设备没有这样的设备入口。read,write等常规的文件接口在网络设备下也没有意义。 最大的区别在于:块设备只响应内核的数据请求;而网络设备驱动要异步地接收来
2015-07-29 20:01:37 8377 3
原创 Linux 网卡驱动学习(一)(分析一个虚拟硬件的网络驱动例子)
Linux 网卡驱动学习(分析一个虚拟硬件的网络驱动例子),网络设备驱动层是连接网络堆栈协议层和网络硬件的中间层。
2015-07-29 19:32:21 6540
原创 u32、u16、u8 数据类型
#define U32 unsigned int #define U16 unsigned short #define S32 int #define S16 short int #define U8 unsigned char #define S8 charunsigned char = u8 unsigned short int = u16 unsigned long int
2015-07-29 19:10:09 50726
原创 格式化说明符以及修饰符(整理)
【摘要】最近用到一些格式化输出符,调试老提示类型不对,故整理一下,方便查看。1、 转换说明符转换说明符 意 义%c把输入解释成一个字符%d把输入解释成一个有符号十进制整数%e,%f,%g,%a把输入解释成一个浮点数(%a 是C99标准)%E,%F,%G
2015-07-29 19:06:13 1930
原创 x86(32位)分页管理的机制
页的尺寸是4KB,虚拟地址的前20位用于指定一个物理页,后12位用于访问页内偏移。 页表项的结构: 层次化的设计想法: 因为4GB的虚拟内存共有1M=220=1048576个4K大小的页面。 我们将这些页面分成210=1024份,即从页表1到页表1024,由页目录表管理; 每一份(每一页表)有210=1024个页,由每一个页表管理,页在页表中是随机的,哪个页位于哪个页表中是没有规律的;
2015-07-28 21:18:05 1570
原创 Compare And Swap(CAS)实现无锁多生产者
struct node{struct node *next;int data;}struct node *queue;//队列头多个消费者(多线程)都需要向这个queue插入数据 为了说明问题的复杂性,先看看只有一个消费者时的情况,插入队列的操作非常简单: Step1) new_head->next = queue->head; Step2) queue->head = n
2015-07-27 21:59:22 3964
原创 dma_alloc_coherent (建立一致性 DMA 映射函数)
A: 内存的虚拟起始地址,在内核要用此地址来操作所分配的内存B: struct device指针,可以平台初始化里指定,主要是dma_mask之类,可参考framebufferC: 实际分配大小,传入dma_map_size即可D: 返回的内存物理地址,dma就可以用。所以,A和D是一一对应的,只不过,A是虚拟地址,而D是物理地址。对任意一个操作都将改变缓冲区内容。当然要注意操作环境。
2015-07-25 19:24:31 18836 1
原创 open(“/dev/mem “,O_RDWR | O_SYNC)
【摘要】open(“/dev/mem”,O_RDWR|O_SYNC) 中/dev/mem是物理内存的全映像,可以用来访问物理内存。然后mmap,接着就可以用mmap的地址来访问物理内存,这实际上就是实现用户空间驱动的一种方法。 http://blog.csdn.net/wlp600/article/details/6893636#
2015-07-25 19:14:04 12214 2
原创 并发无锁队列学习(单生产者单消费者模型)
【摘要】本文介绍单生产者单消费者模型的队列。根据写入队列的内容是定长还是变长,分为单生产者单消费者定长队列和单生产者单消费者变长队列两种。单生产者单消费者模型的队列操作过程是不需要进行加锁的。生产者通过写索引控制入队操作,消费者通过读索引控制出队列操作。二者相互之间对索引是独享,不存在竞争关系。
2015-07-24 19:45:10 4985 1
转载 并发无锁队列学习(数据结构)
提到并行计算通常都会想到加锁,事实却并非如此,大多数并发是不需要加锁的。比如在不同电脑上运行的代码编辑器,两者并发运行不需要加锁。在一台电脑上同时运行的媒体播放放器和代码编辑器,两者并发运行不需要加锁(当然系统调用和进程调度是要加锁的)。在同一个进程中运行多个线程,如果各自处理独立的事情也不需要加锁(当然系统调用、进程调度和内存分配是要加锁的)。在以上这些情况里,各个并发实体之间没有共享数据,所以虽
2015-07-24 19:35:12 2532
原创 并发无锁队列学习(概念介绍)
【摘要】队列在计算机中非常重要的一种数据结构,尤其在操作系统中。队列典型的特征是先进先出(FIFO),符合流水线业务流程。在进程间通信、网络通信之间经常采用队列做缓存,缓解数据处理压力。结合自己在工作中遇到的队列问题,总结一下对不同场景下的队列实现。根据操作队列的场景分为:单生产者——单消费者、多生产者——单消费者、单生产者——多消费者、多生产者——多消费者四大模型。其实后面三种的队列,可以归纳为一种多对多。根据队列
2015-07-24 19:23:56 7144
原创 ioremap 函数映射操作已知的物理地址(寄存器、端口、IO)
ioremap 函数来映射到内核地址空间,然后修改虚拟地址空间达到控制寄存器的状态。我用如下方法操作一个地址为0x56000020的端口
2015-07-23 22:10:59 4668
原创 内核态空间地址直接映射到用户态空间访问
【摘要】Linux中的内核空间到用户空间的地址映射让用户层应用可以直接访问内核地址,这就是mmap方法。应用程序通过内存映射可以直接访问设备的I/O存储区或DMA缓冲。内存映射使用户空间的一段地址关联到设备内存上,程序在映射的地址范围内进行读取或者写入,实际上就是对设备的访问。
2015-07-23 21:31:27 8799 1
原创 嵌入式 Linux 对内存的直接读写(devmem)
【摘要】这个工具的原理也比较简单,就是应用程序通过mmap函数实现对/dev/mem驱动中mmap方法的使用,映射了设备的内存到用户空间,实现对这些物理地址的读写操作。
2015-07-23 21:03:36 25151 2
原创 自己总结的 Makefile 小模板
all:commtestCFLAGS=-fPIC -g -WallARIA_INCLUDE=-I/usr/local/Aria/includeARIA_LINK=-L/usr/local/Aria/lib -lAria -lpthread -ldl -lrt%: %.cpp $(CXX) $(CFLAGS) $(ARIA_INCLUDE) $< -o $@ $(ARIA_LINK).
2015-07-20 21:21:32 623
原创 逻辑地址、虚拟地址、物理地址以及内存管理
本文涉及的硬件平台是X86。物理地址、虚拟地址、逻辑地址、线性地址之间的关系进行了细致分析。其实,内存资源在驱动设计中的地位是至关重要的,我们要对设备进行操作,首先要获取到设备的地址。在UIO用户态驱动设计中,用户直接操作设备,我们就应该明白操作到底是什么地址,明白地址之间映射的关系,才能更好的理解这个设备。
2015-07-19 17:27:32 2713
转载 Linux内存寻址之一:内存地址分类以及MMU介绍(转)
对于程序员来说,可以简单的把内存地址理解为一种访问存储单元的内容的一种方式。而对于80x86系列微处理器来说,我们需要区分三种地址: 1)逻辑地址 这种地址通常使用在机器语言里用于指定操作数或机器指令的地址。该类地址在著名的80x86分段体系架构中得到了很好体现,因此DOS程序员和windows程序员都不得不把他们的程序分成一段一段的(如代码段、数据段、堆栈段等等)。每一个逻
2015-07-19 16:59:21 870
原创 DMA (Direct Memory Access,直接内存存取)
对DMA内存的使用有3种方式:1,一致DMA映射通过dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flag)来直接得到一块用于dma的内存,同时得到这一段内存的虚拟地址和总线地址,分别用于CPU和device的访问。 通过这种方式得到的dma内存,开发者不用担心cache的问题,但
2015-07-18 18:40:26 3340
原创 Linux 设备驱动之 DTS 描述的资源
在linux使用platform_driver_register() 注册 platform_driver 时, 需要在 platform_driver 的probe() 里面知道设备的中断号, 内存地址等资源。这些资源的描述信息存放在 resource 数据结构中, 相同的资源存放在一个树形树形数据结构中, 通过父节点, 兄弟节点, 子节点相连。 比如中断资源, IO端口资源, IO内存资源,
2015-07-16 22:27:36 6377
转载 ARM Linux 3.x 的设备树(Device Tree)之DTB、DTS
1、ARM Device Tree起源Linus Torvalds在2011年3月17日的ARM Linux邮件列表宣称“this whole ARM thing is a f*cking pain in the ass”,引发ARM Linux社区的地震,随后ARM社区进行了一系列的重大修正。在过去的ARM Linux中,arch/arm/plat-xxx和arch/arm/mach-xxx中充斥
2015-07-16 22:19:38 7675
原创 Linux 设备驱动之 UIO 用户态驱动优缺点分析
【摘要】linux用户态的设备驱动开发:并不是所有的设备驱动程序都要在内核编写,有些情况下,在用户空间编写驱动程序能够更好地解决遇到的问题。本文对用户态驱动优缺点进行分析。1、用户空间驱动程序的优点1、可以和整个C库链接。2、在驱动中可以使用浮点数,在某些特殊的硬件中,可能需要使用浮点数,而linux内核并不提供浮点数的支持。如果能在用户态实现驱动,就可以轻松解决这一问题。 3、驱动问题不会导致整
2015-07-16 21:56:51 11514
原创 Linux 设备驱动之 UIO 机制(测试 UIO 机制)
【摘要】什么是UIO?UIO是运行在用户空间的I/O,那为什么要把I/O放在用户空间呢?1、UIO出现的原因第一,硬件设备可以根据功能分为网络设备,块设备,字符设备,或者根据与CPU相连的方式分为PCI设备,USB设备等。它们被不同的内核子系统支持。这些标准的设备的驱动编写较为容易而且容易维护。很容易加入主内核源码树。但是,又有很多设备难以划分到这些子系统中,比如I/O卡,现场总线接口或者定制的FP
2015-07-16 21:42:45 10659
原创 Linux 设备驱动之 UIO 机制(基本概念)
一个设备驱动的主要任务有两个: 1. 存取设备的内存 2. 处理设备产生的中断对于第一个任务,UIO 核心实现了mmap()可以处理物理内存(physical memory),逻辑内存(logical memory), 虚拟内存(virtual memory)。UIO驱动的编写是就不需要再考虑这些繁琐的细节。第二个任务,对于设备中断的应答必须在内核空间进行。所以在内核空间有一小部分代码
2015-07-16 21:37:27 29593 1
原创 Linux 内存管理之 mmap 解析(二)
1、mmap()系统调用形式void* mmap ( void * addr , size_t len , int prot , int flags , int fd , off_t offset ) mmap的作用是映射文件描述符fd指定文件的 [off,off + len]区域至调用进程的[addr, addr + len]的内存区域, 如下图所示:参数fd:为即将映射到进程空间的文件描述字
2015-07-15 21:05:15 1572
原创 Linux 内存管理之 mmap 解析(一)
1、mmap 函数用法:#include void *mmap(void *start, size_t length, int prot, int flags,int fd, off_t offset);int munmap(void *start, size_t length);/*返回说明:成功执行时,mmap()返回被映射区的指针,munmap()返回0。失败时,mmap()返回M
2015-07-15 20:45:08 1170
原创 PXE 服务器工作原理
1、工作原理启动预启动执行环境 (PXE) 启动后,PXE ROM 请求 IP 地址从动态主机配置协议 (DHCP) 服务器,使用普通的 DHCP 发现过程。 作为初始 DHCP 发现请求的一部分,客户端计算机将自身标识为启用 PXE 的指示 PXE 客户端需要提供服务的服务器。 客户端从 DHCP 服务器获得有效的 IP 地址之后,客户端将尝试查找并与下载网络启动程序 (NBP) 的 PXE 服务
2015-07-14 21:01:42 7017 1
原创 Linux 内核中 likely 与 unlikely 的宏定义解析
在 2.6 内核中,随处可以见到 likely() 和 unlikely() 的身影,那么为什么要用它们?它们之间有什么区别? 首先要明确: if(likely(value)) 等价于 if(value) if(unlikely(value)) 也等价于 if(value)也就是说 likely() 和 unlikely() 从阅读和理解代码的角度来看,是一样的!!!#define
2015-07-14 20:46:13 1153
原创 Linux中 ps aux 命令
$ ps auxUSER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND root 11 100.0 0.0 0 16 ?? RL 4Dec09 98403:03.48 [idle: cpu root 12 100.0 0.0
2015-07-14 20:37:08 2199
GP接口函数描述和入参解析
2022-05-04
Linux 设备模型之kobject
2015-06-08
字符设备LED驱动程序
2015-04-14
Windows下基于socket多线程并发通信的实现
2015-04-07
采温显示存储报警模块
2013-04-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人