fwzfwz1
驱动中牛
驱动中牛
  • 注册日期2002-11-01
  • 最后登录2007-06-01
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
阅读:1342回复:7

unix1998,高端内存的映射问题

楼主#
更多 发布于:2003-06-16 22:48
linux中大于1G的内存为高端内存,例如PCI内存。0-4G的虚拟地址中0-3G为用户空间,3-4G为内核空间。内核空间的地址减去3G为低端内存(小于1G的内存)。那么使用ioremap映射高端内存得到的虚拟地址属于哪个地址空间,感觉不可能属于用户空间,但是也不可能属于内核空间。强烈希望得到高手的指点!!!
有了驱动,人才有了力量。
unix1998
驱动老牛
驱动老牛
  • 注册日期2002-05-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-06-19 13:12
i think so。

转贴一个朋友的帖子:
比较准确的说,那个限制不是1G而是896M(假设没有选择CONFIG_HIGHMEM_EMULATION
选项),因为内核需要一个128M的虚拟地址空间用作vmalloc(),iomamp()分配的资源.Linux有选项,CONFIG_HIGHMEM来支持超过896M的内存,另外还有CONFIG_X86_PAE来选择是否支持Pentium的PAE 36位寻址模式.如果两个都没选的话,那么Linux只能认896M的物理内存,如果选了前者没有选后者话,那最多能运用的就是4G,如果都选了的话能用2的36次方也就是64G.
对于选择了CONFIG_HIGHMEM,则如果非要用超过可以线性映射范围(如896M)的物理的内存,就要先设置一个特殊的指针kmap_pte,它指向一个可以动态映射到物理内存的页面映射表的表项.在kmap_init()中

81 void __init kmap_init(void)
82 {
83 unsigned long kmap_vstart;
84
85 /* cache the first kmap pte */
86 kmap_vstart = __fix_to_virt(FIX_KMAP_BEGIN);
87 kmap_pte = kmap_get_fixmap_pte(kmap_vstart);
88
89 kmap_prot = PAGE_KERNEL;
90 }
设置了这个全局的表项指针.该表项所\"对应\"的虚拟地址(不是物理地址)在0xffffe000UL-FIX_KMAP_BEGIN )) PAGE_SHIFT
处,而FIX_KMAP_BEGIN定义在enum fixed_address结构(该结构定义了一些特殊的占据高端虚拟地址的\"用途\")中,所以它的数值倚赖于编译时候的选项.

50 enum fixed_addresses {
51 #ifdef CONFIG_X86_LOCAL_APIC
52 FIX_APIC_BASE, /* local (CPU) APIC) -- required for SMP or not */
53 #endif
54 #ifdef CONFIG_X86_IO_APIC
55 FIX_IO_APIC_BASE_0,
56 FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS-1,
57 #endif
58 #ifdef CONFIG_X86_VISWS_APIC
59 FIX_CO_CPU, /* Cobalt timer */
60 FIX_CO_APIC, /* Cobalt APIC Redirection Table */
61 FIX_LI_PCIA, /* Lithium PCI Bridge A */
62 FIX_LI_PCIB, /* Lithium PCI Bridge B */
63 #endif
64 #ifdef CONFIG_HIGHMEM
65 FIX_KMAP_BEGIN, /* reserved pte\'s for temporary kernel mappings */
66 FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1,
67 #endif
68 __end_of_permanent_fixed_addresses,
69 /* temporary boot-time mappings, used before ioremap() is functional */
70 #define NR_FIX_BTMAPS 16
71 FIX_BTMAP_END = __end_of_permanent_fixed_addresses,
72 FIX_BTMAP_BEGIN = FIX_BTMAP_END + NR_FIX_BTMAPS - 1,
73 __end_of_fixed_addresses
74 };
75

fwzfwz1
驱动中牛
驱动中牛
  • 注册日期2002-11-01
  • 最后登录2007-06-01
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-06-19 12:45
关于地址映射我现在有如下理解,不知对不对:
kmalloc获得3G到high_memory这一段的内核空间,而这一段内核空间
和系统内存的物理地址是一一对应的,内核虚拟地址和物理地址相差
3G(PAGE_OFFSET)。vmolloc和ioremap获得high_memory-4G这一段内核空间,这一段内核空间通过页表映射到物理空间。所以PCI板卡的物理地址映射的内核虚拟地址应该在high_memory-4G这一段内核空间。不知我得理解对不,请unix1998指点!Thanks!!
有了驱动,人才有了力量。
unix1998
驱动老牛
驱动老牛
  • 注册日期2002-05-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-06-19 11:10
就是说如果物理内存有2g,但是linux只能认出1g。
就如同815芯片的主板最多只能上768m内存一样。
fwzfwz1
驱动中牛
驱动中牛
  • 注册日期2002-11-01
  • 最后登录2007-06-01
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-06-17 20:49
linux不支持太大的内存。

linux虽然不支持太大的内存是何意思,是不支持大于1G的系统内存吗,还是不支持大的物理空间,但总归该支持0-4G的物理空间吧。即使不支持大于1G的系统内存,但是如果我的PCI板卡的I/O内存大于1G,又如何映射到3-4G的内核空间呢!
有了驱动,人才有了力量。
unix1998
驱动老牛
驱动老牛
  • 注册日期2002-05-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-06-17 18:42
linux不支持太大的内存。
fwzfwz1
驱动中牛
驱动中牛
  • 注册日期2002-11-01
  • 最后登录2007-06-01
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-06-17 18:13
在核心虚地址空间(3GB-4GB)中。

感觉应该在内核虚拟地址空间,但是有一个问题,内核空间(3-4G)是映射到映射到物理空间0-1G的,而大于1G的高端内存也映射到内核空间,岂不是有问题。
有了驱动,人才有了力量。
unix1998
驱动老牛
驱动老牛
  • 注册日期2002-05-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-06-17 13:05
在核心虚地址空间(3GB-4GB)中。
游客

返回顶部