Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1241283
  • 博文数量: 122
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 4004
  • 用 户 组: 普通用户
  • 注册时间: 2014-02-20 08:27
文章分类
文章存档

2016年(1)

2015年(21)

2014年(100)

分类: LINUX

2014-03-26 08:55:59

内核中为防止用户对敏感数据(比如一些关键指针)的直接引用,通常会采用“掩饰”的方法,即在分配相关数据的时候,就对其进行掩饰,
然后在引用时,又对其进行还原,这样的话,用户就不能直接引用相应数据(会导致非法访问),而必须使用内核提供的标准接口来引用。
示例如下:

点击(此处)折叠或打开

  1. void *__alloc_percpu(size_t size, size_t align)
  2. {
  3.     /*
  4.      * We allocate whole cache lines to avoid false sharing
  5.      */
  6.     size_t sz = roundup(nr_cpu_ids * sizeof(void *), cache_line_size());
  7.     void *pdata = kzalloc(sz, GFP_KERNEL);
  8.     void *__pdata = __percpu_disguise(pdata);//调用__percpu_disguise对pdata数据进行“掩饰”,实际对地址进行“取非”操作

  9.     /*
  10.      * Can't easily make larger alignment work with kmalloc. WARN
  11.      * on it. Larger alignment should only be used for module
  12.      * percpu sections on SMP for which this path isn't used.
  13.      */
  14.     WARN_ON_ONCE(align > SMP_CACHE_BYTES);

  15.     if (unlikely(!pdata))
  16.         return NULL;
  17.     if (likely(!__percpu_populate_mask(__pdata, size, GFP_KERNEL,
  18.                      &cpu_possible_map)))
  19.         return __pdata;
  20.     kfree(pdata);
  21.     return NULL;
  22. }


点击(此处)折叠或打开

  1. #ifndef CONFIG_DEBUG_KMEMLEAK
  2. #define __percpu_disguise(pdata) (struct percpu_data *)~(unsigned long)(pdata) //对指针进行“取非”
  3. #else
  4. #define __percpu_disguise(pdata) (struct percpu_data *)(pdata)
  5. #endif

  6. #define per_cpu_ptr(ptr, cpu)                        \
  7. ({                                    \
  8.         struct percpu_data *__p = __percpu_disguise(ptr);        \     //应用指针时,再使用__percpu_disguise接口对指针进行取非,从而通过“两次取非”,将指针还原,这里不能直接引用,因为之前分配pdata数据时就已经“取非”了,所以必须使用标准接口__percpu_disguise
  9.         (__typeof__(ptr))__p->ptrs[(cpu)];                \
  10. })
阅读(1987) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~