mm.txt
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:8k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. The paging design used on the x86-64 linux kernel port in 2.4.x provides:
  2. o per process virtual address space limit of 512 Gigabytes
  3. o top of userspace stack located at address 0x0000007fffffffff
  4. o PAGE_OFFSET = 0xffff800000000000
  5. o start of the kernel mapping =  0x0000010000000000
  6. o global RAM per system 508*512GB=254 Terabytes
  7. o no need of any common code change
  8. o       512GB of vmalloc/ioremap space
  9. Description:
  10.         x86-64 has a 4 level page structure, similar to ia32 PSE but with
  11.         some extensions. Each level consits of a 4K page with 512 64bit
  12.         entries. The levels are named in Linux PML4, PGD, PMD, PTE; AMD calls them
  13.         PML4E, PDPE, PDE, PTE respectively. For direct and kernel mapping
  14.         only 3 levels are used with the PMD pointing to 2MB pages.
  15.           
  16. Userspace is able to modify and it sees only the 3rd/2nd/1st level
  17. pagetables (pgd_offset() implicitly walks the 1st slot of the 4th
  18. level pagetable and it returns an entry into the 3rd level pagetable).
  19. This is where the per-process 512 Gigabytes limit cames from.
  20. The common code pgd is the PDPE, the pmd is the PDE, the
  21. pte is the PTE. The PML4 remains invisible to the common
  22. code.
  23. Since the per-process limit is 512 Gigabytes (due to kernel common
  24. code 3 level pagetable limitation), the higher virtual address mapped
  25. into userspace is 0x7fffffffff and it makes sense to use it
  26. as the top of the userspace stack to allow the stack to grow as
  27. much as possible.
  28. The kernel mapping and the direct memory mapping are split. Direct memory
  29. mapping starts directly after userspace after a 512GB gap, while 
  30. kernel mapping is at the end of (negative) virtual address space to exploit 
  31. the kernel code model. There is no support for discontig memory, this
  32. implies that kernel mapping/vmalloc/ioremap/module mapping are not 
  33. represented in their "real" mapping in mem_map, but only with their
  34. direct mapped (but normally not used) alias.
  35. Future:
  36. During 2.5.x we can break the 512 Gigabytes per-process limit
  37. possibly by removing from the common code any knowledge about the
  38. architectural dependent physical layout of the virtual to physical
  39. mapping.
  40. Once the 512 Gigabytes limit will be removed the kernel stack will
  41. be moved (most probably to virtual address 0x00007fffffffffff).
  42. Nothing will break in userspace due that move, as nothing breaks
  43. in IA32 compiling the kernel with CONFIG_2G.
  44. Linus agreed on not breaking common code and to live with the 512 Gigabytes
  45. per-process limitation for the 2.4.x timeframe and he has given me and Andi
  46. some very useful hints... (thanks! :)
  47. Thanks also to H. Peter Anvin for his interesting and useful suggestions on
  48. the x86-64-discuss lists!
  49. Current PML4 Layout:
  50. Each CPU has an PML4 page that never changes. 
  51. Each slot is 512GB of virtual memory. 
  52.  
  53.         0    user space pgd or 40MB low mapping at bootup.  Changed at context switch.
  54.         1    unmapped
  55.         2    __PAGE_OFFSET - start of direct mapping of physical memory
  56.         ...  direct mapping in further slots as needed.
  57.         510  vmalloc and ioremap space
  58. 511  kernel code mapping, fixmaps and modules.  
  59. Other memory management related issues follows:
  60. PAGE_SIZE:
  61. If somebody is wondering why these days we still have a so small
  62. 4k pagesize (16 or 32 kbytes would be much better for performance
  63. of course), the PAGE_SIZE have to remain 4k for 32bit apps to
  64. provide 100% backwards compatible IA32 API (we can't allow silent
  65. fs corruption or as best a loss of coherency with the page cache
  66. by allocating MAP_SHARED areas in MAP_ANONYMOUS memory with a
  67. do_mmap_fake). I think it could be possible to have a dynamic page
  68. size between 32bit and 64bit apps but it would need extremely
  69. intrusive changes in the common code as first for page cache and
  70. we sure don't want to depend on them right now even if the
  71. hardware would support that.
  72. PAGETABLE SIZE:
  73. In turn we can't afford to have pagetables larger than 4k because
  74. we could not be able to allocate them due physical memory
  75. fragmentation, and failing to allocate the kernel stack is a minor
  76. issue compared to failing the allocation of a pagetable. If we
  77. fail the allocation of a pagetable the only thing we can do is to
  78. sched_yield polling the freelist (deadlock prone) or to segfault
  79. the task (not even the sighandler would be sure to run).
  80. KERNEL STACK:
  81. 1st stage:
  82. The kernel stack will be at first allocated with an order 2 allocation
  83. (16k) (the utilization of the stack for a 64bit platform really
  84. isn't exactly the double of a 32bit platform because the local
  85. variables may not be all 64bit wide, but not much less). This will
  86. make things even worse than they are right now on IA32 with
  87. respect of failing fork/clone due memory fragmentation.
  88. 2nd stage:
  89. We'll benchmark if reserving one register as task_struct
  90. pointer will improve performance of the kernel (instead of
  91. recalculating the task_struct pointer starting from the stack
  92. pointer each time). My guess is that recalculating will be faster
  93. but it worth a try.
  94. If reserving one register for the task_struct pointer
  95. will be faster we can as well split task_struct and kernel
  96. stack. task_struct can be a slab allocation or a
  97. PAGE_SIZEd allocation, and the kernel stack can then be
  98. allocated in a order 1 allocation. Really this is risky,
  99. since 8k on a 64bit platform is going to be less than 7k
  100. on a 32bit platform but we could try it out. This would
  101. reduce the fragmentation problem of an order of magnitude
  102. making it equal to the current IA32.
  103. We must also consider the x86-64 seems to provide in hardware a
  104. per-irq stack that could allow us to remove the irq handler
  105. footprint from the regular per-process-stack, so it could allow
  106. us to live with a smaller kernel stack compared to the other
  107. linux architectures.
  108. 3rd stage:
  109. Before going into production if we still have the order 2
  110. allocation we can add a sysctl that allows the kernel stack to be
  111. allocated with vmalloc during memory fragmentation. This have to
  112. remain turned off during benchmarks :) but it should be ok in real
  113. life.
  114. Order of PAGE_CACHE_SIZE and other allocations:
  115. On the long run we can increase the PAGE_CACHE_SIZE to be
  116. an order 2 allocations and also the slab/buffercache etc.ec..
  117. could be all done with order 2 allocations. To make the above
  118. to work we should change lots of common code thus it can be done
  119. only once the basic port will be in a production state. Having
  120. a working PAGE_CACHE_SIZE would be a benefit also for
  121. IA32 and other architectures of course.
  122. vmalloc:
  123. vmalloc should be outside the first 512GB to keep that space free
  124. for the user space. It needs an own pgd to work on in common code. 
  125. It currently gets an own pgd in the 510th slot of the per CPU PML4.
  126. PML4: 
  127.         Each CPU as an own PML4 (=top level of the 4 level page hierarchy). On 
  128.         context switch the first slot is rewritten to the pgd of the new process 
  129.         and CR3 is flushed.
  130.     
  131. Modules: 
  132. Modules need to be in the same 4GB range as the core kernel. Otherwise
  133. a GOT would be needed. Modules are currently at 0xffffffffa0000000
  134.         to 0xffffffffafffffff. This is inbetween the kernel text and the 
  135.         vsyscall/fixmap mappings.
  136. Vsyscalls: 
  137.         Vsyscalls have a reserved space near the end of user space that is 
  138.         acessible by user space. This address is part of the ABI and cannot be
  139.         changed. They have ffffffffff600000 to ffffffffffe00000 (but only 
  140.         some small space at the beginning is allocated and known to user space 
  141.         currently). See vsyscall.c for more details. 
  142. Fixmaps: 
  143.         Fixed mappings set up at boot. Used to access IO APIC and some other hardware. 
  144.         These are at the end of vsyscall space (ffffffffffe00000) downwards, 
  145.         but are not accessible by user space of course.
  146. Early mapping:
  147.         On a 120TB memory system bootmem could use upto 3.5GB
  148.         of memory for its bootmem bitmap. To avoid having to map 3.5GB by hand
  149.         for bootmem's purposes the full direct mapping is created before bootmem
  150.         is initialized. The direct mapping needs some memory for its page tables,
  151.         these are directly taken from the physical memory after the kernel. To
  152.         access these pages they need to be mapped, this is done by a temporary 
  153.         mapping with a few spare static 2MB PMD entries.
  154. Unsolved issues: 
  155.  2MB pages for user space - may need to add a highmem zone for that again to 
  156.  avoid fragmentation.
  157.   
  158. Andrea <andrea@suse.de> SuSE
  159. Andi Kleen <ak@suse.de> SuSE
  160. $Id$