免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3879 | 回复: 6
打印 上一主题 下一主题

[内存管理] 为什么module:0xbf000000- 0xc0000000是用户空间地址?lowmem大于物理内存? [复制链接]

论坛徽章:
2
射手座
日期:2014-09-03 00:18:022015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-09-04 19:22 |只看该作者 |倒序浏览
本帖最后由 wLiu2007 于 2014-09-04 19:45 编辑

[    0.000000] Memory: 64MB 64MB = 128MB total
[    0.000000] Memory: 120184k/120184k available, 10888k reserved, 0K highmem
[    0.000000] Virtual kernel memory layout:
[    0.000000]     vector  : 0xffff0000 - 0xffff1000   (   4 kB)
[    0.000000]     fixmap  : 0xfff00000 - 0xfffe0000   ( 896 kB)
[    0.000000]     vmalloc : 0xcc800000 - 0xff000000   ( 808 MB)
[    0.000000]     lowmem  : 0xc0000000 - 0xcc000000   ( 192 MB)
[    0.000000]     modules : 0xbf000000 - 0xc0000000   (  16 MB)
[    0.000000]       .text : 0xc0008000 - 0xc071dcb4   (7256 kB)
[    0.000000]       .init : 0xc071e000 - 0xc08e3e9c   (1816 kB)
[    0.000000]       .data : 0xc08e4000 - 0xc0935a40   ( 327 kB)
[    0.000000]        .bss : 0xc0935a64 - 0xc097745c   ( 263 kB)

上面是一个arm 9开发板的开机打印信息,有两个问题:
1,为什么module的地址空间是0xbf000000 - 0xc0000000 ,
按这么说 内核空间应该是从0xbf000000 ~0xFFFFFFFF,而不是从0xC0000000开始了?

2,物理内存只有128M,为什么lowmem显示有192M?

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
2 [报告]
发表于 2014-09-04 20:30 |只看该作者
本帖最后由 arm-linux-gcc 于 2014-09-04 20:33 编辑

你这个是2片64M的RAM,他们地址不连续,所以low memory跨度有192M
你这个应该是2440的板子吧,2440一个bank是128M,bank6和bank7各自接64M的内存,于是两个64M之间就有64M的空洞,3个64M加起来就是192M

以前较老的内核,module是放在高于0xc0000000的,后来改到了0xc0000000以下了
在这里0xbf000000是属于内核空间,0xbf000000 ~ 0xc0000000是非线性映射的

论坛徽章:
2
射手座
日期:2014-09-03 00:18:022015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2014-09-04 20:47 |只看该作者
本帖最后由 wLiu2007 于 2014-09-04 20:50 编辑

回复 2# arm-linux-gcc
恩,我这个是2451的板子,是2440的升级版;
一个bank是128M,2片64M接在不同的bank上,这是不是就意味着物理地址不连续;
对于0xc00000000~high_mem,这一段地址属于线性地址空间,VA->PA内核转换都是直接-page_offset+phys_offset的,如果VA刚好对应到哪个空洞,会不会有问题;


   

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
4 [报告]
发表于 2014-09-04 22:23 |只看该作者
回复 1# wLiu2007


ARM CPU给模块分配了专门的区域。这是ARM的特点。X86没有这个专用区域。代码对应关系的话就得翻一下了。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
5 [报告]
发表于 2014-09-04 22:28 |只看该作者
本帖最后由 arm-linux-gcc 于 2014-09-04 22:35 编辑

回复 3# wLiu2007

对,物理地址不连续

    不会用到空洞VA的,因为伙伴系统中没有记录这个空洞PA

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
6 [报告]
发表于 2014-09-04 22:28 |只看该作者
  1. void *module_alloc(unsigned long size)
  2. {
  3.         struct vm_struct *area;

  4.         size = PAGE_ALIGN(size);
  5.         if (!size)
  6.                 return NULL;

  7.         area = __get_vm_area(size, VM_ALLOC, MODULE_START, MODULE_END);
  8.         if (!area)
  9.                 return NULL;

  10.         return __vmalloc_area(area, GFP_KERNEL, PAGE_KERNEL);
  11. }
复制代码
这是ARM的module_alloc实现,没有直接调用户vmlloc。而是调用了专业函数。
  1. void *module_alloc(unsigned long size)
  2. {
  3.         if (size == 0)
  4.                 return NULL;
  5.         return vmalloc_exec(size);
  6. }
复制代码
这是x86的版本。

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
7 [报告]
发表于 2014-09-04 22:36 |只看该作者
下面是对应的那几个常量的定义:
  1. #ifndef TASK_SIZE
  2. /*
  3. * TASK_SIZE - the maximum size of a user space task.
  4. * TASK_UNMAPPED_BASE - the lower boundary of the mmap VM area
  5. */
  6. #define TASK_SIZE                UL(0xbf000000)
  7. #define TASK_UNMAPPED_BASE        UL(0x40000000)
  8. #endif

  9. /*
  10. * The maximum size of a 26-bit user space task.
  11. */
  12. #define TASK_SIZE_26                UL(0x04000000)

  13. /*
  14. * Page offset: 3GB
  15. */
  16. #ifndef PAGE_OFFSET
  17. #define PAGE_OFFSET                UL(0xc0000000)
  18. #endif

  19. /*
  20. * The module space lives between the addresses given by TASK_SIZE
  21. * and PAGE_OFFSET - it must be within 32MB of the kernel text.
  22. */
  23. #define MODULE_END                (PAGE_OFFSET)
  24. #define MODULE_START                (MODULE_END - 16*1048576)

  25. #if TASK_SIZE > MODULE_START
  26. #error Top of user space clashes with start of module space
  27. #endif

  28. /*
  29. * The XIP kernel gets mapped at the bottom of the module vm area.
  30. * Since we use sections to map it, this macro replaces the physical address
  31. * with its virtual address while keeping offset from the base section.
  32. */
  33. #define XIP_VIRT_ADDR(physaddr)  (MODULE_START + ((physaddr) & 0x000fffff))

  34. /*
  35. * Allow 16MB-aligned ioremap pages
  36. */
  37. #define IOREMAP_MAX_ORDER        24

  38. #else /* CONFIG_MMU */

  39. /*
  40. * The limitation of user task size can grow up to the end of free ram region.
  41. * It is difficult to define and perhaps will never meet the original meaning
  42. * of this define that was meant to.
  43. * Fortunately, there is no reference for this in noMMU mode, for now.
  44. */
  45. #ifndef TASK_SIZE
  46. #define TASK_SIZE                (CONFIG_DRAM_SIZE)
  47. #endif

  48. #ifndef TASK_UNMAPPED_BASE
  49. #define TASK_UNMAPPED_BASE        UL(0x00000000)
  50. #endif

  51. #ifndef PHYS_OFFSET
  52. #define PHYS_OFFSET                 (CONFIG_DRAM_BASE)
  53. #endif

  54. #ifndef END_MEM
  55. #define END_MEM                     (CONFIG_DRAM_BASE + CONFIG_DRAM_SIZE)
  56. #endif

  57. #ifndef PAGE_OFFSET
  58. #define PAGE_OFFSET                (PHYS_OFFSET)
  59. #endif

  60. /*
  61. * The module can be at any place in ram in nommu mode.
  62. */
  63. #define MODULE_END                (END_MEM)
  64. #define MODULE_START                (PHYS_OFFSET)
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP