自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

jeffade的专栏

资料收集,整理

  • 博客(114)
  • 收藏
  • 关注

转载 学习软件技术的2、3点

十多年前一块探索Linux技术的张波同学,如今虽不在技术一线,但他曾经的技术经历以及表述这种经历的有趣方式,给后来者以启发:————————————————————————————————————————————-学习软件技术的2、3点张波      很久很久没有接触开源社区了,也很久很久没有接触技术了,自从自废武功转作商务以后,就再也不好意思在开源论坛吱声了;木有办法,技术发

2012-06-12 10:47:56 1390 1

转载 Linux slab 分配器剖析--M. Tim Jones, 顾问工程师, Emulex

动态内存管理内存管理的目标是提供一种方法,为实现各种目的而在各个用户之间实现内存共享。内存管理方法应该实现以下两个功能:最小化管理内存所需的时间 最大化用于一般应用的可用内存(最小化管理开销) 内存管理实际上是一种关于权衡的零和游戏。您可以开发一种使用少量内存进行管理的算法,但是要花费更多时间来管理可用内存。也可以开发一个算法来有效地管理内存,但却要使用更多的内存。最终,特定应用程

2012-06-11 11:17:16 609

转载 _wait_event 具体实现过程

是不是当前进程要等待某个condition,然后就把它加到这个等待这个condition的wq中 _wait_event是当前进程调用它,也就是在宏DEFINE_WAIT(_wait)中的_wait就是把当前进程设置成_wait加到等待队列里, 以上基本正确 如果condition发生,是这个进程被唤醒设置成running而不是整个等待队列wq被唤醒? 如果cond

2012-06-11 10:19:05 1912 1

转载 C链表

链表是C语言编程中常用的数据结构,比如我们要建一个整数链表,一般可能这么定义:?1234structint_node {        intval;        structint_node *next;};为了实现链表的插入、删除、遍历等功能,另外要再实现一系列函数,比

2012-06-08 19:48:33 516

转载 Linux设备模型 (4)

《Linux设备模型 (2)》和《Linux设备模型 (3)》主要通过一些简单的实作介绍了kobject、kset、kobj_type、attribute等数据结构的用法,但这些实作并没有涉及到实际环境下的设备模型和sysfs。本文将以/sys下的module子目录为例,看看内核是如何构建sysfs这棵大树的。(注:本文的分析基于2.6.36内核) module的创建当module

2012-06-08 19:21:29 423

转载 Linux设备模型 (3)

在上文中,我们介绍到如何使用default attribute。Default attribute使用很方便,但不够灵活。比如上篇文章在Kobject一节中提到的那个例子,name和val这两个attribute使用同一个show/store函数来访问,如果attribute非常多,show/store函数里的分支就会很凌乱。为了解决这个问题,我们可以参考内核提供的kobj_attribute

2012-06-08 19:20:34 398

转载 Linux设备模型 (2)

上一篇文章《Linux设备模型 (1)》主要介绍了Linux设备模型在用户空间的接口sysfs,用户通过这个接口可以一览内核设备的全貌。本文将从Linux内核的角度来看一看这个设备模型是如何构建的。在Linux内核里,kobject是组成Linux设备模型的基础,一个kobject对应sysfs里的一个目录。从面向对象的角度来说,kobject可以看作是所有设备对象的基类,因为C语言并没有面向

2012-06-08 19:18:32 354

转载 Linux设备模型(1)

随着计算机的周边外设越来越丰富,设备管理已经成为现代操作系统的一项重要任务,这对于Linux来说也是同样的情况。每次Linux内核新版本的发布,都会伴随着一批设备驱动进入内核。在Linux内核里,驱动程序的代码量占有了相当大的比重。下图是我在网络上搜索到的一幅Linux内核代码量的统计图,对应的内核版本是2.6.29。我们可以很明显的看到,在Linux内核中驱动程序的比例已经非常高了。

2012-06-08 19:17:32 421

转载 我的Linux书架

工作几年来,一直从事Linux内核驱动方面的开发。从接触Linux到现在,读过不少Linux方面的书籍,现把认为很不错的一部分列出来和大家分享一下。入门类一直认为,在一个系统上学习开发之前,首先需要熟悉这个系统的使用。鉴于天朝的国情,绝大部分人第一个接触的操作系统就是Windows,因此对于这绝大部分人来说,如果要学习Linux开发,学会使用这个系统都是必不可少的一个环节。现在的Lin

2012-06-08 18:55:31 459

转载 linux设备模型浅析

好久都没来过啦.最近又在重看linux device driver这本书.之前看的时候忽略掉了linux设备模型这个章节,这次仔细看了一下,可看的相当头痛,迷迷糊糊...话说源代码时最好的工具书,于是查阅了一下源代码,也大致阅读了一些,没太仔细的句句分析,只是关注了与设备模型相关的。      linux设备模型的抽象是总线、设备、模型。按照这个顺序来分析就可以勾勒出linux设备模型。

2012-06-08 18:41:14 1245

转载 Linux内核中的汇编语言

AT&T的汇编格式在intel格式中大多使用大写字母,而AT&T格式中使用小写字母。 在 AT&T 汇编格式中,寄存器名要加上 '%' 作为前缀;而在 Intel 汇编格式中,寄存器名不需要加前缀。例如: AT&T 格式 Intel 格式 pushl %eax push eax 在 AT&T 汇

2012-06-08 10:41:48 2190

转载 信号量与自旋锁的比较

sem就是一个睡眠锁.如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠。这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。信号量一般在用进程上下文中.它是为了防止多进程同时访问一个共享资源(临界区).spin_lock叫自旋锁.就是当试图请求一个已经被持有的自旋锁.这个任务就会一直进

2012-06-08 09:13:49 1572

转载 copy_to_user和copy_from_user

在内核的学习中会遇到很多挺有意思的函数,而且能沿着一个函数扯出来很多个相关的函数。copy_to_user和copy_from_user就是在进行驱动相关程序设计的时候,要经常遇到的两个函数。由于内核空间与用户空间的内存不能直接互访,因此借助函数copy_to_user()完成用户空间到内核空间的复制,函数copy_from_user()完成内核空间到用户空间的复制。下面我们来仔细的理一下这两个函

2012-06-07 20:04:14 2631 1

转载 嵌入式C语言专题五:性能优化篇

内容要点:·使用宏定义·使用寄存器变量·内嵌汇编·利用硬件特性·活用位操作使用宏定义  在C语言中,宏是产生内嵌代码的唯一方法。对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法。  写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个:  错误做法:#define MIN(A,B)  ( A   正

2012-06-05 20:49:39 721

转载 嵌入式C语言专题四:键盘操作篇

计算机学的许多知识都具有相通性,因而,不断追赶时髦技术而忽略基本功的做法是徒劳无意的。我们最多需要"精通 "三种语言,最佳拍档是汇编、C、C++(或JAVA),很显然,如果你"精通"了这三种语言,其它语言你应该是可以很快"熟悉"的,否则你就没有"精通 "它们。内容要点:·处理功能键·处理数字键·整理用户输入处理功能键  功能键的问题在于,用户界面并非固定的,用户

2012-06-05 20:49:07 468

转载 嵌入式C语言专题三:屏幕操作篇

屏幕乃嵌入式系统生存之重要辅助,面目可憎之显示将另用户逃之夭夭。屏幕编程若处理不好,将是软件中最不系统、最混乱的部分,笔者曾深受其害。  内容要点:·汉字处理·系统时间显示·动画显示·菜单操作·模拟MessageBox函数汉字处理  现在要解决的问题是,嵌入式系统中经常要使用的并非是完整的汉字库,往往只是需要提供数量有限的汉字供必要的显示功能。例如,

2012-06-05 20:48:35 553

转载 嵌入式C语言专题二:内存操作篇

C语言最精华的内涵皆在内存操作中体现。我们之所以在嵌入式系统中使用C语言进行程序设计,99%是因为其强大的内存操作能力!  如果你爱编程,请你爱C语言;如果你爱C语言,请你爱指针;如果你爱指针,请你爱指针的指针!内容要点:·数据指针·函数指针·数组vs.动态申请·关键字const·关键字volatile·CPU字长与存储器位宽不一致处理数

2012-06-05 20:47:57 461

转载 嵌入式C语言专题一:软件架构篇

软件结构是软件的灵魂!结构混乱的程序面目可憎,调试、测试、维护、升级都极度困难。一个高尚的程序员应该是写出如艺术作品般程序的程序员。内容要点:·模块划分·多任务还是单任务·单任务程序典型架构·中断服务程序·硬件驱动模块·C的面向对象化模块划分  模块划分的"划"是规划的意思,意指怎样合理的将一个很大的软件划分为一系列功能独立的部分合作完成系统

2012-06-05 20:47:23 683

转载 嵌入式专题C语言篇

不同于一般形式的软件编程,嵌入式系统编程建立在特定的硬件平台上,势必要求其编程语言具备较强的硬件直接操作能力。无疑,汇编语言具备这样的特质。但是,由于汇编语言开发的复杂性,它并不是嵌入式系统开发的一般选择。而与之相比,C语言--一种"高级的低级"语言,则成为嵌入式系统开发的最佳选择。背景篇本文的讨论主要围绕以通用处理器为中心的协议处理模块进行,因为它更多地牵涉到具体的C语言编程技巧。本文讲

2012-06-05 20:46:45 376

转载 class_create() device_create()

在刚开始写Linux设备驱动程序的时候,很多时候都是利用mknod命令手动创建设备节点,实际上Linux内核为我们提供了一组函数,可以用来在模块加载的时候自动在/dev目录下创建相应设备节点,并在卸载模块时删除该节点,当然前提条件是用户空间移植了udev。内核中定义了struct class结构体,顾名思义,一个struct class结构体类型变量对应一个类,内核同时提供了class_cre

2012-06-05 19:04:01 607

原创 linux DMA

DMA(Direct Memory Access)直接内存存储,是一种无需CPU参与就可以让外设与系统内存之间进行双向数据传输的硬件机制。DMA方式的数据传输由DMA控制器(DMAC)控制,在传输期间,CPU可以并发地执行其他任务。当DMA结束以后,DMAC通过中断通知CPU数据传输已经结束,然后CPU执行相应的终端服务程序进行后处理。  当DMA针对的目的地址与Cache缓存的对象有重叠区域

2012-06-04 16:03:34 1043

转载 Linux内核DMA机制

DMA控制器硬件结构 DMA允许外围设备和主内存之间直接传输 I/O 数据, DMA 依赖于系统。每一种体系结构DMA传输不同,编程接口也不同。 数据传输可以以两种方式触发:一种软件请求数据,另一种由硬件异步传输。 在第一种情况下,调用的步骤可以概括如下(以read为例): (1)在进程调用 read 时,驱动程序的方法分配一个 DMA 缓冲区,随后指示硬件传送它的数据。进程进入睡

2012-06-04 16:03:05 21877

转载 高端内存与低端内存

高端内存是Linux中一个重要的概念,初涉Linux时曾经对这个概念非常迷惑。实际上这个概念比较简单,理解这个概念,需要追溯一下Linux的内存管理。        从前,CPU的地址总线只有32位,再早的就不再追溯了。32的地址总线无论是从逻辑上还是从物理上都只能描述4G的地址空间,在物理上理论上最多拥有4G内存(除了IO地址空间,实际内存容量小于4G),逻辑空间也只能描述4G的

2012-06-04 15:04:36 2378

转载 vm_area_struct (VMA)

Linux内核中,关于虚存管理的最基本的管理单元应该是struct vm_area_struct了,它描述的是一段连续的、具有相同访问属性的虚存空间,该虚存空间的大小为物理内存页面的整数倍。  下面是struct vm_area_struct结构体的定义:[cpp] view plaincopyprint?"font-family:Microsoft YaHei

2012-06-04 10:56:45 5790

原创 I/O端口和I/O内存的访问

I/O端口访问的一种途径是直接使用I/O端口操作函数;另一种途径是将I/O端口映射到内存进行访问。I/O内存的访问步骤:首先调用request_mem_region()申请资源,接着将寄存器地址通过ioremap()映射到内核空间虚拟地址,之后可以通过linux设备访问编程接口访问这些设备的寄存器了。访问完成之后,应对ioremap()申请的虚拟地址使用iounmap()进行释放,并释放rel

2012-06-04 10:09:12 667

转载 Linux的IO端口和IO内存

CPU对外设端口物理地址的编址方式有两种:一种是IO映射方式,另一种是内存映射方式。 Linux将基于IO映射方式的和内存映射方式的IO端口统称为IO区域(IO region)。IO region仍然是一种IO资源,因此它仍然可以用resource结构类型来描述。  Linux管理IO region:  1) request_region()  把一个给定区间的IO端口分配给一

2012-06-02 09:21:37 455

转载 request_mem_region,ioremap 和phys_to_virt()

Linux在头文件include/linux/ioport.h中定义了三个对I/O内存资源进行操作的宏:(1)request_mem_region()宏,请求分配指定的I/O内存资源。(2)check_mem_region()宏,检查指定的I/O内存资源是否已被占用。(3)release_mem_region()宏,释放指定的I/O内存资源。       这三个宏的定义如下:

2012-06-01 16:05:30 936

原创 linux内存管理

1、概念对有MMU的处理器而言,Linux系统的进程所能访问的内存空间达到4G。4G空间分为两部分:用户空间和内核空间。用户空间一般为0~3G,内核空间为3~4G,用户进程通常只能访问到用户空间的虚拟地址,要通过系统调用才可以访问到内核空间。每个进程的用户空间都是完全独立、互不干扰的,而内核空间是由内核映射,它不会跟着进程改变,是固定的。3~4G的内核空间中,从低到高的地址依次为:物理内存映射

2012-06-01 11:19:33 603

原创 内存管理单元MMU

高性能处理器一般都会提供一个内存管理单元MMU,该单元辅助操作系统进行内存管理,提供虚拟地址和物理地址的映射、内存访问权限保护和Cache缓存控制等硬件支持。TLB:Translation Lookaside Buffer 转换旁路缓存,是MMU的核心部件,它缓存少量的虚拟地址与物理地址的转换关系,是转换表Cache,也称为“快表”。TTW:Translation Table walk 转

2012-06-01 10:07:23 608

转载 Android HAL hardware module分析 以GPS module为例

准备在QT210的android系统中实现GPS功能,程序已经写好了,也可以编译出gps.s5pc110.so的库,但是不知道上层怎么调用这个库,在GPS相关的Android.mk中也没有找到,很是纳闷。通过分析hardware module才知道是怎么回事,之前并没有详细的了解hardware module,现在简单的分析一下。HAL层的hardware module主要实现

2012-05-31 19:06:44 756

原创 异步通知与异步I/O

异步通知:一旦设备就绪,则主动通知应用程序,应用程序不需要查询设备状态,称为“信号驱动的异步I/O”.Linux信号用于进程间通信(IPC)。linux使用信号来实现异步通知。出了SIGSTOP和SIGKILL两个信号外,进程可以忽略或捕获其他的全部信号。信号的接收(signal):void (*signal ( int sigum ,void (*handler)(int)) )(i

2012-05-31 15:38:50 732

原创 Linux设备程序中的并发控制

一、并发与竞态      并发指多个执行单元同时、并行被执行,而并发的执行单元对共享资源(全局变量,静态变量)的访问则容易导致竞态。     几种情景:1、对称多处理器(SMP)的多个CPU     2、单个CPU进程与抢占它的进程 3、中断与进程之间   访问共享资源区的代码区域称为临界区(critical sections).对临界区的保护方法:中断屏蔽,原子操作,自旋锁和

2012-05-29 09:49:28 458

原创 写一个从/proc/devices 文件中获取设备号的脚本

使用awk工具可以从/proc/devices 文件中获取设备号,建立一个.sh的脚本文件加入脚本:module=xxxmajor=`awk "\\$2==\"$module\" {print \\$1}" /proc/devices`insmod xxx.komknod /dev/xxx c $major 0xxx为设备名

2012-05-28 21:19:44 1064

转载 Linux驱动程序头文件

#include 是在linux-2.6.29/include/linux下面寻找源文件。#include 是在linux-2.6.29/arch/arm/include/asm下面寻找源文件。#include 是在linux-2.6.29/arch/arm/mach-s3c2410/include/mach下面寻找源文件。#include 在linux-2.6.31

2012-05-28 18:31:32 1009

转载 linux cdev详解

一.前言以前对于cdev仅仅是知其然,而不知其所以然。在本文中,将深入理解cdev的架构以及具体的实现。二.真实的cdev2.1 设备号搞驱动的都应该知道的东西,在写gpio驱动时,往往会用到以下两个函数。alloc_chrdev_region     --自动分配设备号register_chrdev_region  --分配以设定的设备号。上面两个函数的调用很简单

2012-05-28 10:40:04 1029

转载 (LDD3)Scull在2.6.35-30内核中的编译解决方案

LDD3作为从事驱动开发工作人员的必要参考资料,认真研究书中的附带源码具有很高的参考价值,但由于代码基于2.6.10内核,部分内核API较老,导致在2.6.35-30等较新内核上编译不能通过,由于工作需要,特花了一段时间进行整理,本篇文章对示例源码中的第一个驱动程序SCULL进行整理,供各位同仁参考:1、修改Makefile的第24行:   如果是基于PC,则KER

2012-05-24 16:14:31 633

转载 container_of()宏--open()

在学习Linux驱动的过程中,遇到一个宏叫做container_of。该宏定义在include/linux/kernel.h中,首先来贴出它的代码:/** * container_of - cast a member of a structure out to the containing structure * @ptr:        the pointer to the

2012-05-24 11:17:29 415

转载 理解和认识udev

因为本身从事存储行业,在工作中多次碰到用户有这样的要求:我的linux系统中原来有一块SCSI硬盘,系统分配的设备文件是/dev/sda。现在新增加了一个外置的磁盘阵列,通过SCSI卡连接。但接上这个磁盘阵列后,/dev/sda变成了磁盘阵列的硬盘了,原来内置的SCSI硬盘变成了 /dev/sdb,我希望将设备文件固定下来。    过去,我总是对用户说,这个比较麻烦,因为/dev/sda等文件

2012-05-23 20:06:38 353

转载 Linux进程的实际用户ID和有效用户ID

本人对Unix下的进程的实际用户ID和有效用户ID一直都比较迷惑,没有完全搞清楚。最近温习APUE(《高级UNIX环境编程》),终于对这两个概念有了一个清晰的认识,看来经典著作绝对需要温习多遍,才能领略其中的奥秘。     在Unix进程中涉及多个用户ID和用户组ID,包括如下:1、实际用户ID和实际用户组ID:标识我是谁(据说这是一个变态的哲学问题,难死一片哲学家)。也就是登

2012-05-18 09:35:10 419

转载 Linux进程间通信(IPC)之二——命名管道(FIFO)

1 命名管道(FIFO)      经过前文《Linux进程间通信(IPC)之一——管道》介绍管道,但是管道应用的一个重大缺陷就是没有名字,因此只能用于亲缘进程之间的通信。后来从管道为基础提出命名管道(named pipe,FIFO)的概念,该限制得到了克服。FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中。这样,即使与FIFO的创建进程不存在亲

2012-05-18 09:33:09 534

空空如也

空空如也

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

TA关注的人

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