-
指针:存地址32个平台,4个字节static void cpuset_fork(struct task_struct* task) { if (task_css_is_root(task, cpuset_cgrp_id)) return; set_cpus_allowed_ptr(task, ¤t->cpus_allowed); #ifdef CONFIG_QOS_SCHED_DYNAMIC_AFFINITY set_prefer_cpus_ptr(task, current->prefer_cpus); #endif task->mems_allowed = current->mems_allowed; } void cgroup_fork(struct task_struct* child) { RCU_INIT_POINTER(child->cgroups, &init_css_set); INIT_LIST_HEAD(&child->cg_list); } struct kprobe { struct hlist_node hlist; struct list_head list; unsigned long nmissed; kprobe_opcode_t *addr; const char *symbol_name; unsigned int offset; kprobe_pre_handler_t pre_handler; kprobe_post_handler_t post_handler; kprobe_fault_handler_t fault_handler; kprobe_break_handler_t break_handler; kprobe_opcode_t opcode; struct arch_specific_insn ainsn; u32 flags; };
static struct kprobe kp = {
.symbol_name = "cpuset_fork",
};
static int __init kprobe_init(void)
{
int ret;
kp.pre_handler = handler_pre;
kp.post_handler = handler_post;
kp.fault_handler = handler_fault;
ret = register_kprobe(&kp);
if (ret < 0) {
printk(KERN_INFO "register_kprobe failed, returned %d\n", ret);
return ret;
}
printk(KERN_INFO "Planted kprobe at %p\n", kp.addr);
return 0;
}
static void __exit kprobe_exit(void)
{
unregister_kprobe(&kp);
printk(KERN_INFO "kprobe at %p unregistered\n", kp.addr);
}
module_init(kprobe_init)
module_exit(kprobe_exit)
MODULE_LICENSE("GPL");
- 指针类型决定了指针在解引用是访问几个字节
指针类型决定指针+-1操作的时候跳过几个字节,决定指针的步长
int* 4byte char* 1byte float* 4byte
- 野指针:指向位置不可知;指针访问越界;局部变量被销毁
- 指针
- 指针加减整数 *vp++=0 *vp=0;vp++;
-
int sz=sizeof(arr)/sizeof(arr[0]); int*p=arr; for(i=0;i<sz;i++) { *p=1; p++; }
2.指针减指针
指针减指针得到绝对值是指针和指针之间的个数
不是所有的指针都能相减,指向同一片空间的指针才能相减
3.指针关系运算
*--vp=0;
vp--;
*vp=0;
#define n '5
float value[n]
float *vp
for (vp=&values[0];vp<&values[n];)
{
*vp++=0;
}
允许向后越界,不允许向前越界
- 指针和数组
数组名表示数组首元素地址
&arr[i]
*p[i]
*(arr+i)
arr[]也是首元素地址
- 二级指针
int a=10;
int *pa=&a;
int **ppa=&a;
ppa指向的对象是int*类型
二级指针是用来存放一级指针变量的地址
- 指针数组
- 存放指针的数组就是指针数组
-
int a=0; int b=0; int c=0; int arr[10]; int*pa=&a; int*pb=&b; int*pc=&c; inr *parr[10]={&a,&b,&c};
- 结构体成员访问,
结构体变量.成员变量
结构体指针->成员变量
- 结构体传参
传地址和传结构体
首选传地址。形参是实参的一个拷贝,传参的时候需要压栈,如果传递一个结构体,结构体过大,压栈的系统开销比较大,所以导致性能下降