尽管大部分程序员习惯自由使用标准类型, 如 int 和 long, 编写设备驱动需要一些小心 来避免类型冲突和模糊的 bug.

这个问题是你不能使用标准类型, 当你需要"一个 2-字节 填充者"或者"一个东西来代表 一个 4-字节 字串", 因为正常的 C 数据类型在所有体系上不是相同大小. 为展示各种 C 类型的数据大小, datasize 程序已包含在例子文件 misc-progs 目录中, 由 O' Reilly's FTP 站点提供. 这是一个程序的样例运行, 在一个 i386 系统上(显示的最后 4 个类型在下一章介绍):

morgana% misc-progs/datasize

arch Size: char short int long ptr long-long u8 u16 u32 u64 i686           1    2     4   4    4   8         1  2   4   8

这个程序可以用来显示长整型和指针在 64-位 平台上的不同大小, 如同在不同 Linux 计 算机上运行程序所演示的:

arch  Size:

char

short

int

long

ptr

long-long

u8

u16

u32

u64

i386

1

2

4

4

4

8

1

2

4

8

alpha

1

2

4

8

8

8

1

2

4

8

armv4l

1

2

4

4

4

8

1

2

4

8

ia64

1

2

4

8

8

8

1

2

4

8

m68k

1

2

4

4

4

8

1

2

4

8

mips

1

2

4

4

4

8

1

2

4

8

ppc

1

2

4

4

4

8

1

2

4

8

sparc

1

2

4

4

4

8

1

2

4

8

sparc64

1

2

4

4

4

8

1

2

4

8

x86_64

1

2

4

8

8

8

1

2

4

8

注意有趣的是 SPARC 64 体系在一个 32-位 用户空间运行, 因此那里指针是 32 位宽, 尽管它们在内核空间是
64 位宽. 这可用加载 kdatasize 模块(在例子文件的 misc- modules 目录里)来验证. 这个模块在加载时使用
printk 来报告大小信息, 并且返回一 个错误( 因此没有必要卸载它 ):

kernel: arch Size: char short int long ptr long-long u8 u16 u32 u64
kernel: sparc64    1    2     4   8    8   8         1  2   4   8

尽管在混合不同数据类型时你必须小心, 有时有很好的理由这样做. 一种情况是因为内存 存取, 与内核相关时是特殊的. 概念上, 尽管地址是指针, 内存管理常常使用一个无符号 的整数类型更好地完成; 内核对待物理内存如同一个大数组, 并且内存地址只是一个数组 索引. 进一步地, 一个指针容易解引用; 当直接处理内存存取时, 你几乎从不想以这种方 式解引用. 使用一个整数类型避免了这种解引用, 因此避免了 bug. 因此, 内核中通常的
内存地址常常是 unsigned long, 利用了指针和长整型一直是相同大小的这个事实, 至少 在 Linux 目前支持的所有平台上.

因为其所值的原因,
C99 标准定义了 intptr_t 和 uintptr_t 类型给一个可以持有一个
指针值的整型变量. 但是, 这些类型几乎没在 2.6 内核中使用.

Linux 标准 C 类型的使用的更多相关文章

  1. linux下文件系统类型的学习

    1. 以超级用户权限登陆Linux,进入  /lib/modules/2.6.32--504.el6.x86_64/kernel/fs目录执行 ls 命令(不同Linux发行版本的Fs目录有些不同你可 ...

  2. 漫谈Linux标准的文件系统(Ext2/Ext3/Ext4)

    Ext 全称Linux extended file system, extfs,即Linux扩展文件系统,Ext2就代表第二代文件扩展系统,Ext3/Ext4以此类推,它们都是Ext2的升级版,只不过 ...

  3. linux文件锁的应用,POSIX,unix标准,linux标准

    1. perl,flock加锁.java也能加锁. 2. 先创建文件并打开,才能加锁(写打开?). 3. 可以用于判断进程是否一直在运行(用另一进程判断),如果锁一直在,则进程在:锁不在,则原进程或意 ...

  4. linux标准io的copy

    ---恢复内容开始--- 1.linux标准io的copy #include<stdio.h> int main(int argc,char **argv) { if(argc<3) ...

  5. Linux内核版本类型

    对于Linux内核发布的版本类型有如下,也是自己的理解: [mainline]:主线版本,由Linux Torvalds维护和发布. [stable/EOL]:稳定版本,每个由主线发布的版本都叫做稳定 ...

  6. Linux 标准目录结构

    初学Linux,首先需要弄清Linux 标准目录结构 / root --- 启动Linux时使用的一些核心文件.如操作系统内核.引导程序Grub等. home --- 存储普通用户的个人文件 ftp ...

  7. C++ 标准库类型-String,Vector and Bitset

    <C++ Primer 4th>读书摘要 最重要的标准库类型是 string 和 vector,它们分别定义了大小可变的字符串和集合.这些标准库类型是语言组成部分中更基本的那些数据类型(如 ...

  8. C++ Primer 第三章 标准库类型vector+迭代器iterator 运算

    1.vector: 标准库类型vector表示对象的集合,其中所有对象的类型都相同,集合中的每个对象都有一个与之对应的索引,索引用于访问对象.因为vector“容纳着”其他对象,所以它也常被称作容器( ...

  9. C++ Primer 第三章 标准库类型string运算

    1. 标准库类型 string string表示可变长的字符序列,使用string必须首先包含string头文件.如何初始化类的对象是由类本身决定的. int n; string s1;//默认初始化 ...

随机推荐

  1. Python里的堆heapq

    实际上,Python没有独立的堆类型,而只有一个包含一些堆操作函数的模块.这个模块名为heapq(其中的q表示队列),默认为小顶堆.Python中没有大顶堆的实现. 常用的函数 函 数 描 述 hea ...

  2. AtCoder Regular Contest 094 D Worst Case【思维题】

    https://arc094.contest.atcoder.jp/tasks/arc094_b 题意: 在2次超多人的比赛中,你取得的成绩依次为第A名和第B名.一个人的成绩为a和b时,当且仅当ab& ...

  3. Java练习 SDUT-2053_整理音乐

    整理音乐 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 请用链表完成下面题目要求. xiaobai 很喜欢音乐,几年来 ...

  4. qt .pro文件和cmakelists.txt配置第三方库

    .pro文件引用第三方库文件和头文件路径 1.库文件(LIBS添加的是共享库文件,-L添加目录,-l指定共享库名称) LIBS += -L/usr/local/lib -lmath LIBS的使用就是 ...

  5. BZOJ 1834网络扩容题解

    一道不算太难的题目 但是真的很恶心 显然,对于第一问,我们直接无脑打模板就好了 第二问也不是很难,我们将每条边再连一条容量为inf,费用为w的边 但是流量只要小于第一问的答案加k就行了 所以我们增加一 ...

  6. JQ取消hover事件

    $('a').unbind('mouseenter').unbind('mouseleave');

  7. spring boot初步

    spring boot介绍 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程. 该框架使用了特定的方式来进行配置,从而 ...

  8. 2019-8-31-PowerShell-拿到最近的10个系统日志

    title author date CreateTime categories PowerShell 拿到最近的10个系统日志 lindexi 2019-08-31 16:55:58 +0800 20 ...

  9. How To Move Or Rebuild A Lob Partition

    How To Move Or Rebuild A Lob Partition [ID 761388.1]             改动时间 29-JUN-2010     类型 HOWTO     状 ...

  10. FastReport模板设计和调用

    FastReport是功能齐全的报表控件,使开发者可以快速并高效地为·NET/VCL/COM/ActiveX应用程序添加报表支持.最近一个项目就涉及到了FastReport报表的应用.这里简单记录下( ...