Linux驱动开发理解指针与结构体

发布时间:2026/6/30 13:24:28

Linux驱动开发理解指针与结构体 第一部分指针到底是什么指针 一张“地址小纸条”普通变量家里放了一把钥匙值。指针变量手里拿着一张写着“钥匙放在哪”的纸条地址。看下面这张图最经典的指针解释图里关键点var变量放在地址0x7ffa0757dd4里面存着10ptr是指针它自己存的不是10而是var的地址0x7ffa0757dd4*ptr解引用 顺着纸条找到钥匙拿到10一句话总结指针变量里存的是别人的内存地址用*才能拿到真正的值。第二部分结构体是什么结构体 一个“文件袋”里面可以放不同类型的东西。看下面这张图结构体在内存里的真实样子图里说明struct example里有char a、int b、char c因为CPU喜欢“对齐”一次读4字节编译器会自动在中间加padding填充所以整个结构体占12字节而不是6字节这在内核驱动里非常重要第三部分指针 结构体 Linux驱动里的“王炸”最常用的是指向结构体的指针看这张超级清晰的图图里解释ptr存的是整个结构体的起始地址1080通过ptr-name、ptr-roll就能直接访问里面的字段这就是驱动里struct my_device *dev ...的真实样子再看一张更直观的指针指向结构体驱动里的实际例子structmy_device{intid;// 设备编号charname[32];// 设备名字};structmy_devicedev;// 普通结构体变量structmy_device*pdev;// 指针指向它驱动里99%都用这种p-id1;// 等价于 (*p).id 1实例练习在Ubuntu 新建understand_lab.c复制下面代码运行#includestdio.hstructstudent{intid;charname[20];};intmain(){structstudents{.id100,.nameTesha};structstudent*ps;// 指针指向结构体printf(直接访问id%d, name%s\n,s.id,s.name);printf(通过指针访问id%d, name%s\n,p-id,p-name);printf(结构体地址%p\n,(void*)s);printf(指针存的地址%p\n,(void*)p);return0;}编译运行gcc-Wall-gunderstand_lab.c-ounderstand_lab ./understand_lab输出如下第四部分C语言指针与结构体核心符号对比表驱动开发专用版概念/符号含义白话解释适用对象示例代码内存本质地址视角驱动开发注意点避免Panic等价写法 / 口诀普通变量直接存放“值”钥匙变量本体int a 42;地址里存的是值本身几乎不用驱动里全是指针-指针变量存放“地址纸条”指向别人的地址任何类型int *p a;地址里存的是另一个变量的地址必须先判断if (!p)否则空指针Panic“纸条”(取地址)“给我这个变量的地址”变量本体p a;或struct student *sp s;返回变量的起始地址只用于赋值给指针变量“拿纸条”*** ** (星号)①声明指针 ②解引用打开纸条看内容①声明时 ②使用时int *p;*p 100;①声明类型②顺着地址取值/改值忘记解引用或多解引用会导致野指针“*声明指针*使用打开看”.(点)访问结构体本体的成员结构体变量非指针struct student s; s.id 100;结构体起始地址 成员偏移驱动里几乎不用指针太多“本体用点”-(箭头)访问指向结构体的指针的成员结构体指针struct student *p; p-id 100;先解引用指针得到结构体地址再加偏移驱动里90%用这个filp-private_data 等“指针用箭头”结构体把多个不同类型数据打包成一个“文件袋”自定义类型struct my_dev { int id; char name[32]; };连续内存块可能有padding对齐必须用container_of从成员反推整个结构体“文件袋”container_of从成员指针反推出整个结构体指针内核链表/嵌入式结构体dev container_of(pos, struct my_dev, list);ptr - offsetof(结构体, 成员)驱动灵魂不掌握这个写不了任何现代驱动“从零件找到整车”

相关新闻