linux内核
文章平均质量分 83
zhoujiaxq
这个作者很懒,什么都没留下…
展开
-
永久地址映射
首先要看几个重要的数据结构和概念: #ifdef CONFIG_X86_PAE#define LAST_PKMAP 512#else#define LAST_PKMAP 1024 #define LAST_PKMAP_MASK (LAST_PKMAP - 1)#endif定义了永久地址映射的,页表的数量,从这里我们也可以知道,永久转载 2012-07-10 11:08:54 · 19177 阅读 · 0 评论 -
linux中的定时器
在 Linux 内核中主要有两种类型的定时器。一类称为 timeout 类型,另一类称为 timer 类型。timeout 类型的定时器通常用于检测各种错误条件,例如用于检测网卡收发数据包是否会超时的定时器,IO 设备的读写是否会超时的定时器等等。通常情况下这些错误很少发生,因此,使用 timeout 类型的定时器一般在超时之前就会被移除,从而很少产生真正的函数调用和系统开销。总的来说,使用 ti转载 2014-04-22 15:33:53 · 692 阅读 · 0 评论 -
更强的链表klist
前面我们说到过list_head,这是linux中通用的链表形式,双向循环链表,功能强大,实现简单优雅。可如果您认为list_head就是链表的极致,应该在linux链表界一统天下,那可就错了。据我所知,linux内核代码中至少还有两种链表能占有一席之地。一种就是hlist,一种就是本节要介绍的klist。虽然三者不同,但hlist和klist都可以看成是从list_head中发展出来的,用于特殊转载 2012-08-02 11:40:19 · 662 阅读 · 0 评论 -
platform_device_系列函数及其设备注册的作用
platform_device_系列函数,实际上是注册了一个叫platform的虚拟总线。使用约定是如果一个不属于任何总线的设备,例如蓝牙,串口等设备,都需要挂在这个虚拟总线上。driver/base/platform.c//platform设备声明struct device platform_bus = { .bus_id = "platform",转载 2012-08-02 10:15:06 · 811 阅读 · 0 评论 -
命令行参数解析函数getopt_long()
文件 #include 函数原型 int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);函数说明 getopt被用来解析命令行选项参数。 getopt_lo原创 2012-08-07 15:16:57 · 897 阅读 · 0 评论 -
Initial RAM disk(initrd)
RAM disk是存在于内存中的虚拟磁盘,也就是将RAM拿来当成磁盘使用。在Embedded Linux的应用中,我们通常会将ramdisk当成暂存目录来使用。例如将/dev/ram1附挂到/tmp目录,以便能让应用程序存放暂时性档案。/dev/ram?为ramdisk的device file。由于整个root filesystem是从真正的储存装置读取并加载至ramdisk,因此有1个重要的特性转载 2012-07-17 11:06:06 · 1172 阅读 · 0 评论 -
Linux内存管理之高端内存映射
一:引子我们在前面分析过,在linux内存管理中,内核使用3G—>4G的地址空间,总共1G的大小。而且有一部份用来做非连续空间的物理映射(vmalloc).除掉这部份空间之外,只留下896M大小供内核映射到物理地址。通常,我们把物理地址超过896M的区域称为高端内存。内核怎样去管理高端内存呢?今天就来分析这个问题。内核有三种方式管理高端内存。第一种是非连续映射。这我们在前面的vmalloc转载 2012-07-16 16:07:16 · 1723 阅读 · 0 评论 -
浅析armlinux-paging_init()->free_area_init_core()函数
//---------------------------------------- //1.mm/Numa.c->free_area_init_node() void __init free_area_init_node(int nid, pg_data_t *pgdat, struct page *pmap, unsigned long *zones_size,转载 2012-07-16 22:08:15 · 2552 阅读 · 0 评论 -
页面管理机制的初步建立
为了对页面管理机制作出初步准备,Linux使用了一种叫bootmem分配器(bootmem allocator)的机制,这种机制仅仅用在系统引导时,它为整个物理内存建立起一个页面位图。这个位图建立在从start_pfn开始的地方,也就是说,内核映象终点_end上方的地方。这个位图用来管理低区(例如小于896MB),因为在0到896MB的范围内,有些页面可能保留,有些页面可能有空洞,因此,建立这个位转载 2012-07-13 16:43:43 · 675 阅读 · 0 评论 -
由mmap引发的SIGBUS
一直以来都觉得使用mmap读文件是非常高效、非常优雅的做法(参见《从"read"看系统调用的耗时》)。mmap之后,就可以通过内存访问的方式访问到文件里的内容,省去了read这样的系统调用。却不曾想过,mmap以后,如果读文件出错会发生什么……今晚看到一篇介绍apache bug的文章,里面说到,apache使用mmap来实现对静态文件的访问。在读文件之前,apache使用stat系统转载 2012-07-11 13:47:44 · 2447 阅读 · 1 评论 -
preempt_disable
#define preempt_disable() / do { / inc_preempt_count(); / barrier(); / } while (0) 实现很简单,就两行代码,第一行把进程描述符中的preempt_count加1,第二行加一个优化屏障。展开inc_preempt_count()后就是: current->thre转载 2012-07-11 21:15:51 · 1565 阅读 · 1 评论 -
Linux内核—— 必要的编译知识include/linux/compile.h
所有的内核代码,基本都包含了include/linux/compile.h这个文件,所以它是基础,涵盖了分析内核所需要的一些列编译知识,本博就分析分析这个文件里的代码:#ifndef __LINUX_COMPILER_H#define __LINUX_COMPILER_H#ifndef __ASSEMBLY__首先印入眼帘的是对__ASSEMBLY__这个宏的判断,这个转载 2014-04-23 10:25:56 · 4769 阅读 · 0 评论