摘要:mm_init中执行mem_init,将原通过bootmem分配器管理的低端内存 及 通过meminfo得知的高端内存释放到伙伴系统中,最后bootmem位图本身占用的低端内存物理页也被释放进伙伴系统,当然对于内核、初始页表、pkmap页表、struct page实例、ramdisk、percpu变量、dentry_hashtable、inode_hash_table已经被占用的区域不会被释放(对于内核开始的一段,后面会释放).start_kernel() ...
阅读全文
摘要:一个很简单的问题://为什么BASE::foo()中可以直接通过p访问val? 看本记录标题,这个问题困扰了很长一段时间,终于解决class BASE{ private: int val; public:void foo(BASE *p) { int w = p->val; } };同学参加一场笔试,抛出个问题,丫凡和我讨论了下,丫凡在stackoverflow上找到了答案……如下内容引述自:http://stackoverflow.com/questions/6986798/subtle-c-inheritance-error...
阅读全文
摘要:迄今只参加了M南京笔试,可惜自己不是计算机出身,还有好多东西得学啊……M的最后一题是编程:输入:单链表L0、L1、L2……Ln-1、Ln,将链表变为:L0、Ln、L1、Ln-1、L2……算法:1、将链表分成前后两个部分: 前一个链表长度 >= 后一链表长度; 简单2、反转后一个链表; 简单3、合并两个链表; 简单4、调用以上接口; gameover算法实现:typedef struct Node Node_t;Node_t *list_half(Node_t *head){ Node_t *rv = NULL; Node_t *start = he...
阅读全文
摘要:看到了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...
阅读全文
摘要:内核初始化时根据字符串匹配获得相应的处理函数,查找的时候有些麻烦。写个脚本对将内核中的__setup和early_param显式做了解析:__setup#! /bin/bash grep '\' ./ -rn --include='*.c' | awk 'BEGIN{FS=":"}{$1="";$2="";print $0}' | grep '^ *__setup' | sed -n -e '...
阅读全文
摘要:因为不善于在Makefile中调用shell的相关工具,所以关于asm-offsets.h中的产生的16进制数并不知如何做到。因此自己写了个脚本,可以生成同样的文件(再次造了轮子)。参考:https://lkml.org/lkml/2001/10/6/3#脚本offset.awk1 /^->$/{printf("\n");next} 2 /^->.*/{sym = $1; val = $2; $1 = ""; $2 =...
阅读全文
摘要: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...
阅读全文
摘要:内核中用的很多,整理时间子系统的时候又遇到了notification mechanism,因此做次记录:参考:1、http://msdn.microsoft.com/en-us/library/ff649664.aspx 2、http://blog.csdn.net/lovelion/article/details/7720232 3、2.6.34 观察者(Observer)模式是对象的行为型模式,又叫做发表-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-收听者(Source/Listener)模式或从属者(Dependents)模式。 当某件..
阅读全文
摘要:参考: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
阅读全文
摘要:问题:gcc编译器本身预定义了一些宏(通过 gcc -dM -E -xc /dev/null 可以看到),但是有些宏定义为空。程序中需要根据(1)预定义中是否定义了该宏;(2)该预定义宏是否为空;从而执行不同的程序路径。我给出自己的解法,可能不太好,但这是我所能想到的。(尝试下使用宏粘贴“##”来解...
阅读全文
摘要:参考: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的联...
阅读全文
摘要:用着中端,显示磁盘空间不足,因此写了这个脚本,统计各个用户所用磁盘空间大小。将该文件放在179的/home目录下,进行执行,在/home目录下将生成4_25.txt文件。注:总空间1T, 可以用 “ df "命令统计磁盘总空间大小。file: x.sh usage: sudo ./x.sh#! /bin/shtmpfilename=/tmp/4.txtstorefilename=4_25.txtleftspace=0rm -f ${tmpfilename} rm -f ${storefilename} for user in `ls -l | awk '/^d/{print
阅读全文
摘要:参考: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 ...
阅读全文