完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 windworld 于 2015-12-1 11:25 编辑 西电李龙海老师的linux内核课程的第二课的听课笔记。涉及内容:结构体的内存表示;如何使用C实现一套通用的链表函数库;联合体的特殊作用;基本的内存映射知识。
这样的一段程序,求一个结构体的长度,答案是多少呢? 一个对C语言的内存了解不多的人,比较容易回答是9,原因是:
有人会说了,这个不对,在不同机器上不一样的。确实,比如在16、32以及64位机器上int型的长度就不一样。 那我们将机器类型定为32位的呢?这个题目在笔试题目中经常会出现,考察的其实就是内存对齐策略。一般懂的人会说,根据内存对齐,应该是12个字节。 12个字节对么?其实这个回答也只是对了95%,更准确的回答是什么呢?不一定。 为什么不一定呢,原因是,内存对齐的策略是可以改变的。比如在gcc中,我们可以这样做:
什么意思呢,__attribute__是GNU C中的一个特色,使用它可以更改设置函数属性、变量属性以及类型属性。 这里就是利用__attribute__设置结构体的属性,packed表示取消对齐优化。 而
可以用来设置对齐方式,这里的8也可以取成1、2、4。 同时编译器中也提供了以下选项来设置对齐方式:
分别用来设置对齐以及取消对齐设置。 ###C中通用链表函数库的设计在C中,使用链表的地方非常多,比如,我们来设计一个fox的链表,首先我们定义一个fox的结构:
然后为了能够形成链表,我们在结构体中加上指针
然后我们就会写一系列的函数,增删改查等这些,比如一个add函数,像链表中添加一个元素,它的函数定义大概是这个样子的:
意思是向table表中添加一个node节点。注意下,这里的参数都是指向fox结构体的指针。 这里一切看起来都是不错的,只是,如果现在我们又需要一个表,比如一群dog,我们要给它们建链表,怎么办? 由于dog的结构类型和fox的结构类型是不一样的,我们要怎么办?将上面的步骤全部再来一遍?所有的增删改查函数再写一遍? 再如果,我们要将dog和fox扔到一个链表上呢?有可能么?它们都不是一样的结构体啊。 linux中有各种各样的链表,linux中的链表操作是怎么写的呢?难道针对每种struct写一套函数? 当然不是。我们看看linux中是怎么做的。 首先,定义一个小结构体:
很明显,这个小结构体可以用来生成一个双向的链表。 然后,重点来了:
这里我们将list_head这个结构体作为fox的一个子元素。 然后所有对fox链表的操作转换成对list_head链表的操作,比如:
这个时候所有的操作的参数都是list_head类型的。而并不用管list_head这个之外的内存是什么类型的。 如上图所示,由于我们的这种定义操作,我们甚至可以将不同的结构提法维护在一个链表中。 比如list_add的操作: 加入一个fox节点:
我们也可以加入一个dog节点:
这样的一套函数库其实是可以用于任意的链表的,只要你在你的链表中包含list_head类型的小结构体。 然而,这样使用的时候我们还需要考虑一个问题,如何访问大结构体中的元素呢,比如在图中,我们要如何访问fox类型节点的weight和tail元素呢?
其实ptr就是指向结构体的起始地址,其实我们也可以直接使用地址来访问,比如在fox的struct的定义中(list_head在最后面的那个定义),weight的地址就是ptr+4,所以我们也可以用*(ptr+4)来访问。 所以这里我们要想访问链表中的节点中的元素,就得根据list_head的地址来计算其它元素的地址。在其前面的的元素地址减特定值,在其后面的元素地址加特定值。 linux中是依靠宏定义来完成这一过程的。具体定义如下:
调用的时候,这么用:
也就是根据list_head的地址得到大的结构体的起始地址。
得到大结构体的起始地址之后,我们就可以很容易地访问结构体的各个元素。 C中的联合体和结构体不同地方在于,联合体的元素共享内存。
|
|
相关推荐
3 个讨论
|
|
有李老师的课程资料可以分享下吗,大哥,我的邮箱1186226902@qq.com
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
「含关键代码」基于AM3352/AM3354/AM3359的Linux开发案例分享
4868 浏览 0 评论
87358 浏览 0 评论
【高手问答】如何做到精通linux技术?资深工程师带你突破难点
4680 浏览 2 评论
3567 浏览 2 评论
解读Linux :先从创建一个文件夹用来存放jdk压缩文件开始
2453 浏览 0 评论
1951浏览 3评论
这是i.mx6ull的关于usb的宏定义,能解释下这些宏定义的意思
1319浏览 1评论
1230浏览 1评论
求解:aarch64交叉编译工具已经安装成功,环境变量已经配置,怎么将系统架构切换为ARM的架构
1295浏览 0评论
电脑和虚拟机可以互ping,电脑和开发板也可以互ping,但是虚拟机和开发板ping不通是什么原因
1212浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 20:18 , Processed in 1.264705 second(s), Total 56, Slave 45 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号