
嵌入式方向
文章平均质量分 81
吴英强
80后,IT男,全栈工程师。
展开
-
解密短信木马为何屡杀不尽--android手机短信木马的攻与防
短信,一个几乎很少有人使用的通信手段,却因为利益的驱使,使得短信木马泛滥,更有一个庞大的黑色产业链在高速运转,短信木马为何屡杀不尽呢?我们为您解密!邂逅黑产 近日逛了逛以某西游记人物命名的威客网,看到一个项目需求是要做安卓短信转发的应用。正好笔者对安卓系统安全以及短信都有所涉猎,因此对该项目产生了兴趣。项目需求主要归结为以下几点:1)主动告知,应用在被控制手机上安装之原创 2015-09-07 13:32:05 · 3349 阅读 · 0 评论 -
linux驱动开发--中断:工作者队列实现中断底半部
1、工作队列工作队列(work queue)是linux kernel中将工作推后执行的一种机制;这种机制和tasklet不同之处在于工作队列是把推后的工作交由一个内核线程去执行,因此工作队列的优势就在于它允许重新调度甚至睡眠。工作队列数据类型定义,在中struct work_struct{ atomic_long_t data;//记录工作状态和指向工作者线程的指针 stru原创 2014-03-05 10:32:22 · 1790 阅读 · 0 评论 -
linux驱动开发--中断:tasklet实现中断底半部
1、在Linux 中实现中断底半部的机制主要是:tasklet、工作队列、软中断2、tasklet定义在中tasklet定义DECLARE_TASKLET(taskletname, tasklet_func, data);taskletname:待定义的tasklet名字tasklet_func:tasklet处理函数data:待传入tasklet处理函数的参数原创 2014-03-05 09:57:34 · 1842 阅读 · 0 评论 -
linux驱动开发--中断:按键中断
1、中断定义中断是指cpu在执行过程中,出现了某些突发事件时cpu必须暂停执行当前的程序,转去处理突发事件,处理完毕后cpu又返回原程序被中断的位置并继续执行。2、中断分类3、Linux中断处理程序结构a.在Linux系统中,中断处理程序分解为两个半部:顶半部(TopHalf)和底半部(BottomHalt)。b.顶半部:完成尽可能少的比较紧急的功能,往往只是简原创 2014-02-14 09:22:21 · 2975 阅读 · 0 评论 -
嵌入式系统中通讯协议的设计
原文谈及协议,很多工程师觉得协议的设计相对简单,主要是报文的设计。大多数时候,协议的应用场景简单,没有复杂的交互。这么做的确也是没什么太大的问题。然而,就是这么简单的场景,仍有一些协议会在实际中发生意想不到的问题。归根结蒂,还是没有把握协议涉及的规律。下面我们简单的聊聊协议设计的规律。协议设计中面临的问题:1.设计者大多数情况下,从应用出发,仅仅考虑了基本需求的满足,没原创 2014-01-20 14:50:29 · 2245 阅读 · 0 评论 -
linux驱动开发--字符设备:信号量
信号量的使用信号量(semaphore)是用于保护临界区的一种常用方法,它的使用和自旋锁类似。与自旋锁相同,只有得到信号量的进程才能执行临界区代码。但是与自旋锁不同的是当获取不到信号量时,进程不会原地打转而是进入休眠等待状态。关于信号量的操作函数:1、定义信号量struct semaphore sem;2、初始化信号量sema_init(struct semaphore *原创 2014-01-17 09:23:33 · 1636 阅读 · 0 评论 -
linux驱动开发--字符设备:设备轮询操作select/poll
select系统调用 用于多路监控,当没有一个文件满足要求时,select调用将引起进程阻塞设备轮询操作,对应select系统调用 unsigned int(*poll)(struct file *filp, struct poll_table_struct *wait); unsigned int(*poll)(struct file *原创 2014-01-24 15:31:15 · 3458 阅读 · 0 评论 -
linux驱动开发--字符设备:自旋锁
自旋锁的使用自旋锁(spin lock)是一种对临界资源进行互斥访问的典型手段,其名称来源于它的工作方式。为了获得自旋锁,在某cpu上运行的代码需要先执行一个院子操作,该操作测试并设置某个内存变量,由于它是原子操作,所以在该操作完成之前其他执行单元不可能访问这个内存变量。如果测试结果表明锁已经空闲,则程序获得这个自旋锁并继续执行;如果测试结果表明锁被占用,程序将在一个小循环内重复这个“测试原创 2014-01-16 16:15:26 · 1915 阅读 · 0 评论 -
linux驱动开发--字符设备:内核等待队列
在Linux驱动程序中,可以使用等待队列(wait queue)来实现阻塞进程的唤醒。等待队列可以用来同步对系统资源的访问。1.定义和初始化队列头wait_queue_head_t wqh;init_waitqueue_head(wait_queue_head_t *wqh);2.定义和初始化等待队列DECLARE_WAITQUEUE(name, tsk);3.添加、移除等原创 2014-01-24 15:05:14 · 2302 阅读 · 0 评论 -
linux驱动开发--字符设备:通过cdd_cdev结构中的led变量区分是哪个节点,private_data使用
private_data改进为设备驱动支持多个设备个体做准备,针对private_data进行改进在设备打开操作中通过inode中保存的i_cdev获取代表当前设备的cdev对象通过代表当前设备的cdev对象得到包含该对象的设备私有数据结构体将设备私有数据结构体指针保存到struct file的private_data成员中在其它设备操作中直接使用保存在struct file的原创 2013-12-28 10:50:19 · 2824 阅读 · 0 评论 -
linux下串口编程设置函数---------set_opt(fd1,115200,8,'N'1)--------------------
open /dev/ttys0, 设备文件之后,得到文件描述符, 对串口进行设置。/***串口设置函数:例(fd1, 115200, 8, 'N', 1);*参数:*fd:串口设备节点*nSpeed:波特率*nBits:数据位*nEvent:校验位*nStop:停止位*返回值:成功 -- 0* 失败 -- -1*/int set_opt(int fd,int nS原创 2014-03-28 11:07:07 · 6188 阅读 · 0 评论 -
Linux驱动程序:统计单词个数
本例为Android升读探索(卷1):HAL与驱动开发 一书中附带的shili原创 2014-06-09 13:18:11 · 2150 阅读 · 0 评论 -
制作Android手机开机动画的详细过程
1.使用一键root工具,获取android手机的root权限。将手机与电脑通过Usb线进行连接。 打开一键root软件。2.手机安装Root Explorer的软件 re335.apk将/system/meida 的权限设置为可写将原来的开机动画 bootanimation.zip重命名或删除3.将制作好的图片打包为bootanimation.zip并原创 2015-07-09 10:04:41 · 4522 阅读 · 0 评论 -
智能家居项目(2):项目工程框架的搭建
项目管理器:Linux中的项目管理器“make”有些类似于windows中的Visual C++里的“工程”,它是一种控制编译或者重复编译软件的工具,另外,它还能自动管理软件编译的内容、方式和时机,使程序员能够把精力集中在代码的编写上而不是在源代码的组织上。原创 2014-08-12 20:22:51 · 1927 阅读 · 0 评论 -
基于MCP2515的Linux CAN总线驱动程序设计
MCP2515简介MCP2515是一种独立的CAN总线通信控制器,是Microchip公司首批独立CAN解决方案的升级器件,其传输能力较Microchip公司原有CAN控制器(MCP2510)高两倍,最高通信速率可达到1Mbps。MCP2515能够接收和发送标准数据帧和扩展数据帧以及远程帧,通过两个接收屏蔽寄存器和六个接收过滤寄存器滤除无关报文,从而减轻CPU负担。MCP2515主原创 2014-08-11 21:08:15 · 3210 阅读 · 0 评论 -
智能家居项目(1):软件开发流程
公司开发某个项目,肯定是为了原创 2014-08-10 15:17:11 · 4914 阅读 · 0 评论 -
Android NDK r8 Cygwin CDT 在window下开发环境搭建 安装配置与使用 详细图文讲解
android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创)一直想搞NDK开发却一直给其他事情耽搁了,参考了些网上的资料今天终于把环境搭建起来了,把过程记录下来分享给大家。内容目录:1.默认基础环境2.NDK下载与配置3.安装Cygwin4.用NDK编译5.安装CDT插件原创 2014-06-20 18:41:34 · 1811 阅读 · 0 评论 -
Android系统的定制---定制系统开机动画
4.3定制Android平台系统通常产品厂商在拿到Android源码后会在Android源码基础上进行定制修改,以匹配适应自己的产品,从本节开始,我们从最原始的Android源码系统里一步一步定制出自己的Android系统。本节主要内容包含:根据Android源码,添加新产品编译项,定制系统启动界面和文字,定制系统启动动画和声音,定制系统桌面。4.3.1 添加新产品编译项A原创 2014-06-20 18:39:28 · 2838 阅读 · 0 评论 -
linux 2.6.36+s3c6410 SPI子系统接口讨论 --添加spi设备节点
下图是安装成功后,sys目录下的主要结构,由于目录非常复杂仅仅列出了主要的结构sys目录下spi子系统结构 接下来将从各struct开始进行分析,struct是构成内核对象的基础,函数是动态的构建和执行的工具。所以梳理脉络就从结构开始。linux下的设备模型包括几个主要的概念sysfs (dev是用户空间接口,根据sysfs下的class目录由mde转载 2014-06-18 17:13:15 · 1810 阅读 · 0 评论 -
linux驱动开发--字符设备:创建一组设备节点
cdev改进为设备驱动支持多个设备个体做准备,针对cdev进行改进将代表字符设备的cdev对象包含在设备驱动定义的私有数据结构体中对设备驱动私有数据结构体采用内核内存分配方式为其分配内存将为每个设备添加cdev对象和创建设备节点封装为一个独立函数支持多个设备个体为设备驱动支持多个设备个体对驱动进行改进循环调用为每个设备添加cdev对象和创建设备节点而封装的独立函数实现在原创 2013-12-28 10:06:20 · 2741 阅读 · 0 评论 -
linux驱动开发--字符设备:简单的file_operations示例
字符设备结构struct cdev内核使用该结构来表示一个字符设备,在中定义。重要成员:struct kobject kobj;//设备对象struct module *owner;//该设备的拥有者驱动模块struct file_operations *ops;//设备操作集合struct list_head list;//内核维护的字符设备链表成员dev_t dev;//字原创 2013-12-27 18:12:19 · 2759 阅读 · 0 评论 -
Linux内核--usb子系统的分析
drivers/usb/core/usb.csubsys_init(usb_init);module_exit(usb_exit);我们 看到一个subsys_initcall,它也是一个宏,我们可以把它理解为module_init,只不过这部分代码比较核心,开发者们把它看做一个子系统,而不仅仅是一个模块。usbcore这个模块它代表的不是某一个设备,而是所有usb设备赖以生存的模原创 2013-10-29 09:07:47 · 2427 阅读 · 0 评论 -
Linux下TTY驱动程序分析
1、tty设备有串口、usb转串口、调制解调器(传统的WinModem类设备)等。Linux-tty驱动程序的核心紧挨在标准字符设备驱动层之下,并体统了一系列的功能,作为接口被终端类型设备使用。内核负责控制通过tty设备的数据流,并且格式化这些数据。为了控制数据流,有许多不同的线路规程(line discipline)可以虚拟地“插入”任何的tty设备上,这由不同的tty线路规程驱动程序实现。原创 2013-11-11 15:45:41 · 3920 阅读 · 0 评论 -
Linux驱动编写的方法学习
static struct file_operations s3c24xx_buttons_fops = { .owner = THIS_MODULE, /* 这是一个宏,指向编译模块时自动创建的__this_module变量 */ .open = s3c24xx_buttons_open, .release = s3c24xx_buttons_原创 2013-10-31 11:24:19 · 1365 阅读 · 0 评论 -
Linux下串口驱动解析
原文一、核心数据结构串口驱动有3个核心数据结构,它们都定义在1、uart_driveruart_driver包含了串口设备名、串口驱动名、主次设备号、串口控制台(可选)等信息,还封装了tty_driver(底层串口驱动无需关心tty_driver)。struct uart_driver { struct module *owner;原创 2013-11-05 15:55:26 · 6784 阅读 · 0 评论 -
Linux技巧--Redhat 5系统中的vim编辑器无法正常显示中文解决方案(中文显示为乱码)/Ubuntu 12.04系统gedit中文乱码
1、查看linux系统中是否已安装fonts-chinese中文语言支持包,如果没有安装,需要下载相应版本的rpm包进行安装[root@localhost 02EXPORT_SYMBOL]# rpm -qa | grep fonts-chinesefonts-chinese-3.02-12.el52、修改/etc/sysconfig/i18n文件为以下内容修改之前,记得先备份。原创 2013-11-19 09:26:39 · 2805 阅读 · 0 评论 -
Linux下GPRS拨号功能的实现
原文第一步:编写GPRS的内核驱动程序 因为我用的开发板基于ARM920T,linux内核中没有mc35i的驱动程序,所以自己写了个驱动程序,重新编译了内核。驱动程序代码如下:/**//** 作者:龙涛*/#define __NO_VERSION__#include #include #include #include #inc原创 2013-11-04 11:11:07 · 2103 阅读 · 0 评论 -
解决编译内核模块helloworld.c:1: 错误:代码模式‘kernel’在 32 位模式下不受支持问题,未编译对64位的支持
Makefile内容:KERNELDIR ?=/root/Desktop/work/TI/linux-3.2.0PWD := $(shell pwd)obj-m += helloworld.odefault: $(MAKE) -C $(KERNELDIR) M=$(PWD) modulesclean: @rm -f *.o *.ord* *.sy* *.mod.*原创 2013-11-16 09:44:01 · 5392 阅读 · 0 评论 -
Linux字符设备驱动
1、预备知识:应用程序、库、内核、驱动程序的关系应用程序调用应用程序函数库完成功能应用程序以文件形式访问各种资源应用程序函数库部分函数直接完成功能 部分函数通过系统调用由内核完成 内核处理系统调用,调用设备驱动程序 设备驱动直接与硬件通信设备类型字符设备 对字符设备发出读/写请求时,实际的硬件I/O操作一般紧接着发生块设备原创 2013-10-09 09:14:02 · 1876 阅读 · 0 评论 -
ARM相关知识
ARM7采用冯·诺依曼(Von-Neumann)结构,数据存储器和程序存储器重合在一起。 同时,此结构也被大多数计算机所采用。ARM7为三级流水线结构(取指,译码,执行),平均功耗为0.6mW/MHz,时钟速度为66MHz,每条指令平均执行1.9个时钟周期ARM7系列微处理器包括如下几种类型的核:ARM7TDMI、ARM7TDMI-S、 ARM720T、ARM7EJ原创 2013-09-13 14:25:47 · 1249 阅读 · 0 评论 -
linux驱动开发--copy_to_user 、copy_from_user函数实现内核空间数据与用户空间数据的相互访问
设备读操作如果该操作为空,将使得read系统调用返回负EINVAL失败,正常返回实际读取的字节数ssize_t (*read)(struct file *filp, char __user *buf, size_t count, lofft *f_pos);filp:待操作的设备文件file结构体指针buf:待写入所读取数据的用户空间缓冲区指针count:待读取数据字节数原创 2013-12-30 10:33:09 · 17391 阅读 · 1 评论 -
linux驱动开发--字符设备:添加文件指针偏移的功能
设备移位操作llseek对应lseek系统调用的设备移位操作为llseek默认情况为允许设备移位操作大部分字符设备提供的都是数据流而不是一个数据区,比如串口,对于这些设备而言移位操作毫无意义设备可选择是否支持移位操作支持设备移位操作loff_t (*llseek)(struct file *filp, loff_t off, int whence);filp:待操作原创 2013-12-31 14:35:35 · 3003 阅读 · 0 评论 -
linux驱动开发--字符设备:动态分配设备号
设备号的动态分配int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name);dev:保存分配到的设备号baseminor:希望分配的起始次设备号count:需要分配的设备号数目name:设备名称(出现在/proc/devices) 返回:成功原创 2013-12-27 16:43:05 · 2455 阅读 · 0 评论 -
linux驱动开发--内核链表
1、内核链表定义在中定义struct list_head{ struct list_head *next, *prev;};在list_head结构中包含两个指向list_head结构的指针next和prev,在实际使用中,它通常被组织成双向循环链表。内核链表结构体不包含数据域,只包含维护链表的指针域。内核链表被包含在其他数据结构体中使用。初始化链表头INIT_LI原创 2013-12-26 15:58:10 · 1937 阅读 · 0 评论 -
linux驱动开发--字符设备:自动创建设备节点
自动创建设备文件定义在中class结构:该结构体类型变量对应一个设备类,被创建的类存放在/sys目录下面device结构:该结构体类型变量对应设备,被创建的设备存放于/sys目录下面在加载驱动模块时,用户空间中的udev会自动响应device_create()函数,在/sys下寻找对应的类,从而为这个设备在/dev目录下创建设备文件内核版本问题:在内核2.4版本中使用dev原创 2013-12-28 09:54:25 · 5571 阅读 · 0 评论 -
linux驱动开发--字符设备:静态分配设备号
字符设备(char device) 采用字节流方式访问的设备称为字符设备,通常智能采用顺序访问方式,也有极少数可以前后移动访问指针的设备(如:帧捕捉卡等设备)。系统标准字符设备,例如:字符中断、串口等设备。常见待开发设备驱动的字符设备,例如:触摸屏、键盘、视频捕捉设备、音频设备等。设备号主设备号 用于标识设备类型,内核代码根据该号码对应设备文件和对应的设原创 2013-12-27 14:53:46 · 2991 阅读 · 0 评论 -
linux驱动开发--内核定时器
1、内核定时器时钟中断:由系统的定时硬件以周期性的时间间隔发生,这个间隔(也就是频率)由内核根据常数HZ来确定。HZ常数:她是一个与体系结构无关的常数,可以配置50-1200之间,可以在内核中配置tick:她是HZ的倒数,也就是每发生一次硬件定时器中断的事件间隔。如HZ为200,tick为5毫秒。jiffies核心变数:它是linux核心变数(32位变数,unsigned long原创 2013-12-26 16:23:18 · 2861 阅读 · 0 评论 -
linux驱动开发--导出内核符号
/***Copyright (c) 2013.TianYuan*All rights reserved.**文件名称: Esdexp.c*文件标识: 导出内核符号,此文件中的函数模块被Esdimp.c调用**当前版本:1.0*作者:wuyq **取代版本:xxx*原作者:xxx*完成日期:2013-11-18*/#include #include MODULE_L原创 2013-12-26 08:44:56 · 1969 阅读 · 0 评论 -
linux驱动开发--内核模块参数
内核模块参数,验证小例子:/***Copyright (c) 2013.TianYuan*All rights reserved.**文件名称: Modparma.c*文件标识: 模块参数的验证**当前版本:1.0*作者:wuyq **取代版本:xxx*原作者:xxx*完成日期:2013-11-18*/#include #include /*内核提供的机制:在原创 2013-12-26 08:55:55 · 1490 阅读 · 0 评论 -
linux驱动开发--内核空间中内存的申请与释放
1、Linux内存管理linux内存最小管理单位为页(page),通常一页为4kb。linux系统中,在初始化时,内核为每个物理内存页建立一个page的管理结构,操作物理内存时实际上就是操作page页。物理地址:出现在cpu地址总线上的寻址物理内存的地址信号,是地址变换的最终结果。线性地址(虚拟地址):在32位cpu架构上,可以表示4G的地址空间,也就是0x00000000-0原创 2013-12-26 15:34:01 · 2470 阅读 · 0 评论