看understanding linux kernel的一点笔记:
页表
通常32位cpu使用2级页表机制就已足够,但到64位时代,2级页表会使页表的项急剧增加,所以通常会使用更多的页表级数。
ia64/ppc64/alpha使用3级页表,x86_64使用到4级页表。为兼容这些模型,2.6.11之后使用了统一的4级页表模型
Global Directory
Upper Directory
Middle Directory
Page Table
针对不同的架构,设置每一级不同的地址位数,0的话就是不使用这一级页表机制。
cache
多cpu环境中,每个cpu有自己的cache,对cache的更新有硬件机制保证通知其他的cpu进行同步。(真的吗?)
tlb
用来cache页表,加速地址的转换速度。每个cpu有自己的tlb,但不需要同步,因为地址转换和进程相关。
posted @
2008-11-01 08:27 白色天堂 阅读(137) |
评论 (0) |
编辑 收藏
LinuxThreads:
旧的pthread实现,基于process实现pthread。主要问题是signal不符合规范,stack size固定???
NPTL:
2.6后加入的新实现,redhat as中2.4就可以支持。更符合pthread的规范。用户线程和内核线程采取1:1模式,支持floating stack。
posted @
2008-09-09 22:56 白色天堂 阅读(189) |
评论 (0) |
编辑 收藏
今天花了一点时间作了个x86上hotspot vm的disassembler,这样可以看出jvm生成的本地代码了。
代码比较简单,主要是用了udis86的库,这个可以在sf上下载到,它的接口还是比较简单的。
简单的例子,hotspot解析模式中iconst_0的对应汇编代码:
iconst_0 3 iconst_0 [0xb4d98120, 0xb4d98160] 64 bytes
0xb4d98120: sub esp, 0x4
0xb4d98123: fstp dword [esp]
0xb4d98126: jmp 0x1e
0xb4d9812b: sub esp, 0x8
0xb4d9812e: fstp qword [esp]
0xb4d98131: jmp 0x13
0xb4d98136: push edx
0xb4d98137: push eax
0xb4d98138: jmp 0xc
0xb4d9813d: push eax
0xb4d9813e: jmp 0x6
0xb4d98143: push eax
0xb4d98144: xor eax, eax
0xb4d98146: movzx ebx, byte [esi+0x1]
0xb4d9814a: inc esi
0xb4d9814b: jmp dword near [ebx*4+0x6900680]
posted @
2008-08-24 00:28 白色天堂 阅读(178) |
评论 (0) |
编辑 收藏