嵌入式Linux开发视频教程配套PPT课件主讲熊伟 第十章.doc

嵌入式Linux开发视频教程配套PPT课件主讲熊伟 第十章.doc

ID:52299010

大小:57.50 KB

页数:7页

时间:2020-03-26

嵌入式Linux开发视频教程配套PPT课件主讲熊伟 第十章.doc_第1页
嵌入式Linux开发视频教程配套PPT课件主讲熊伟 第十章.doc_第2页
嵌入式Linux开发视频教程配套PPT课件主讲熊伟 第十章.doc_第3页
嵌入式Linux开发视频教程配套PPT课件主讲熊伟 第十章.doc_第4页
嵌入式Linux开发视频教程配套PPT课件主讲熊伟 第十章.doc_第5页
资源描述:

《嵌入式Linux开发视频教程配套PPT课件主讲熊伟 第十章.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第10章合理使用数据类型在进一步讨论更深的主题之前,我们需要先停一停,快速地回顾一下可移植问题。Linux1.2版本和2.0版本之间的不同就在于额外的多平台能力;结果是,大多数源代码级的移植问题已经被排除了。这意味着一个规范的Linux驱动程序也应该是多平台的。但是,与内核代码相关的一个核心问题是,能够同时存取各种长度已知的数据项(例如,文件系统数据类型或者设备卡上的寄存器)和利用不同处理器的能力(32位和64位的体系结构,也有可能是16位的)。当把x86的代码移植到新的体系结构上时,核心开发者遇到的好几个问题都和不正确的数据类型相关。坚持强数据类型以及编译时使用-

2、Wall-Wstrict-prototypes选项能够防止大部分的臭虫。内核使用的数据类型划分为三种主要类型:象int这样的标准C语言类型,象u32这样的确定数据大小的类型和象pid_t这样的接口特定类型。我们将看一下这三种类型在何时使用和如何使用。本章的最后一节将讨论把驱动器代码从x86移植到其它平台上可能碰到的其它一些典型问题。如果你遵循我提供的这些准则,你的驱动程序甚至可能在那些你未能进行测试的平台上编译并运行。使用标准C类型大部分程序员习惯于自由的使用诸如int和long这样的标准类型,而编写设备驱动程序就必须细心地避免类型冲突和潜在的臭虫。问题是,当你需要

3、“2个字节填充单位(filler)”或“表示4个字节字符串的某个东西”时,你不能使用标准类型,因为通常的C数据类型在不同的体系结构上所占空间大小并不相同。例如,长整数和指针类型在Alpha上和x86上所占空间大小就不一样,下面的屏幕快照表明了这一点:morgana%./datasizesystem/machine:Linuxi486sizeof(char)=1sizeof(short)=2sizeof(int)=4sizeof(long)=4sizeof(longlong)=8sizeof(pointer)=4wolf%./datasizesystem/machin

4、e:Linuxalphasizeof(char)=1sizeof(short)=2sizeof(int)=4sizeof(long)=8sizeof(longlong)=8sizeof(pointer)=8sandra%./datasizesystem/machine:Linuxsparcsizeof(char)=1sizeof(short)=2sizeof(int)=4sizeof(long)=4sizeof(longlong)=8sizeof(pointer)=4datasize程序是一个可以从在O'ReillyFTP站点的misc-progs目录下获得的小程序

5、。在混合使用int和long类型时,你必须小心,有时有很好的理由这样做,一种情形就是内存地址,一涉及到内核,内存地址就变得很特殊。虽然概念上地址是指针,但是通过使用整数类型,可以更好地实现内存管理;内核把物理内存看做一个巨大的数组,内存地址就是这个数组的索引。而且,一个指针很容易被取地址(deference),而使用整数表示内存地址可以防止它们被取地址,这正是人们所希望的(比使用指针更安全)。因而,内核中的地址属于unsignedlong类型,这是利用了指针和长整数类型大小总是相同这一事实,至少在所有Linux当前支持的平台上是这样的。我们等着看看将来把Linux移

6、植到不符合这一规则的平台上的时候,会发生些什么。分配确定的空间大小给数据项有时内核代码需要指定大小的数据项,或者用来匹配二进制结构*读分区表时,执行二进制文件时或者解码一个网络包时,就会发生这种情况。或者用来在结构中插入填充字段对齐数据。为此目的,内核提供如下的数据类型,它们都在头文件中声明,这个文件又被头文件所包含:u8;/*无符号字节(8位)*/u16;/*无符号字(16位)*/u32;/*无符号32位数值*/u64;/*无符号64位数值*/这些数据类型只能被内核代码所访问(也即,在包含头文件

7、types.h>之前必须先定义__KERNEL__)。相应的有符号类型也是存在的,但一般不用;如果你需要使用它们的话,只要把名字中的u替换为s就可以了。如果用户空间的程序需要使用这些类型,可以在这些名字前面添加2个下划线:__u8和其它类型是独立于__KERNEL__定义的。例如,如果一个驱动程序需要通过ioctl系统调用与一个运行在用户空间内的程序交换二进制结构的话,头文件必须将结构中的32位字段定义为__u32。重要的是要记住这些类型特定于Linux,使用它们就会防碍软件向其他Unix变体的移植。但是,有些情况下也需要明确说明数据大小,而标准头文件(在每个U

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。