》年初老婆带着2万块钱进了A股,今天登录她的账户,账户里有5万块钱。我很震惊! 问:“你是怎么做到的?” 她说:“我前几天又转了8万。“我们80后大概大一的时候就学过C语言,可能现在90后也差不多,但是现在00后从小学初中就开始学C语言了。笨叔叔是工作中发现能熟练使用C语言的程序员真的不多,大部分都是去Java、PHP、go、python等高级语言,像C这种需要跟内存地址和指针纠缠的语言一直以来,都显得太low了。下面是工作中的一个案例。这个案例和“真正的”狂犬病疫苗一样,程序狂跳,猴子犀利!小明想实现一个裸机system在Qemu中,按照葫芦画图定义了一个task_struct数据结构,根据linux内核的实现,在系统中第一个进程的task_struct数据结构中,这个进程的栈在最顶层8KB大小的task_struct数据结构。如图所示。其次,init_task是在main.c文件中实现的,如下图。staticstructtask_structinit_task=INIT_TASK;defineINIT_TASK\{\.state=-1,\.counter=0,\.priority=1,\.preempt_count=0,\.flags=PF_KTHREAD,\.pid=0,\}定义好init_task后,小明就会按照上图想当然的实现一个“神笔”获取当前进程的栈帧(stackframe)。structpt_regs*get_current_pt_regs(structtask_struct*tsk){unsignedlongp;p=(unsignedlong)tsk+THREAD_SIZE-sizeof(structpt_regs);return(structpt_regs*)p;}自从小明实现并调用了这个函数后,他的程序就再也没正常过,不是出现“Dataabort”异常,就是程序乱跑,就像“真正的”狂犬疫苗一样.Ben大叔和小明同学说,你们只看到了Linux内核代码实现的表面,还需要继续深入学习C语言!我们来看看小明的代码有什么问题?你有答案,别忘了在评论区留言哦!
