暂无个人介绍
<p>原文:http://blog.csdn.net/ladofwind/article/details/19103915</p> <p></p> <p style="color:rgb(51,51,51); line-height:26px; margin-top:5px; margin-bottom:5px; font-family:sans-serif; font-size:16
<strong><span style="font-size:18px">select系统调用<br> 用于多路监控,当没有一个文件满足要求时,select调用将引起进程阻塞<br> 设备轮询操作,对应select系统调用<br> unsigned int(*poll)(struct file *filp, struct poll_table_stru
<p><span style="font-size:18px"><span style="white-space:pre"></span><span style="white-space:pre"></span> 在Linux驱动程序中,可以使用等待队列(wait queue)来实现阻塞进程的唤醒。等待队列可以用来同步对系统资源的访问。</span></p> <p><span
<strong><u>信号量的使用</u></strong><br><p><span style="white-space:pre"></span>信号量(semaphore)是用于保护临界区的一种常用方法,它的使用和自旋锁类似。与自旋锁相同,只有得到信号量的进程才能执行临界区代码。但是与自旋锁不同的是当获取不到信号量时,进程不会原地打转而是进入休眠等待状态。</p> <p><stron
<strong><u>自旋锁的使用</u></strong><br><p><span style="white-space:pre"></span>自旋锁(spin lock)是一种对临界资源进行互斥访问的典型手段,其名称来源于它的工作方式。为了获得自旋锁,在某cpu上运行的代码需要先执行一个院子操作,该操作测试并设置某个内存变量,由于它是原子操作,所以在该操作完成之前其他执行单元不可能访
<p><span style="font-size:18px">解决竞态问题的途径是保证对共享资源的互斥访问,所谓互斥访问是指一个执行单元在访问共享资源的时候,其他的执行单元被禁止访问。</span></p> <p><span style="font-size:18px">访问共享资源的代码区域称谓临界区(critical sections),临界区需要以某种互斥机制加以保护。中断屏蔽、
<strong><u>设备移位操作llseek</u></strong><br> 对应lseek系统调用的设备移位操作为llseek<br> 默认情况为允许设备移位操作<br> 大部分字符设备提供的都是数据流而不是一个数据区,比如串口,对于这些设备而言移位操作毫无意义<br> 设备可选择是否支持移位操作<br><br> 支持设备移位操作<br><strong>loff_t (*l
<strong><u>设备读操作</u></strong><br><p>如果该操作为空,将使得read系统调用返回负EINVAL失败,正常返回实际读取的字节数</p> <p><strong>ssize_t (*read)(struct file *filp, char __user *buf, size_t count, lofft *f_pos);</strong><br><span
<strong><u>private_data改进</u></strong><br> 为设备驱动支持多个设备个体做准备,针对private_data进行改进<br> 在设备打开操作中通过inode中保存的i_cdev获取代表当前设备的cdev对象<br> 通过代表当前设备的cdev对象得到包含该对象的设备私有数据结构体<br> 将设备私有数据结构体指针保存到struct file的
<strong><u>cdev改进</u></strong><br> 为设备驱动支持多个设备个体做准备,针对cdev进行改进<br> 将代表字符设备的cdev对象包含在设备驱动定义的私有数据结构体中<br> 对设备驱动私有数据结构体采用内核内存分配方式为其分配内存<br><p>将为每个设备添加cdev对象和创建设备节点封装为一个独立函数</p> <p><strong><u>支持多个
<strong><u>自动创建设备文件</u></strong><br> 定义在<linux/device.h>中<br> class结构:该结构体类型变量对应一个设备类,被创建的类存放在/sys目录下面<br> device结构:该结构体类型变量对应设备,被创建的设备存放于/sys目录下面<br> 在加载驱动模块时,用户空间中的udev会自动响应device_crea
<p><strong>字符设备结构struct cdev</strong></p> <p>内核使用该结构来表示一个字符设备,在<linux/cdev.h>中定义。<br> 重要成员:<br></p> <pre code_snippet_id="131005" snippet_file_name="blog_20131227_1_3599521" name="code" c
<strong><u>设备号的动态分配</u></strong><br> int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name);<br><span style="white-space:pre"></span>dev:保存分配到的设备号<br><span styl
<strong><u>字符设备</u></strong>(char device)<br><p> 采用字节流方式访问的设备称为字符设备,通常智能采用顺序访问方式,也有极少数可以前后移动访问指针的设备(如:帧捕捉卡等设备)。系统标准字符设备,例如:字符中断、串口等设备。常见待开发设备驱动的字符设备,例如:触摸屏、键盘、视频捕捉设备、音频设备等。</p> <p><img src
<p>1、内核定时器</p> <p>时钟中断:由系统的定时硬件以周期性的时间间隔发生,这个间隔(也就是频率)由内核根据常数HZ来确定。<br> HZ常数:她是一个与体系结构无关的常数,可以配置50-1200之间,可以在内核中配置<br> tick:她是HZ的倒数,也就是每发生一次硬件定时器中断的事件间隔。如HZ为200,tick为5毫秒。<br> jiffies核心变数:它是lin
<p>1、内核链表定义</p> <p>在<linux/list.h>中定义<br></p> <p></p> <pre code_snippet_id="129034" snippet_file_name="blog_20131226_1_9794223" name="code" class="objc">struct list_head{ struct list_he
<p>1、Linux内存管理</p> <p>linux内存最小管理单位为页(page),通常一页为4kb。<br> linux系统中,在初始化时,内核为每个物理内存页建立一个page的管理结构,操作物理内存时实际上就是操作page页。<br></p> <p>物理地址:出现在cpu地址总线上的寻址物理内存的地址信号,是地址变换的最终结果。<br> 线性地址(虚拟地址):在32位cpu
<p>内核模块参数,验证小例子:</p> <p></p> <pre>/** *Copyright (c) 2013.TianYuan *All rights reserved. * *文件名称: Modparma.c *文件标识: 模块参数的验证 * *当前版本:1.0 *作者:wuyq * *取代版本:xxx *原作者:xxx *完成日期:2013-11-18 */ #includ
<p>导出内核符号模板代码,验证小实例:</p> <p></p> <pre>/** *Copyright (c) 2013.TianYuan *All rights reserved. * *文件名称: Esdexp.c *文件标识: 导出内核符号,此文件中的函数模块被Esdimp.c调用 * *当前版本:1.0 *作者:wuyq * *取代版本:xxx *原作者:xxx *完成日期
<p><span style="white-space:pre">在正常情况下,必须知道一个类的完整路径之后才可以实例化对象,但是在java中也允许通过一个对象来找到其所在类的信息,那么这实际上就是Class类的功能。</span></p> <p></p> <pre code_snippet_id="124093" snippet_file_name="blog_20131223_1_2
枚举就是规定好了指定的取值范围,所有的内容只能从指定的范围中取得。使用简单类完成颜色的固定取值问题。<br><p>也就是说此时,一个类只能产生固定的几个对象。</p> <p></p> <pre code_snippet_id="105256" snippet_file_name="blog_20131210_1_6466889" name="code" class="java">clas
<h1>1、实现动态显示当前计算机时间</h1> <div> <img src="http://img.blog.csdn.net/20131209155929218" alt=""><br> </div> <div> <pre code_snippet_id="104244" snippet_file_name="blog_20131209_1_7546022" name="code
属性是在程序中经常出现的一种形式。<br><p>在类集中提供了一个专门的Properties类,以完成属性的操作。</p> <p></p> <pre code_snippet_id="95581" snippet_file_name="blog_20131204_1_8733091" name="code" class="java">public class Properties ext
<p><span style="white-space:pre">栈是采用先进后出的数据存储方式,每一个栈都包含一个栈顶,每次出栈是将栈顶的数据取出。</span></p> <p><img src="http://img.blog.csdn.net/20131203083147515" alt=""><br></p> <h1>Stack类</h1> <div> <img src="h
<h1>Collections常用方法及常量:</h1> <div> <img src="http://img.blog.csdn.net/20131202084140796" alt=""><br> </div> <div>验证:空集合的操作</div> <div> <img src="http://img.blog.csdn.net/20131202093846109" alt=
Collection的操作中之前已经发现,每次保存的对象都是一个对象,但是在Map中保存的是一对对象,对象的形式是以:key->value的形式保存的。<br><p>就好像电话本:张三-->12445</p> <h1>Map接口中的方法</h1> <div> <img src="http://img.blog.csdn.net/20131128083612078" alt=
<h1>Iterator接口简介:</h1> <div> <img src="http://img.blog.csdn.net/20131125090335921" alt=""><br> </div> <div> <img src="http://img.blog.csdn.net/20131125090434515" alt=""><br> </div> <div><br></d
<h1>Set接口的定义</h1> <div> <img src="http://img.blog.csdn.net/20131122084121843" alt=""><br> </div> <div><span style="font-size:18px">Collection就不能进行双向输出,因为没有提供get()方法,但是Set接口与Collection接口的定义一致,所以其
<h1>功能:</h1> <p><span style="font-size:18px">预处理、编译、连接、汇编</span></p> <p><img src="http://img.blog.csdn.net/20131121155438593" alt=""><br></p> <p><br></p> <p><img src="http://img.blog.csdn.net/
<h1>LinkedList子类与Queue接口</h1> <div> <img src="http://img.blog.csdn.net/20131121083154250" alt=""><br> </div> <h1>Queue接口定义的方法</h1> <div> <img src="http://img.blog.csdn.net/20131121083257765" al
<p><span style="white-space:pre"></span>Collection下分为很多的子接口,其中有一个List接口,List接口中可以存放任意的数据。而且在List接口中内容是允许重复的。List接口的功能要比Collection接口强大很多,因为大量的扩充了Collection接口的操作。</p> <h1>List接口的扩展方法:</h1> <div> <
<h1><span style="font-family:宋体,Arial; line-height:26px; font-weight:normal"><span style="color:#cc0000">Redhat5 vim编辑器 中文乱码:</span></span></h1> <h1><span style="color:rgb(102,102,102); font-fami
<h1>类集的作用:</h1> <div> <img src="http://img.blog.csdn.net/20131119082734203" alt=""><br> </div> <div> <img src="http://img.blog.csdn.net/20131119082849062" alt=""><br> </div> <h1>类集框架主要接口:</h1>
<h1>1、对象序列化是什么?</h1> <div>一个对象产生之后实际上是在内存中为其开辟了一个存储空间,方便存储信息。<br> </div> <div> <img src="http://img.blog.csdn.net/20131118084016015" alt=""><br> </div> <h1>定义可序列化的类:</h1> <div> <pre name="code
<h1><span style="font-size:18px">Makefile内容:</span></h1> <p></p> <pre name="code" class="html">KERNELDIR ?=/root/Desktop/work/TI/linux-3.2.0 PWD := $(shell pwd) obj-m += helloworld.o default:
<h1>编码:</h1> <div>在计算机世界里,任何的文字都是以指定的编码方式存在的,在java程序的开发中最常见的编码为:ISO8859-1、GBK/GB2312、unicode、UTF。<br> </div> <div> <img src="http://img.blog.csdn.net/20131116084005718" alt=""><br> </div> <h1>乱
<h1>回退流:</h1> <p><img src="http://img.blog.csdn.net/20131115083218546" alt=""><br></p> <p><span style="font-size:18px">使用InputStream要使用read()方法不断读取,是采用顺序的读取方式。</span><br></p> <h1>回退流的操作机制:</h1>
<h1>压缩流:</h1> <p><img src="http://img.blog.csdn.net/20131114085358046" alt=""><br></p> <h1>压缩流的实现:</h1> <div> <img src="http://img.blog.csdn.net/20131114085601531" alt=""><br> </div> <h1>zipEn
<p>合并流的主要功能是将两个文件的内容合并成一个文件。</p> <p>主要操作的是内容。</p> <p><img src="http://img.blog.csdn.net/20131113083700046" alt=""><br></p> <h1>SequenceInputStream类的常用方法:</h1> <div> <img src="http://img.blog.c
<h1>数据操作流:</h1> <div><span style="font-size:18px">与平台无关的数据操作流:DataOutputStream、DataInputStream</span></div> <div> <img src="http://img.blog.csdn.net/20131112084311390" alt=""><br> </div> <div>如
<h1><span style="font-size:18px">1、tty设备</span></h1> <p><span style="font-size:18px">有串口、usb转串口、调制解调器(传统的WinModem类设备)等。Linux-tty驱动程序的核心紧挨在标准字符设备驱动层之下,并体统了一系列的功能,作为接口被终端类型设备使用。内核负责控制通过tty设备的数据流,并且
<h1>Scanner简介:</h1> <div> <img src="http://img.blog.csdn.net/20131111083302937" alt=""><br> </div> <div>适应Scanner接收键盘的输入数据:</div> <div> <pre name="code" class="java">import java.util.* ; publi
<h1>实例一:加法操作</h1> <div> <img src="http://img.blog.csdn.net/20131109093254640" alt=""><br> </div> <div> <pre name="code" class="java">import java.io.* ; public class ExecDemo01{ public static v
<p><span style="font-family:Verdana,Arial,Helvetica,sans-serif"><span style="font-size:14px; line-height:25px"><a target="_blank" href="http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857
<p>Buffer:表示缓冲区,缓冲区中的内容可以更改,可以提高效率。如果要想接受任意长度的数据,而且避免乱码产生,就可以使用BufferedReader。</p> <p></p> <pre name="code" class="java">public class BufferedReader extends Reader</pre> <br> 因为输入的数据有可能出现中文,所以
<p><a target="_blank" href="http://blog.chinaunix.net/uid-23089249-id-34481.html">原文</a></p> <h1><span style="color:rgb(51,51,51); font-family:宋体,Arial; font-size:14px; line-height:21px; backgrou
<p>man getopt_long,得到其声明如下:</p> <p></p> <pre code_snippet_id="422531" snippet_file_name="blog_20140708_1_7194122" name="code" class="objc">int getopt_long(int argc, char * const argv[],const char
<p><a target="_blank" href="http://blog.csdn.net/flybird_lt/article/details/1356016">原文</a></p> <p></p> <h1>第一步:编写GPRS的内核驱动程序</h1> 因为我用的开发板基于ARM920T,linux内核中没有mc35i的驱动程序,所以自己写了个驱动程序,重新编译了内核。驱
<h1>1、打印流:</h1> <div> <img src="http://img.blog.csdn.net/20131104084918687" alt=""><br> </div> <div>之前在打印信息的时候需要使用OutputStream,但是这样一来,所有的数据输出的时候会非常的麻烦,String->byte[], 打印流中可以方便的进行输出。<br> </div
<h1>管道流</h1> <div> <img src="http://img.blog.csdn.net/20131102090153781" alt=""><br> </div> <div> <pre name="code" class="java">import java.io.* ; class Send implements Runnable{ // 线程类 priva