address_space 从哪里来

这两天想弄清楚linux的内存分配,忽然看到了address_space,就想弄明白。
整个内核就见到 address_space(1)和address_space(2)在这个文件里出现。
include/linux/compiler.h:
# define __user __attribute__((noderef, address_space(1)))
# define __iomem __attribute__((noderef, address_space(2)))
不过在新内核2.6.36中出现新的了
2.6.36.3/include/linux/compiler.h
# define __user         __attribute__((noderef, address_space(1)))
# define __kernel       __attribute__((address_space(0)))
# define __iomem        __attribute__((noderef, address_space(2)))
# define __percpu       __attribute__((noderef, address_space(3)))
 
探索
-------------------------------------
在参考1中说,addres_space(v) 
v:1 gcc中的定义是用户空间;
v:2  gcc中的定义是io存储空间(或许io寄存器空间更合适吧)。
作者还猜测了 v为0时内核空间。在2.6.36.3 中验证了作者的猜测。 作为发挥,就把后来的添加注释
address_space(v)
-------------------------------------
v: 0 内核空间
v: 1 用户空间
v: 2 io存储空间
v: 3 cpu空间(我感到这有点生搬硬套)
是这样吗?从哪里可以验证?
 
文章中还提到是gcc调用sparse分析的。应该看看sparse中的定义。
sparse 源码(http://codemonkey.org.uk/projects/git-snapshots/sparse/)
 
搜索代码
一处:
  1. address_space
  2. -------------------------------------
  3. ->ident-list.h
  4. IDENT(address_space);
  5. -->
  6. #define IDENT(n) __IDENT(n## _ident, #n, 0)
  7. =====================================
 
在这个文件的上下文中可以确定address_space是关键字
 
另一处
  1. address_space
  2. -------------------------------------
  3. ->parse.c
  4. static struct init_keyword {
  5. const char *name;
  6. enum namespace ns;
  7. unsigned long modifiers;
  8. struct symbol_op *op;
  9. struct symbol *type;
  10. } keyword_table[] = {
  11. /* .... */
  12. { "address_space",NS_KEYWORD, .op = &address_space_op },
  13. /* ... */
  14. };
  15. 这是关键字,有什么操作呢?关注symbol_op结构的address_space_op:
  16. =====================================
  17. address_space_op
  18. -------------------------------------
  19. -->parse.c
  20. static struct symbol_op address_space_op = {
  21. .attribute = attribute_address_space,
  22. };
  23. =====================================
  24. attribute_address_space
  25. -------------------------------------
  26. --->parse.c
  27. static attr_t attribute_address_space ;
  28. struct symbol_op
  29. -------------------------------------
  30. --->symbol.h
  31. struct symbol_op {
  32. /* ..... */
  33. /* keywords */
  34. struct token *(*attribute)(struct token *token,
  35. struct symbol *attr, struct decl_state *ctx);
  36. /* ..... */
  37. };
  38. =====================================
  39. attr_t
  40. -------------------------------------
  41. ---->parse.c
  42. typedef struct token *attr_t(struct token *,
  43. struct symbol *, struct decl_state *);
  44. attribute_address_space
  45. -------------------------------------
  46. ---->parse.c
  47. static struct token *
  48. attribute_address_space(struct token *token,
  49. struct symbol *attr, struct decl_state *ctx)
  50. {
  51. struct expression *expr = NULL;
  52. int as;
  53. token = expect(token, '(', "after address_space attribute");
  54. token = conditional_expression(token, &expr);
  55. if (expr) {
  56. as = const_expression_value(expr);
  57. if (Waddress_space && as)
  58. ctx->ctype.as = as;
  59. }
  60. token = expect(token, ')', "after address_space attribute");
  61. return token;
  62. }
  63. =====================================
 
疑问
-------------------------------------
再往下追踪,也没有结果,希望得到高人指点。疑问是:
* 怎么和内核空间(3G-4G)、用户空间(低于3G)相联系起来?
* 里面的address_space(v) (v=0,1,2,3,...)怎么起作用的?

address_space 从哪里来的更多相关文章

  1. [内核笔记1]内核文件结构与缓存——inode和对应描述

    由来:公司内部外网记录日志的方式现在都是通过Nginx模块收到数据发送到系统消息队列,然后由另外一个进程来从消息队列读取然后写回磁盘这样的操作,尽量的减少Nginx的阻塞. 但是由于System/V消 ...

  2. 《UNIX环境高级编程》笔记——3.文件IO

    一.引言 说明几个I/O函数:open.read.write.lseek和close,这些函数都是不带缓冲(不带缓冲,只调用内核的一个系统调用),这些函数不输入ISO C,是POSIX的一部分: 多进 ...

  3. linux c/c++

    string 字符串操作 操作数的都是 ( char * )型,操作数必须是指向字符串的指针("a"),不能是字符('a'),操作时不考虑末尾的'\0'. size_t strle ...

  4. 认真分析mmap:是什么 为什么 怎么用

    mmap基础概念 mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系.实现这样的映射关系后,进程就可以采用指 ...

  5. 基数树与RCU锁

    基数树是一种用空间换时间的数据结构,通过空间的冗余减少时间上的消耗.radix tree很适合稀疏的结构! 自从把RCU机制引入到基树中来,这里就有了个协议叫做:lockless的page-cache ...

  6. Linux内核分析:打开文件描述符实现

    在Linux中每一个进程的数据是存储在一个task_struct结构(定义在sched.h中)中的. struct task_struct { volatile long state; /* -1 u ...

  7. Linux 驱动学习笔记05--字符驱动实例,实现一个共享内存设备的驱动

    断断续续学驱动,好不容易有空,做了段字符驱动的例子.主要还是跟书上学习在此记录下来,以后说不定能回过头来温故知新. 首先上驱动源码 gmem.c: /************************* ...

  8. 1、Linux驱动重要的数据结构

    1.struct file 这个结构体定义在  linuxsource/include/linux/fs.h 中第960行左右 具体成员如下: struct file { /* * fu_list b ...

  9. wrHDL编译中软核代码初始化及编译耗时长的问题

    问题的提出整个WR的ISE工程比较大,编译时间很长,导致开发效率低.通过分析发现,ISE在综合的时候大量的时间都花在了初始化DPRAM上.调研发现Xilinx提供了BMM文件和DATA2MEM工具,可 ...

随机推荐

  1. ZOJ 3702 Fibonacci

    解题思路: 找规律,不难的,打表 坑的地方在于题目限定条件 and the seed value for G(1) is a random integer t, (t>=1) 虽然都用粗体表示出 ...

  2. 07-UIKit(tableview的编辑模式、accessoryView)

    目录: 一.tableview的编辑模式-增删改查 二.不使用继承创建tableview 三.accessoryView辅助视图 回到顶部 一.tableview的编辑模式-增删改查 [1-conta ...

  3. android开发过程中遇到的小问题

    ​转自:http://www.sctarena.com/Article/Article.asp?nid=5070​​1.在编写xml布局的时候,总是提示[Accessibility] Missing ...

  4. 经典集合 与 IQueryable集合 的差别

    经典集合 与 IQueryable集合 的差别 经典集合与IQueryable 集合存在本质的区别,经典结合是在内存中开辟一片区域用来存储数据,而IQueryable集合是延迟加载的集合,只有在用到的 ...

  5. C语言,C++,static

    术语static有着不寻常的历史.起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量.随后,static在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数.为了避 ...

  6. UML01-概述

    1.UML中的泛化关系用什么符号表示? 2.UML的英文全称是什么? 3.UML图不包括流程图. 4.对一个重要的系统有时要用多个模型就才能充分描述.

  7. WCF技术剖析之十二:数据契约(Data Contract)和数据契约序列化器(DataContractSerializer)

    原文:WCF技术剖析之十二:数据契约(Data Contract)和数据契约序列化器(DataContractSerializer) [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济 ...

  8. C中嵌入SQL

    连接到SAMPLE数据库,查询LASTNAME为JOHNSON的FIRSTNAME信息. #include <stdio.h> #include <stdlib.h> #inc ...

  9. 基于visual Studio2013解决面试题之1201链表去重

     题目

  10. 学习笔记之NodeJs基本操作

    nodejs安装见文章:windows下安装node.js及less 运行js文件:node xxx.js 调用http模块,并指定端口为3000,向客户端输出<h1>Node.js< ...