自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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接口函数描述和入参解析

GP接口函数描述和入参解析(持续完善中)。 目前已经涵盖:安全存储相关API,基础API和key相关的API正在完善,后续会补录上去,有需要的同学可以通过CSDN 私信我,单独发你。 函数分析:主要基于optee-os GP相关接口做分析的。

2022-05-04

TCG_TSS_Overview_Common_Structures_v0.9_r03_published

TPM-TSS协议栈

2022-03-20

Linux 设备模型之kobject

kobject_init用来初始化kobject结构,kobject_add用来把kobj加入到设备模型之中。 在实作中,我们先对obj1进行初始化和添加的动作,调用参数里,parent被赋为NULL,表示obj1没有父对象,反映到sysfs里, my_kobj1的目录会出现在/sys下,obj2的父对象设定为obj1,那么my_kobj2的目录会出现在/sys/my_kobj1下面。 前面提到,kobject也提供了引用计数的功能,虽然本质上是利用kref,但也提供了另外的接口供用户使用。 kobject_init_and_add和kobject_init这两个函数被调用后,kobj的引用计数会初始化为1, 所以在module_exit时要记得用kobject_put来释放引用计数。

2015-06-08

Linux下安装神器

Linux下的安装windows exe的神器。

2015-05-22

字符设备LED驱动程序

 所有的驱动程序都应该对应一个具体的设备,这个LED驱动当然设备应该是LED。但是linux将它分成了一类叫做混杂设备。这类设备共享一个主设备号,但次设备号不同所有混杂设备形成一个链表,要访问一个设备时根据次设备号来查找相应的miscdevice。linux中用struct miscdevice来描述一个混杂设备:

2015-04-14

Windows下基于socket多线程并发通信的实现

本文介绍了在Windows 操作系统下基于TCP/IP 协议Socket 套接口的通信机制以及多线程编程知识与技巧,并给出多线程方式实现多用户与服务端(C/S)并发通信模型的详细算法,最后展现了用C++编写的多用户与服务器通信的应用实例并附有程序。 关键词:Windows;套接字;多线程;并发服务器; Socket 是建立在传输层协议(主要是TCP 和UDP)上的一种套接字规范,最初由美国加州Berkley 大学提出,为UNIX 系统开发的网络通信接口,它定义了两台计算机之间通信的规范,socket 屏蔽了底层通信软件和具体操作系统的差异,使得任何两台安装了TCP 协议软件和实现了Socket 规范的计算机之间的通信成为可能,Socket 接口是TCP/IP 网络最为通用的应用接口,也是在Internet 上进行网络程序应用开发最通用的API[1],本文介绍了Socket通信的基本机制以及采用多线程技术实现并发通信的基本原理,并给出实例。

2015-04-07

采温显示存储报警模块

一些常用模块,包括LCD1602显示模块,DS1302模块,DS18B20模块,报警模块,24C02模块,全都是用C语言编写的。全部都通过调试,很方便的。很实用喔。。个人觉得3分并不贵啦,物有所值。。

2013-04-02

matlab基础教学

挺好的一个资源,我从老师那拷贝过来的,与大家分享了,内容很详细!

2011-10-03

空空如也

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

TA关注的人

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