厌伴老儒烹瓠叶,强随举子踏槐花。这篇文章主要讲述[笨叔点滴7] 再也回不去的C语言相关的知识,希望能为你提供帮助。
“
开年,我老婆携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;
【[笨叔点滴7] 再也回不去的C语言】#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语言哟!
大家看看小明同学的代码出现是啥毛病吗? 你们有答案了,别忘了在评论区留言哟!
推荐阅读
- [笨叔点滴12]面试必考(如果在中断处理函数里发生了缺页中断会怎样(为什么?))
- [笨叔点滴14] ARMv8里异常处理哪些蛇神牛鬼
- [笨叔点滴13]哪些异常处理的事儿
- 自助重置AD域用户密码_如何更好的对AD域用户密码进行管理
- 百分点数据科学实验室(白酒零售行业商品搭售方案)
- VRRP协议(虚拟路由冗余协议)
- 设置Linux系统的空闲等待时间TMOUT
- 通过Kubernetes监控探索应用架构,发现预期外的流量
- Cube 技术解读 | 支付宝新一代动态化技术架构与选型综述