上一页 1 ··· 3 4 5 6 7 8 9 下一页
摘要: 看内核的时候发现很多东西都处于似懂非懂的状态,比如MMU、TLB,甚至各个寄存器的作用,今天就认真地学习一下这些东西。首先先来看CPU的寄存器: 32位CPU中有4个数据寄存器,分别是EAX,EBX,ECX和EDX。数据寄存器用来保存操作数和运算结果,从而节省读取操作数所需占用总线和访问存储器的时间。EAX通常称为累加器,用累加器进行的操作可能需要更少的时间。可用于乘、除、输入/输出操作,使用频率很高。EBX称为基地址寄存器,可作为存储器指针来使用。ECX称为计数寄存器,在循环和字符串操作时,要用它来控制循环次数。在位移操作中,如果位移多位时用CL来指明位数。EDX称为数据寄存器,在进行乘除运 阅读全文
posted @ 2011-08-13 20:25 GG大婶 阅读(1438) 评论(0) 推荐(1) 编辑
摘要: 用slab分配内存的不同方法的共同的入口是__cache_alloc():先用should_failslab初步判断是否可以完成分配(标志位可能是NOFAIL);调用__do_cache_alloc(cachep, flags, &this_cpu)来完成分配;调用cache_alloc_debugcheck_after(cachep, flags, objp, caller)进行分配后检查;prefetchw(objp)通过预取什么的来优化指令;return objp。程序的代码如下:static __always_inline void * __cache_alloc(struct 阅读全文
posted @ 2011-08-12 13:30 GG大婶 阅读(1624) 评论(0) 推荐(1) 编辑
摘要: 为什么要用slab分配器?程序运行的很多时候并不是去分配一下大的内存,比如task_struct这样的小的结构,如果用伙伴系统来管理者部分的内存分配就太慢了。还有在调用伙伴系统那个的时候对系统的数据和指令高速缓存有相当的影响(slab会减少对伙伴系统的调用)。如果数据存储在伙伴系统提供的页中,那么其地址总是出现在2的幂次的整数倍附近,这对高速缓存的利用有负面影响,这种分布使得部分缓存使用过度,而其他的则几乎为空。每个缓存都定义为一个kmem_cache结构(该结构在内核中的其他地方不可见因为是放在.c中的 =.=):struct kmem_cache { struct array_cache. 阅读全文
posted @ 2011-08-11 18:00 GG大婶 阅读(1590) 评论(0) 推荐(0) 编辑
摘要: 先看相关的变量的意思:enum km_type {D(0) KM_BOUNCE_READ,D(1) KM_SKB_SUNRPC_DATA,D(2) KM_SKB_DATA_SOFTIRQ,D(3) KM_USER0,D(4) KM_USER1,D(5) KM_BIO_SRC_IRQ,D(6) KM_BIO_DST_IRQ,D(7) KM_PTE0,D(8) KM_PTE1,D(9) KM_IRQ0,D(10) KM_IRQ1,D(11) KM_SOFTIRQ0,D(12) KM_SOFTIRQ1,D(13) KM_TYPE_NR};还有一个是:enum fixed_addresses { FI 阅读全文
posted @ 2011-08-10 14:39 GG大婶 阅读(556) 评论(0) 推荐(0) 编辑
摘要: 使用kmap函数将高端页帧长期映射到内核地址空间中:/* 参数page是要映射的页 */void *kmap(struct page *page){ /* 判断是不是高端内存 */ if (!PageHighMem(page)) return page_address(page); might_sleep(); /* 建立映射 */ return kmap_high(page);}page_address根据page返回对应的线性地址,这个函数就是区分处理了一下高端内存和非高端内存:/* 取得对应的线性地址 */void *page_address(struct page *page){ un 阅读全文
posted @ 2011-08-10 10:32 GG大婶 阅读(1150) 评论(0) 推荐(0) 编辑
摘要: 有时候虽然buddy system已经尽力去找了,但是仍旧找不到一大块内存时就要像用户进程一样使用处理器的分页机制了(虽然慢一点)。内核中“vmalloc”来分配在虚拟内存中连续但是物理内存中不一定连续的内存。管理这部分内存的结构为:/* 每个vmalloc分配的子区间都对应于内核内存中的一个vm_struct实例 */struct vm_struct { struct vm_struct *next; void *addr; /* 分配空间在虚拟地址中的起始地址 */ unsigned long size; /* 长度 */ unsigned long flags; /* 与给内存区关联的标 阅读全文
posted @ 2011-08-07 13:19 GG大婶 阅读(1464) 评论(0) 推荐(0) 编辑
摘要: 伙伴系统已经出现很长一段时间了,有了一些优化,看了一下,比想象中的复杂很多啊。 1 static void __init_refok alloc_node_mem_map(struct pglist_data *pgdat) 2 { 3 /* 如果这个节点没有page,那就直接跳过这个节点*/ 4 if (!pgdat->node_spanned_pages) 5 return; 6 7 #ifdef CONFIG_FLAT_NODE_MEM_MAP 8 /* 用node_mem_map这个page用来管理mem_map */ 9 if (!pgdat->node_mem_map) 阅读全文
posted @ 2011-08-05 12:52 GG大婶 阅读(2125) 评论(3) 推荐(0) 编辑
摘要: 为什么需要Paxos算法? Paxos算法是基于“消息传递”(另一种为“共享内存”)来解决一致性问题。eg:在一个分布式数据库系统中,如果各节点的初始状态一致,每个节点都执行相同的操作序列,那么他们最后得到一个一致性状态。为了保证每个序列都执行相同的操作序列,需要在每一条指令上执行一个“一致性算法”以保证每个节点看到的指令一致。比较囧的是我现在纠结的这个算法是别人30年前想出来的。Paxos的算法描述一般都是一个“Paxos”的小岛上通过决议的问题,该问题中包括三个角色(proposers、accepter、learners):value只有被proposers提出来之后才能被批准;在一次Pa 阅读全文
posted @ 2011-08-01 22:41 GG大婶 阅读(1768) 评论(4) 推荐(0) 编辑
摘要: 违例差错控制这个给程序的编写带来了很大的好处: 1 public class test { 2 public static void f() throws Exception { 3 System.out.println( 4 "originating the exception in f()"); 5 throw new Exception("thrown from f()"); 6 } 7 public static void g() throws Throwable { 8 try { 9 f();10 } catch(Exception e) { 阅读全文
posted @ 2011-08-01 14:49 GG大婶 阅读(307) 评论(0) 推荐(0) 编辑
摘要: bootmem分配器是系统初始化的时候用的内存分配器,用到的结构为: 30 typedef struct bootmem_data { 31 unsigned long node_boot_start; 32 unsigned long node_low_pfn; 33 void *node_bootmem_map; 34 unsigned long last_offset; 35 unsigned long last_pos; 36 unsigned long last_success; /* Previous allocation point. To speed 37 * up searc 阅读全文
posted @ 2011-07-31 23:47 GG大婶 阅读(1901) 评论(0) 推荐(1) 编辑
上一页 1 ··· 3 4 5 6 7 8 9 下一页