“开年,我老婆携 2 万块进 A 股,明天我登录她账户,账上已有 5 万块,我蛮震惊的!
问:“你怎么做到的?”
她说:“我前些日子又转进去 8 万。”
咱们 80 后这代人大略是大一的时候学习 C 语言的,可能当初 90 后这一代也差不多,然而当初 00 后这一代人曾经从小学,初中开始就学习 C 语言了。
笨叔在工作中发现,能纯熟应用 C 语言的程序猿真的不多,大部分人都去玩 Java,PHP,go,python 等高级语言,像 C 这种时时刻刻须要和内存地址和指针做奋斗的语言,显得太 low。
上面是一个工作中的案例,这个案例和打了“真”的狂犬疫苗一样,程序乱跳,猴犀利!
小明同学想在 Qemu 中实现一个裸机零碎,依葫芦画瓢定义了一个 task_struct 数据结构。依照 Linux 内核的实现,在零碎第一个过程的 task_struct 数据结构,那么这过程的栈是在 task_struct 数据结构的 8KB 大小的顶部。如这个图所示。
小明同学三下五除二在 main.c 文件中实现了 init_task,如上面所示。
static struct task_struct init_task = INIT_TASK;
define INIT_TASK \
{\
.state = -1, \
.counter = 0, \
.priority = 1, \
.preempt_count = 0, \
.flags = PF_KTHREAD, \
.pid = 0, \
}
定义完 init_task 之后,小明同学 接下来依照下面这个图,想当然来 实现一个“神来之笔”的拜访,来获取以后过程的栈框(stack frame)。
struct pt_regs *
get_current_pt_regs(struct task_struct *tsk)
{
unsigned long p;
p = (unsigned long)tsk + THREAD_SIZE -
sizeof(struct pt_regs);
return (struct pt_regs *)p;
}
自从小明实现和调用这函数之后,他的程序再也没有失常过,不是呈现“Data abort”异样,就是程序乱跑,和打了“真”的狂犬疫苗一样。笨叔和小明同学说,你学 Linux 内核的代码实现,只看到了皮毛,还须要持续深刻学习 C 语言哟!
大家看看小明同学的代码呈现是啥故障吗?你们有答案了,别忘了在评论区留言哟!