摘要:我们知道kmem_cache中对于每CPU都有一个array_cache,已作为每CPU申请内存的缓存. 此函数的目的在于:每个kmem_cache都有一个kmem_list3实例,该实例的shared作为一个kmem_cache上所有CPU的内存申请缓存. 但是在此之前,seup_cpu_cache中对于kmem_cache中array_cache的值初始化体现不出缓存思想,而且对于kmem_cache中的kmem_list3.shared也没有利用.kmem_cache_init_late的目的就在于完善slab分配器的缓存机制. start_kernel() |-->page_ad
阅读全文
摘要:是不是我错了,本想这个函数会如网上所说将进行非连续内存管理的初始化,但是对于2.6.34的ARM架构而言,该函数实际完成的业务非常少。内存管理的初始化读到此处,我感觉原有的认识存在很大缺陷:(1)内核空间的下限是3G吗?永久映射的PKMAP_BASE已在3G下;(2)低端内存是896M吗?2.6.32的omap4430的VMLLOC_END是1G - 128M,VMALLOC_MIN是1G - 128M -128M;(3)还存在固定映射吗?FIXADDR_SIZE的空间已被FIX_KMAP_BEGIN ~ FIXK_KMAP_END完全占据;(4)I/O空间在初始化已固定映射至VMALLOC_
阅读全文
摘要:看了下kmem_cache_init,涉及到不同MIGRATE间的buddy system的迁移,kmem_cache的构建,slab分配器头的构建、buddy system的伙伴拆分。对于SMP系统,每个kmem_cache还有各个CPU的arraycache_init,这样每个CPU可以从各自的arraycache_init中获取缓存,如果不足,则从slab分配器中获得;当让slab分配器的三条链表也有一定的缓存作用,如果三条链表都已空了,则需要从buddy system中申请页。在申请页的时候,由于每个zone中都有各个CPU的缓存页per_cpu_pages链表,因此在申请页时既可从p
阅读全文
摘要:mm_init中执行mem_init,将原通过bootmem分配器管理的低端内存 及 通过meminfo得知的高端内存释放到伙伴系统中,最后bootmem位图本身占用的低端内存物理页也被释放进伙伴系统,当然对于内核、初始页表、pkmap页表、struct page实例、ramdisk、percpu变量、dentry_hashtable、inode_hash_table已经被占用的区域不会被释放(对于内核开始的一段,后面会释放).start_kernel() ...
阅读全文
摘要:看到了mm_init(),期间将从bootmem迁移到伙伴系统,slab分配器也会建立。在分析mm_init()之前,把setup_arch(&command_line)之后的函数分析了以下,详见注释。start_kernel() |---->page_address_init() | 考虑支持高端内存 | 业务:初始化page_address_pool链表; ...
阅读全文
摘要:本地的笔记有点长,先把bootmem位图分配器的建立 及 使用过程做下梳理。都是代码,上面做了标注。开始的汇编部分省略了(涉及的内容不多,除了swapper_pg_dir的分配)。该记录不会再添加说明,看下记录中的注释就明白了bootmem的建立及使用。该记录中考虑了高端内存……从start_ker...
阅读全文
摘要:UMA计算机(uniform memory access)将可用内存以连续方式组织起来。SMP系统中每个处理器访问各个内存区都是同样快。NUMA计算机(non-uniform memory access)总是多处理计算机。系统的各个CPU都有本地内存,可支持特别快速的访问。各个处理器之间通过总线连接起来,以支持对其它CPU的本地内存的访问。对于SMP系统,每个处理器对内存区的访问速度都相同,因此NUMA下只有一个Node(UMA), 该Node拥有自己的mem_map数组,同时将这唯一的Node分成几个zone,每个zone再用独立的伙伴系统管理物理页面。page cache:读写文件时文件内
阅读全文
摘要:参考:1、《Professional Linux Kernel Architecture》1ed_CN p714~p760 2、http://blog.csdn.net/droidphone/article/details/7975694 3、2.6.34说明下,如果单纯以unicore...
阅读全文
摘要:参考:1、http://bbs.eyeler.com/thread-69-1-1.html 2、《Linxu Kernel Development》3ed_CN p166~p185 3、《Professional Linux Kernel Architecture》1ed_CN p71...
阅读全文
摘要:参考:2.6.34一个很奇怪的问题。没有查找到为什么 RCU_NEXT_SIZE的值为4的原因(包括Documentation),主要是在rcu_state中定义了一个四级的list,感到很有意思。我给出自己的解释。还是看下代码吧,容易解释:=========================================================引入nxtlist与 RCU_NEXT_RCU_DONE_TAILstatic void rcu_do_batch(struct rcu_state *rsp, struct rcu_data *rdp) ...
阅读全文
摘要:关于RCU的实现,考虑如下情形:1、非抢占式RCU2、限于嵌入式系统4核、每核单线程3、RCU_FANOUT = 32此时,RCU_TREE退化为单节点,如下,针对rcu_sched_state的使用做相关分析。本想从解析各个数据结构之间的关系入手,但是没有成功,因此首先读下内核代码:以下记录中以数组形式表示rcu_data,但是注意这是per-CPU变量,实际并非数组。系统完成初始化后(rcu_init)的情形如下:struct rcu_state rcu_sched_state = { .node[0] = { .gpnum = 0, .qsmak...
阅读全文
摘要:参考自:http://blog.csdn.net/junguo/article/details/8244530 Documentation/RCU/*TREE_RCU将所有的CPU组织成一颗树,通过层次结构来判别进程是否通过了宽限期,这种方式适用于多个CPU的系统 TINY_RCU适用于单个CPU,尤其是嵌入式操作系统。RCU实现的关键集中在宽限期的处理上,这个过程需要保证销毁对象前,当前系统中所有CPU上运行的进程都通过了静止状态(quiescent state)。 1, 程序调用call_rcu_sched,将要删除的对象保存起来。并标记或者开始一个宽限期(同一时间只能运行一个宽限期,所以
阅读全文
摘要:该记录着重介绍下:2.6.34版本中非抢占式RCU的基本概念。RCU保护的是指针,因为指针的赋值可以使用原子操作完成;在非抢占式RCU中:对于读者,RCU仅需要抢占失效,因此获得读锁和释放读锁分别定义为:对于非抢占式RCU,在操作读取数据的过程中不允许进程切换,否则因为写者需要等待读者完成,写者进程...
阅读全文
摘要:参考:http://blog.csdn.net/universus/article/details/5623971 http://blog.csdn.net/chenyu105/article/details/7726492 《Linux Kernel Development》 3ed_CN p159 2.6.34 锁保护的是数据,在程序路径中访问数据,确保数据被访问的惟一性,就必须保证只有一个线程正在位于相应的程序路径。 大内核锁也是一种锁,问题在于其锁的粒度太粗,当有大量不同的数据在一个程序路径中被访问时,若能保证只有一个线程位于该程序路径,则可以保证数据正在被访问的惟一性。大内核锁的..
阅读全文
摘要:内容比较简单,主要是自己看书时对一些知识点所存在的误区,留此记录,方便理解。《Linux Kernel Development》3ed_CN p107-p130下半部和推后执行的工作:中断线程、定时器、工作队列、tasklet、软中断内核中只有一个软中断数组: static struct softirq_action softirq_vec[NR_SOFTIRQS];每个核都有自己的softirq_pending标志位:irq_cpustat_t irq_stat[NR_CPUS]; typedef struct { unsigned int __softirq_pe...
阅读全文
摘要:参考:《Linux Kernel Development》3ed_CN p-149 扩展如下内容中没有涉及读写自旋锁,尝试锁的获取等,只包含一般情形;如下是我的总结,如有误,请指出:自旋锁在不同情况下的选择: 1、进程上下文与进程上下文之间: spin_lock()2、进程上下文与中断上半部之间: spin_lock_irqsave() or spin_lock_irq()3、进程上下文与中断下半部之间: spin_lock_bh()4、中断上半部与中断上半部之间: spin_lock_irqsave() or spin_lock_irq()5、中断上半部与中断下半部之间: spin_lock
阅读全文
摘要:参考:1、《Linux Kernel Development》3ed_CN p131-p140 2、2.6.34单核://锁的数据类型实现typedef struct { } arch_spinlock_t;typedef struct raw_spinlock { arch_spinlock_t raw_lock;}raw_spinlock_t;typedef struct spinlock { union { struct raw_spinlock rlock; }; //以我对C的了解,这种定义方式还是第一次见到(以前见到,也没留意过),这个union的联...
阅读全文
摘要:参考:2.6.34看了下2.6.34中的中断线程,但是在《内核设计与实现》3ed_CN的p_90~p_130内并未提起中断线程,因此做下记录,其中关于kthread_create函数已在“工作队列”笔记中做了说明。通常通过request_irq申请中断资源时并未注册中断线程处理函数,可以通过request_threaded_irq来注册中断线程处理函数。注册中断线程处理函数:int request_threaded_irq(unsigned int irq, irq_handler_t handler, ...
阅读全文
摘要:参考:1、http://blog.csdn.net/droidphone/article/details/7518428 2、http://blog.csdn.net/lizhiguo0532/article/details/6533443 3、《内核设计与实现》 4、2.6.34首先,看下默认工作队列keventd_wq和管理调度其它内核线程(当然也包含工作线程)时需要的kthreadd线程的创建过程;start_kernel()---->rest_init() |---->kernel_thread(kernel_init, NULL, CLONE_FS ...
阅读全文
摘要:中断共享: 和别人讨论的时候,谈到了中断共享,下面记录下几种不同的情况:1、一个IP模块中只有一个中断引脚连接到中断控制器,该IP模块中只有一个部件可以产生中断请求;2、一个IP模块中只有一个中断引脚连接到中断控制器,该IP模块中有多个部件可以产生中断请求;3、多个IP模块的中断引脚通过电路设计(例如:数字电路中的线与逻辑电路)连接到中断控制器的一个引脚,该中断引脚上对应着多个IP模块的的中断请求。第一种情形,谈不上中断共享;第二种情形,这个不好定义,因为(1)可以只有一个中断函数、在中断函数内部判定是何种原因导致了该IP模块产生中断(一般都这样);(2)可以为每种导致该IP模块产生中断的情形
阅读全文