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. [置顶] HMM Tutorial 隐马尔科夫模型

    有一个月没有写博客了,这一个月系统的学习了HMM model.  上周周五做了个report 感觉还好.  所以把Slide贴上来.

  2. CentOS6.5安全策略设置

    应公司内部网站等级测评的需求,正逐渐加强系统安全防护 密码策略设置 检查方法: 使用命令 #cat /etc/login.defs|grep PASS查看密码策略设置 备份方法: cp -p /etc ...

  3. Linux开机启动十步骤

    启动第一步--加载BIOS 启动第二步--读取MBR 启动第三步--Boot Loader 启动第四步--加载内核 启动第五步--用户层init依据inittab文件来设定运行等级 启动第六步--in ...

  4. Android 判断当前线程是否为主线程

    public static boolean isInMainThread() { return Looper.myLooper() == Looper.getMainLooper(); }

  5. 分享非常有用的Java程序 (关键代码) (二)---列出文件和目录

    原文:分享非常有用的Java程序 (关键代码) (二)---列出文件和目录 File dir = new File("directoryName"); String[] child ...

  6. Jquery学习笔记:删除节点的操作

    假设如下的html代码 <div id="mydiv" style="width:100px;height:100px;border:1px solid red&q ...

  7. 使用【百度云推送】第三方SDK实现推送功能具体解释

    之前介绍过怎样使用shareSDK实现新浪微博分享功能,今天介绍怎样使用百度云推送SDK实现Android手机后台推送功能. 执行效果例如以下 第一步,假设使用百度的SDK,当然要先成为百度的开发人员 ...

  8. poj 3258 River Hopscotch 【二分】

    题目真是不好读,大意例如以下(知道题意就非常好解了) 大致题意: 一条河长度为 L,河的起点(Start)和终点(End)分别有2块石头,S到E的距离就是L. 河中有n块石头,每块石头到S都有唯一的距 ...

  9. OCP-1Z0-051-题目解析-第8题

    8. View the Exhibit and examine the structure of the CUSTOMERS table. Which two tasks would require ...

  10. Learning Web

    1.UDACITY https://www.udacity.com/course/cs258