
Linux内核与驱动
文章平均质量分 80
安然无忧
技术无捷径,一步一脚印
展开
-
class_create和class_register
目录(?)[-]class结构体介绍class相关API说明class_create使用示例class_register使用示例附录一class_create和class_register对比本文介绍linux中class_create和class_register的相关使用方法1 class结构体介绍 内核中定义了struct class结构原创 2014-09-15 22:10:48 · 1653 阅读 · 0 评论 -
tasklet原理
1 tasklet用途 在中断处理中大量使用tasklet机制;tasklet用于减少硬中断处理的时间,将本来是在硬中断服务程序中完成的任务转化成软中断完成,即是将一些非紧急的任务留到tasklet中完成,而紧急的任务则在硬中断服务程序中完成。2 注意事项 tasklet始终在中断期间和调度它的CPU上执行;调度一个tasklet只是告诉内核要在之后的某个时间来执行给定的函数。转载 2014-11-19 21:58:24 · 1521 阅读 · 0 评论 -
关于Spinlock机制的一点思考
Spin_lock的kernel中的实现对单核(UP),多核(SMP)有不同的处理方式。在这之前经常搞混,重新理一理。对单核来说,如果spin_lock不处于中断上下文,则spin_lock锁定的代码丢失CPU拥有权,只会在内核抢占的时候发生。所以,对于单核来说,只需要在spin_lock获得锁的时候禁止抢占,释放锁的时候开放抢占。其实这不是真正意义上的锁。对多核来说,存在两段代码原创 2014-11-22 00:11:19 · 3498 阅读 · 0 评论 -
Vmalloc使用原理
当buddy系统还有大量的连续物理内存时,我们可以通过__pages_alloc成功分配很大的一块连续物理内存空间,随着系统运行时间加长,buddy系统内很难中找到一块大的连续物理内存空间,因此__pages_alloc可能会失败,即便通过kswapd进行页面的回收和交换,buddy仍然不可避免的碎片化首先我们要明确的是,连续物理内存的分配并不是必要的。对于大部分DMA操作,我们的确需转载 2014-11-18 16:50:46 · 3779 阅读 · 0 评论 -
barrier 和 preempt_disable() 学习
[cpp] view plaincopyprint?#define preempt_disable() \ do{ \ inc_preempt_count(); \ barrier(); \ }while(0) #define preempt_disable() \do{ \ inc_preempt_count(); \转载 2014-11-17 11:07:29 · 441 阅读 · 0 评论 -
kernel oops分析
有点空闲时间,让我们来总结一下内核DEBUG中的各个语句吧。随便找个内核驱动,在init函数里面加入如下代码测试:u8 a = 1, b = 0;printk("----------dump stack\n");dump_stack();printk("----------BUG_ON\n");BUG_ON(aBUG_ON(a>b);printk("------转载 2014-08-18 10:37:50 · 2632 阅读 · 0 评论 -
proc_fs 使用说明
创建一个 proc 目录创建一个 proc 目录就调用 struct proc_dir_entry *proc_mkdir(const char *name, struct proc_dir_entry *parent) 这个函数。参数name 是目录名,parent 是该目录的上层 proc 目录项,如果为 NULL,表示创建在 /proc 根目录下。 创建一个 proc 文件转载 2014-07-31 13:54:55 · 1070 阅读 · 0 评论 -
如何制作LINUX的patch文件及如何打patch
对某个版本的Linux内核做了修改以后,如果希望发布出去给别人用,那么就需要制作针对此版本的patch文件。patch文件也叫补丁,就是一个文本文档,这个文档包含了在两个不同版本的源代码树之间的变化。补丁是通过diff应用程序来创建的。为了正确地打上一个补丁,你需要知道这个补丁是从哪个基础版本产生出来的以及这个补丁将要把目前的源代码树变化到什么新的版本。这些信息或者会出现在补丁文件转载 2015-08-24 15:12:32 · 583 阅读 · 0 评论 -
Linux之debugfs介绍
Linux之debugfs介绍Debugfs是一种用于内核调试的虚拟文件系统,在内核源码中经常可以看到它的使用,今天我来大概介绍一下它的使用。如果你对debugfs不熟悉,那么也许你会对sysfs比较熟悉,对于调试方面,其实两个文件系统还是挺类似的,但是sysfs的引入内核主要是用于驱动模型的。所以我们在平时调试的时候应该尽量避免使用sysfs,而使用debugfs。好了,下面我们来介转载 2015-08-12 15:44:05 · 2548 阅读 · 0 评论 -
ARM Linux 3.x的设备树(Device Tree)
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转载 2015-07-24 18:25:54 · 607 阅读 · 0 评论 -
Printk打印优先级设定
# cat /proc/sys/kernel/printk7 4 1 7上面显示的4个数据分别对应:控制台日志级别:优先级高于该值的消息将被打印至控制台,数值越小,优先级越高。优先级定义见后。默认的消息日志级别:将用该优先级来打印没有优先级的消息,直接调用printk,未显示标注优先级的打印,如printk("xxxxxxxx");最低的控制台原创 2015-09-27 10:16:51 · 1577 阅读 · 0 评论 -
linux内核部件分析(三)——记录生命周期的kref
kref是一个引用计数器,它被嵌套进其它的结构中,记录所嵌套结构的引用计数,并在计数清零时调用相应的清理函数。kref的原理和实现都非常简单,但要想用好却不容易,或者说kref被创建就是为了跟踪复杂情况下地结构引用销毁情况。所以这里先介绍kref的实现,再介绍其使用规则。 kref的头文件在include/linux/kref.h,实现在lib/kref.c。闲话少说,上代码。转载 2015-11-04 15:28:05 · 483 阅读 · 0 评论 -
Linux IDR机制
IDR机制在Linux内核中指的是整数ID管理机制。实质上来讲,这就是一种将一个整数ID号和一个指针关联在一起的机制。这个机制最早在03年2月加入内核,当时作为POSIX定时器的一个补丁。现在,内核中很多地方都可以找到它的身影。 IDR机制原理:IDR机制适用在那些需要把某个整数和特定指针关联在一起的地方。例如,在IIC总线中,每个设备都有自己的地址,要想在总线上找到特定的设备转载 2015-11-04 17:05:45 · 830 阅读 · 0 评论 -
tasklet与workqueue区别
一、中断处理的tasklet(小任务)机制中断服务程序一般都是在中断请求关闭的条件下执行的,以避免嵌套而使中断控制复杂化。但是,中断是一个随机事件,它随时会到来,如果关中断的时间太长,CPU就不能及时响应其他的中断请求,从而造成中断的丢失。因此,Linux内核的目标就是尽可能快的处理完中断请求,尽其所能把更多的处理向后推迟。例如,假设一个数据块已经达到了网线,当中断控制器接受到这个中断请求转载 2014-11-19 10:59:39 · 7128 阅读 · 0 评论 -
Linux V4L2 框架
1、概述Video4Linux2是Linux内核中关于视频设备的内核驱动框架,为上层的访问底层的视频设备提供了统一的接口。凡是内核中的子系统都有抽象底层硬件的差异,为上层提供统一的接口和提取出公共代码避免代码冗余等好处。就像公司的老板一般都不会直接找底层的员工谈话,而是找部门经理了解情况,一个是因为底层屌丝人数多,意见各有不同,措辞也不准,部门经理会把情况汇总后再向上汇报;二个是老板时间宝转载 2014-11-18 14:43:34 · 944 阅读 · 0 评论 -
platform_set_drvdata/platform_get_drvdata
platform_set_drvdata(struct platform_device *pdev, void *data)platform_get_drvdata(const struct platform_device *pdev):驱动中常用到platform_set_drvdata 和 platform_get_drvdata这两个函数,用于保存局部变量:inc转载 2014-10-23 16:32:12 · 662 阅读 · 0 评论 -
Makefile选项CFLAGS,LDFLAGS,LIBS
CFLAGS 表示用于 C 编译器的选项,CXXFLAGS 表示用于 C++ 编译器的选项。这两个变量实际上涵盖了编译和汇编两个步骤。CFLAGS: 指定头文件(.h文件)的路径,如:CFLAGS=-I/usr/include -I/path/include。同样地,安装一个包时会在安装路径下建立一个include目录,当安装过程中出现问题时,试着把以前安装的包的include目录加入转载 2014-02-14 11:30:10 · 830 阅读 · 0 评论 -
Linux基本数据类型大小——int,char,long int,long long int
转自:http://blog.163.com/zheng_he_xiang/blog/static/186505326201110272018548/ 在Linux操作系统下使用GCC进行编程,目前一般的处理器为32位字宽,下面是/usr/include/limit.h文件对Linux下数据类型的限制及存储字节大小的说明。 /* We don't have #inc转载 2014-01-18 11:06:33 · 1306 阅读 · 0 评论 -
Export PATH环境变量
from:http://www.cnblogs.com/amboyna/archive/2008/03/08/1096024.html 在Linux里设置环境变量的方法(export PATH)一般来说,配置交叉编译工具链的时候需要指定编译工具的路径,此时就需要设置环境变量。例如我的mips-linux-gcc编译器在“/opt/au1200_rm/build_tools/bin”转载 2014-01-18 10:52:32 · 4311 阅读 · 0 评论 -
linux中mmap系统调用原理分析与实现
1、mmap系统调用(功能) void* mmap ( void * addr , size_t len , int prot , int flags ,int fd , off_t offset ) 内存映射函数mmap, 负责把文件内容映射到进程的虚拟内存空间, 通过对这段内存的读取和修改,来实现对文件的读取和修改,而不需要再调用read,write等操作。转载 2014-01-08 18:41:38 · 782 阅读 · 0 评论 -
基于linux-2.6.35的class_create(),device_create解析
从linux内核2.6的某个版本之后,devfs不复存在,udev成为devfs的替代。提醒一点,udev是应用层的,不要试图在内核的配置选项里找到它;加入对udev的支持很简单,以作者所写的一个字符设备驱动为例,在驱动初始化的代码里调用class_create为该设备创建一个class,再为每个设备调用device_create创建对应的设备。大致用法如下:struct class *myc转载 2013-12-30 15:26:02 · 675 阅读 · 0 评论 -
Linux 内核中的 cdev_alloc和cdev_add
内核中每个字符设备都对应一个 cdev 结构的变量,下面是它的定义:linux-2.6.22/include/linux/cdev.hstruct cdev {struct kobject kobj; // 每个 cdev 都是一个 kobjectstruct module *owner; // 指向实现驱动的模块const struct file转载 2013-12-30 15:24:53 · 562 阅读 · 0 评论 -
GNU-ld链接脚本浅析
0. Contents1. 概论2. 基本概念3. 脚本格式4. 简单例子5. 简单脚本命令6. 对符号的赋值7. SECTIONS命令8. MEMORY命令9. PHDRS命令10. VERSION命令11. 脚本内的表达式12. 暗含的连接脚本1. 概论每一个链接过程都由链接脚本(linker script, 一般转载 2013-12-12 16:34:45 · 687 阅读 · 0 评论 -
Linux workqueue 使用
Linux workqueue 1. 什么是workqueueLinux中的Workqueue机制就是为了简化内核线程的创建。通过调用workqueue的接口就能创建内核线程。并且可以根据当前系统CPU的个数创建线程的数量,使得线程处理的事务能够并行化。workqueue是内核中实现简单而有效的机制,他显然简化了内核daemon的转载 2014-09-26 15:03:26 · 2867 阅读 · 0 评论 -
ioremap mmap
内存资源分物理内存以及IO内存,IO内存即外部 几乎每一种外设都是通过读写设备上的寄存器来进行的,通常包括控制寄存器、状态寄存器和数据寄存器三大类,外设的寄存器通常被连续地编址。根据CPU体系结构的不同,CPU对IO端口的编址方式有两种: (1)I/O映射方式(I/O-mapped) 典型地,如X86处理器为外设专门实现了一个单独的地址空间,称为"I/O地址空间"或者"转载 2014-11-07 18:05:48 · 928 阅读 · 0 评论 -
Linux Platform总线
LINUX 在设备驱动程序中经常会见到和platform相关的字段,分布在驱动程序的多个角落,这也是2.6内核中比较重要的一种机制,把它的原理弄懂了,对以后分析驱动程序很有帮助,下面简单介绍一下: 在linux2.6设备模型中,关心总线,设备,驱动这三个实体,总线将设备和驱动绑定,在系统每注册一个设备的时候,会寻找与之匹配的驱动。相反,在系统每注册一个驱动的时候,寻找与转载 2014-11-07 17:34:23 · 484 阅读 · 0 评论 -
platform_driver_register调用probe
kernel_init中do_basic_setup()->driver_init()->platform_bus_init()->...初始化platform bus(虚拟总线)设备向内核注册的时候platform_device_register()->platform_device_add()->...内核把设备挂在虚拟的platform bus下驱动注册的时候platform_dri转载 2014-11-07 17:49:43 · 1425 阅读 · 0 评论 -
framebuffer 子系统解读
本文将介绍Framebuffer子系统目标平台:TQ2440 CPU:s3c2440LCD设备:3.5英寸,分辨率320X2401. 概述Framebuffer,中文名字是帧缓冲,这个帧也就是一副图像所需要的数据。因此,帧缓冲其实就是LCD设备的驱动程序。Linux中,framebuffer子系统框架如下:核心层的代码以fbmem.c为主,核心层包括许多与具体硬转载 2014-11-07 18:43:46 · 3557 阅读 · 0 评论 -
Opensource License
开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别以下是上述协议的简单介绍:BSD开源协议BSD开源协议是一个给于使用者很大自由的协议。基本上使用者可以”为所欲为”,可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。但”为所欲为”的前提当你发布使用了BSD协议的代码,或则以BSD协议代码为基础做二次开发自己的产品时,转载 2016-08-01 17:03:27 · 1207 阅读 · 0 评论