Linux内核
文章平均质量分 59
红尘-有梦
做一个简单的人,平和而执着,谦虚而无畏。
展开
-
sysfs_create_file示例一
#include #include #include #include #include static int hello_value;static ssize_t hello_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf){ return sprintf(buf, "%d\n转载 2013-04-24 14:27:38 · 4182 阅读 · 0 评论 -
Linux Slub分配器(二)--初始化 .
水平有限,描述不当之处还请之处,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7695264 和slab分配器一样,分配器的初始化工作主要是初始化用于kmalloc的gerneral cache,Slub分配器的gerneral cache定义如下:[cpp] view plaincopyprint转载 2014-06-11 11:05:39 · 504 阅读 · 0 评论 -
Linux Slub分配器(三)--创建缓存
水平有限,描述不当之处还请之处,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7700338 Slub分配器创建缓存的过程和Slab差不多,主要的区别在于Slub分配器并不是直接创建一个新的缓存,而是先试图在已有的缓存中找到一个各方面属性和待创建缓存差不多的缓存,如果能找到的话则不会去创建新缓存,而是复用转载 2014-06-11 11:10:29 · 593 阅读 · 0 评论 -
Linux Slub分配器(七)--销毁缓存
水平有限,描述不当之处还请之处,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7703147 Slub分配器在销毁缓存时,必须得考虑缓存的引用计数是否为0,因为在Slub分配器中,缓存可以被多种对象复用,因此必须当所有种类的对象都同意销毁缓存才能执行销毁工作。[cpp] view plaincop转载 2014-06-11 11:19:33 · 400 阅读 · 0 评论 -
Linux Slob分配器(一)--概述
水平有限,描述不当之处还请指出,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7705202 Slob分配器相较Slab和Slub分配器而言,最大的特点就是简洁,其总共的实现代码大概就600多行,因此其适用于嵌入式系统。不同于Slab和Slub,Slob分配器没有引入本地CPU高速缓存和本地节点的概念。Slob分配器同样使转载 2014-06-11 11:22:00 · 599 阅读 · 0 评论 -
第一个Linux驱动-流水灯 .
水平有限,描述不当之处请指出,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7711695 本节介绍如何利用板载的Led和Linux的内核定时器实现一个简单的流水灯的驱动,所使用的开发板是TQ2440,内核版本2.6.30.4。 程序比较简单,也没涉及到什么机制,直接上代码了!转载 2014-06-11 13:22:47 · 629 阅读 · 0 评论 -
从硬件的系统结构开始 .
我们的电脑主机上都有两个标准化的部分:北桥和南桥。它们是CPU和内存以及其他外设沟通的渠道。下图给出了CPU,内存,南北桥以及其他总线之间的关系。 我们可以看到,所有的CPU都共用一条FSB总线(the Front Side Bus),与北桥相连。而北桥中有一个内存控制器(memory controller),它决定了RAM的类型,换句话说,不同的R转载 2014-06-11 13:29:09 · 502 阅读 · 0 评论 -
Linux Slub分配器(四)--分配对象
水平有限,描述不当之处还请之处,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7700482 对象的分配过程体现了内存管理器对内存对象的组织方式,相较Slab分配器,Slub在组织对象的方式上给人的感觉就是简洁精悍。Slub没有用任何的管理区数组来组织这些对象,而是巧妙的将对象之间联系的桥梁嵌入在对象自身之中,因转载 2014-06-11 11:15:00 · 516 阅读 · 0 评论 -
Linux Slob分配器(二)--分配对象
each 水平有限,描述不当之处还请指出,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7705559 上节介绍了Slob分配器的相关概念和思想,这节来看Slob分配器是如何分配对象的。kmem_cache_alloc_node()函数用来分配一个专用缓存的对象: [cpp]转载 2014-06-11 11:24:15 · 580 阅读 · 0 评论 -
Linux Slub分配器(六)--slab的分配与释放
水平有限,描述不当之处还请之处,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7702677 创建新的slab主要有两个工作,一个是从伙伴系统分配2^order个连续页框给该slab,然后就是划分slab中的对象。函数new_slab()用来创建一个新的slab. [cpp] v转载 2014-06-11 11:18:28 · 592 阅读 · 0 评论 -
Linux Slub分配器(五)--释放对象 .
水平有限,描述不当之处还请之处,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7701910 释放对象和分配对象是一组对称的操作,同样分为两个路径:1.如果待释放的对象所属的slab位于本地CPU缓存中,也就是slab处于冻结状态,则可直接释放2.反之,待释放的对象所属的slab位于slab链表中,转载 2014-06-11 11:16:08 · 447 阅读 · 0 评论 -
Linux Slob分配器(三)--释放对象
水平有限,描述不当之处还请指出,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7705792slob释放对象由函数slob_free()来完成,分为三种情况进行处理:slob中已有的空闲单元加上释放对象块的空闲单元正好等于一个空闲的page,那么将直接将该page释放回伙伴系统slob中已无空闲单元,那么这转载 2014-06-11 11:25:30 · 437 阅读 · 0 评论 -
Linux SLUB 分配器详解
简介: 多年以来,Linux 内核使用一种称为 SLAB 的内核对象缓冲区分配器。但是,随着系统规模的不断增大,SLAB 逐渐暴露出自身的诸多不足。SLUB 是 Linux 内核 2.6.22 版本中引入的一种新型分配器,它具有设计简单、代码精简、额外内存占用率小、扩展性高,性能优秀、方便调试等特点。本文先介绍 SLAB 分配器的基本原理,然后分析其不足之处并详细介绍 SLUB 的设计思想,最后介转载 2014-06-11 09:40:09 · 432 阅读 · 0 评论 -
kobject和kset
一、kobjectkobject是linux内核做的一个抽象,它本身不具备实际的含义。它被嵌入到各种数据结构中,因而只要我们具有kobject就可以获取并访问它所嵌入的宿主数据结构。这样就提供了良好的组织管理能力。宿主数据结构可以千变万化,但是其嵌入的kobject很简单,可以基于该结构做很多通用的事情。sysfs就是利用这一点实现的。该文件系统以很简单的方式实现了对内核中各种复杂部件(尤其是转载 2014-06-12 13:29:24 · 445 阅读 · 0 评论 -
linux内核内存管理学习之一(基本概念,分页及初始化)
[+]一概述虚拟地址空间物理地址到虚拟地址的映射内存类型二内存组织基本概念和相关数据结构阈值计算Zone等待队列表冷热页页Page页概念映射页面到zone三页表页表机制x86架构中的页地址空间分段分段机制linux中的段四内存管理初始化初始化流程初始化代码流程节点和zone的初始化特定于转载 2014-06-12 13:44:01 · 963 阅读 · 0 评论 -
linux内核内存管理学习之三(slab分配器)
一、内核内存分配在linux内核中伙伴系统用来管理物理内存,其分配的单位是页,但是向用户程序一样,内核也需要动态分配内存,而伙伴系统分配的粒度又太大。由于内核无法借助标准的C库,因而需要别的手段来实现内核中动态内存的分配管理,linux采用的是slab分配器。slab分配器不仅可以提供动态内存的管理功能,而且可以作为经常分配并释放的内存的缓存。通过slab缓存,内核能够储备一些对象,供后续使用转载 2014-06-12 13:49:00 · 579 阅读 · 0 评论 -
linux内核常用头文件
1、原创 2014-07-02 14:30:41 · 572 阅读 · 0 评论 -
linux内核内存管理学习之二(物理内存管理--伙伴系统)
linux使用伙伴系统来管理物理内存页。一、伙伴系统原理1. 伙伴关系定义:由一个母实体分成的两个各方面属性一致的两个子实体,这两个子实体就处于伙伴关系。在操作系统分配内存的过程中,一个内存块常常被分成两个大小相等的内存块,这两个大小相等的内存块就处于伙伴关系。它满足 3 个条件 : 两个块具有相同大小记为 2^K 它们的物理地址是连续的 从同一个大块中拆分出来2. 伙转载 2014-06-12 13:47:16 · 842 阅读 · 0 评论 -
Linux Slub分配器(一)--概述
水平有限,描述不当之处还请之处,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7694648 Slab分配器一直处于内核内存管理的核心地位,尽管如此,它还是拥有自身的缺点,最明显的两点就是复杂性和过多的管理数据造成的内存上的开销。针对这些问题,linux引入了slub分配器,slub分配器保留了slab分配器的所转载 2014-06-11 11:03:22 · 464 阅读 · 0 评论 -
按键驱动程序设计笔记
buttonstructfilemodulecdelay[cpp] view plaincopyprint?/*本来友善的程序是检测上升沿和下降沿的, 当按下按键,输出 KEY? down 当弹下按键,输出 KEY? up 现在修改成只检测下降沿按下的 */ #include /*模块有关的*/ #include /*内核有关的*/转载 2014-06-06 13:19:29 · 500 阅读 · 0 评论 -
linux驱动学习之异步通知 .
异步通知是设备状态改变后主动通知应用程序,这样应用程序就不需要阻塞或查询设备了。应用通过信号来处理内核的异步通知,上次使用poll select来查询设备的可读状态,下面这个例子类似,不同的是当设备有数据时主动通知应用去读数据。 应用的C代码很简单,主要设置对信号的处理方式,内核有数据时会收到SIGIO信号,应用会自动调用signal设置的函数去读数据。 main.c#i转载 2014-06-06 13:10:42 · 362 阅读 · 0 评论 -
DEVICE_ATTR
#define DEVICE_ATTR(_name, _mode, _show, _store) \struct device_attribute dev_attr_##_name = _ATTR(_name, _mode, _show, _stroe);宏DEVICE_ATTR内封装的是_ATTR(_name, _mode, _show, _store)方法。_name :名字原创 2013-04-23 10:52:35 · 490 阅读 · 0 评论 -
sysfs_create_greap示例二
1、定义数据结构 static struct hw_ps_plat_data platform_data = { .dev_name = "/dev/ttyAMA4", .flow_cntrl = 1, .baud_rate = 115200, .ldisc_install = 0, }; static struct原创 2013-04-22 15:28:10 · 970 阅读 · 0 评论 -
linux tty 之注册一个线路规程
在tty程序中注册一个线路规程驱动是一件很轻松的事情。1、编写线路规程驱动函数 我们知道tty线路规程的操作函数集为struct tty_ldisc_ops。我们要做的第一件事情便是实现这个操作函数集。例如: static struct tty_ldisc_ops ps_ldisc_ops = { .magic =原创 2013-04-03 11:45:46 · 2408 阅读 · 0 评论 -
linux 工作队列之queue_delayed_work
1、定义数据结构 struct delayed_work work; struct workqueue_struct *wq;2、编写要被提交到工作队列中的函数,函数原形如下: typedef void(*work_func_t)(struct work_struct *work);3、创建一个专用的内核线程来执行提交到工作队列中的原创 2013-03-26 10:08:22 · 2923 阅读 · 0 评论 -
linux 工作队列之schedule_work
在许多情况下,设备驱动程序不需要有自己的工作队列。如果我们只是偶尔需要向队列中提交任务,则一种更简单、更有效的办法是使用内核提供的共享的默认工作队列。但是,如果我们使用了这个默认的工作队列,则应该记住我们正在和他人共享该工作队列。这意味着,我们不应该长期独占该队列,即:不能长时间休眠,而且我们的任务可能需要更长的时间才能获得处理器。 一、schedule使用步骤原创 2013-03-25 11:08:59 · 3724 阅读 · 0 评论 -
linux tty 之操作函数集
我们知道,tty驱动分为3层:tty内核层、tty线路规程层、tty驱动层。 tty内核层函数操作集为:struct file_opertaions; //在tty_io.c中,已由内核实现 tty线路规程层函数操作集为:struct tty_ldisc_ops; //需要我们来实现 tty驱动层函数操作集为:struct t原创 2013-04-03 11:02:15 · 1614 阅读 · 0 评论 -
linux 工作队列之queue_work
1、定时数据结构 struct work_struct work; struct workqueue_struct *wq;2、编写要在工作队列中被调用的函数,函数原形如下: typedef void (*work_func_t)(struct work_struct *work);3、创建一个专用的内核线程来执行提交到工作队列中的函数原创 2013-03-26 09:47:45 · 9380 阅读 · 0 评论 -
linux 工作队列之schedule_delayed_work
一、 schedule_delay_work 示例: struct wdt_t { spinlock_t lock; void __iomem *base; struct pl原创 2013-03-25 16:34:21 · 5715 阅读 · 0 评论 -
linux tasklet
一、使用tasklet步骤1、定义tasklet数据结构 strcut tasklet_struct my_tasklet; unsigned long data = 0;2、编写自己的tasklet处理函数,函数原形如下: void tasklet_handler(unsigned long data);3、初始化tasklet数原创 2013-03-27 10:26:07 · 505 阅读 · 0 评论 -
linux 工作队列之API
自2.6.20起,工作队列的数据结构发生了一些变化,使用时不能沿用旧的方法。1、在工作队列中被调用的函数原形如下: typedef void (*work_func_t)(struct work_struct *work);2、定义了一个新的结构delayed_work用于处理延迟执行:struct delayed_work { struct w原创 2013-03-25 09:24:33 · 583 阅读 · 0 评论 -
linux tty 之分层结构
tty驱动在linux中的分层结构: 如图所示,tty驱动程序分为三层。第一层是内核层(tty_core),主要代码由内核代码实现在tty_io.c中;第二层为线路规程层(line_discipline),开发者可以自己注册并实现一个线路规程驱动;第三层为驱动层(tty_driver),这一层主要由内核实现在serial_core.c中。 这里的原创 2013-04-02 10:39:47 · 1421 阅读 · 0 评论 -
自旋锁(spinlock) 解释得经典,透彻
获得自旋锁和释放自旋锁有好几个版本,因此让读者知道在什么样的情况下使用什么版本的获得和释放锁的宏是非常必要的。 如果被保护的共享资源只在进程上下文访问和软中断上下文访问,那么当在进程上下文访问共享资源时,可能被软中断打断,从而可能进入软中断上下文来对被保护的共享资源访问,因此对于这种情况,对共享资源的访问必须使用spin_lock_bh和spin_unlock_bh来保护。 当转载 2013-06-13 15:15:14 · 766 阅读 · 0 评论 -
tty驱动程序之线路规程open函数调用路径
在看tty_io.c文件中的tty_open()函数时,发现有这么一行代码:if (tty->ops->open) retval = tty->ops->open(tty, filp);else return -ENODEV; 这说明,在打开tty设备时,tty内核层的open()函数调用了tty驱动层的open()函数。那么,线路规程层的open()函原创 2013-06-09 16:36:11 · 1657 阅读 · 0 评论 -
container_of()宏
在学习linux驱动的过程中,遇到一个宏叫做container_of.该宏定义在include/linux/kernel.h中。container_of()作用显而易见,就是根据一个结构体变量中的一个域成员变量的指针来获取指向整个结构体变量的指针。比如,有一个结构体变量,其定义如下:struct demo_struct { type1 member1; ty转载 2013-04-24 15:29:21 · 594 阅读 · 0 评论 -
sysfs_create_group 示例一
#include #include #include #include static int foo;static ssize_t foo_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf){ return sprintf(buf, "%d\n", foo);}static原创 2013-04-23 11:37:35 · 2733 阅读 · 0 评论 -
linux tasklet 数据结构解析
一、struct tasklet_struct 每个tasklet_struct 结构代表tasklet链表中的一个独立的小任务。其定义如下: struct tasklet_struct { struct tasklet_struct *next; /* 指向链表中的下一个tasklet原创 2013-03-27 10:47:50 · 633 阅读 · 0 评论 -
sysfs_notify()
void sysfs_notify(struct kobject *kobj, const char *dir, const char *attr);void sysfs_notify_dirent(struct sysfs_dirent *sd);sysfs_notify()和sysfs_notify_dirent()都是用来唤醒在读写属性文件(sysfs节点)时因调用select()或原创 2013-04-26 11:16:08 · 8258 阅读 · 1 评论 -
Linux伙伴系统(一)--伙伴系统的概述 .
[+]水平有限描述不当之处还请指出转载请注明出处httpblogcsdnnetvanbreakerarticledetails7605367伙伴系统的概述什么是伙伴系统相关的数据结构水平有限,描述不当之处还请指出,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7605367 伙伴系统的概述转载 2014-06-12 13:24:09 · 546 阅读 · 0 评论