《Linux Device Drivers》第十一章 核心数据类型——note
- 基本介绍
- 因为Linux多平台特性,不管是哪一个重要驱动力应该是便携
- 与内核代码相关的核心问题应该是访问的同时是数据项的已知长度。能力和利用不同的处理器
- 内核使用的数据类型主要分为三类
- 类似int这种标准C语言类型
- 类似u32这种有确定大小的类型
- 像pid_t这种用于特定内核对象的类型
- 本章将讨论在什么情况下使用这三种类型以及怎样使用
- 使用标准C语言类型
- 当我们须要“两个字节的填充符”或者“用四个字节字符串表示的某个东西”时。我们不能使用标准类型,由于在不同的体系架构上。普通C语言的数据类型所占空间在大小并不同样
- 内核中的普通内存地址一般是unsigned long。在当前Linux支持的全部平台上,指针和long整形的大小总是同样的
- C99标准定义了intptr_t和uintptr_t类型,它们是可以保存指针值的整形变量
- 为数据项分配确定的空间大小
- <asm/types.h>
- <linux/types.h>
- u8, s8
- u16, s16
- u32, s32
- u64, s64
- 假设一个用户空间程序须要使用这些类型,它能够在名字前加上两个下划线作为前缀
- __u8
- __u32
- 使用新编译器的系统将支持C99标准类型,如uint8_t和uint32_t
- 接口特定的类型
- 内核中最经常使用的数据类型由它们自己的typedef声明。这样能够防止出现不论什么移植性问题
- “接口特定(interface-specific)”是指由某个库定义的一种数据类型,以便为某个特定的数据结构提供接口
- 完整的_t类型在<linux/types.h>中定义
- _t数据项的主要问题是在我们须要打印它们的时候,不太easy选择正确的printk或者printf的输出格式
- 其它有关移植的问题
- 一个通用的原则是要避免使用显式的常量值
- 时间间隔
- 使用jiffies计算时间间隔的时候,应该用HZ来衡量
- 页大小
- 内存页的大小是PAGE_SIZE字节
- PAGE_SHIFT
- <asm/page.h>
- getpagesize库函数
- get_order函数
- 字节序
- <asm/byteorder.h>
- __BIG_ENDIAN
- __LITTLE_ENDIAN
- u32 cpu_to_le32 (u32);
- u32 le32_to_cpu(u32);
- be64_to_cpu
- le16_to_cpus
- cpu_to_le32p
- <asm/byteorder.h>
- 数据对齐
- <asm/unaligned.h>
- get_unaligned(ptr);
- put_unaligned(val, ptr);
- <asm/unaligned.h>
- 指针和错误值
- 很多内核接口通过把错误值编码到一个指针值中来返回错误信息
- <linux/err.h>
- void *ERR_PTR(long error);
- long IS_ERR(const void *ptr);
- long PTR_ERR(const void *ptr);
- 链表
- <linux/list.h>
- struct list_head
- struct list_head *next, *prev;
- INIT_LIST_HEAD(&list);
- LIST_HEAD(list);
- list_add(struct list_head *new, struct list_head *head);
- list_add_tail(struct list_head *new, struct list_head *head);
- list_del(struct list_head *entry);
- list_del_init(struct list_head *entry);
- list_move(struct list_head *entry, struct list_head *head);
- list_move_tail(struct list_head *entry, struct list_head *head);
- list_empty(struct list_head *head);
- list_splice(struct list_head *list, struct list_head *head);
- list_entry(struct list_head *ptr, type_of_struct, field_name);
- list_for_each(struct list_head *cursor, struct list_head *list)
- list_for_each_prev(struct list_head *cursor, struct list_head *list)
- list_for_each_safe(struct list_head *cursor, struct list_head *next, struct list_head *list)
- list_for_each_entry(type *cursor, struct list_head *list, member)
- list_for_each_entry_safe(type *cursor, type *next, struct list_head *list, member)
- struct list_head
- <linux/list.h>
版权声明:本文博客原创文章,博客,未经同意,不得转载。
《Linux Device Drivers》第十一章 核心数据类型——note的更多相关文章
- 《Linux Device Drivers》第八章 分配内存——note
本章主要介绍Linux内核的内存管理. kmalloc函数的内幕 不正确所获取的内存空间清零 分配的区域在物理内存中也是连续的 flags參数 <linux/slab.h> <lin ...
- 《Linux Device Drivers》第十四章 Linux 设备型号
基本介绍 2.6内核设备模型来提供的抽象叙述性描述的一般系统的结构,为了支持各种不同的任务 电源管理和系统关机 用户空间与通信 热插拔设备 设备类型 kobject.kset和子系统 kobject是 ...
- 《Linux Device Drivers》第十二章 PCI司机——note
一个简短的引论 它给这一章总线架构的高级概述 集中访问讨论Peripheral Component Interconnect(PCI,外围组件互连)外设内核函数 PCI公交车是最好的支持的内核总线 本 ...
- 《Linux Device Drivers》 第十七章 网络驱动程序——note
基本介绍 第三类是标准的网络接口Linux设备,本章介绍的内核,其余的交互网络接口描述 网络接口,必须使用特定的内核数据结构本身注册,与外部分组交换数据线打电话时准备 经常使用的文件上的网络接口操作是 ...
- 《Linux Device Drivers》第十五章 内存映射和DMA——note
简单介绍 很多类型的驱动程序编程都须要了解一些虚拟内存子系统怎样工作的知识 当遇到更为复杂.性能要求更为苛刻的子系统时,本章所讨论的内容迟早都要用到 本章的内容分成三个部分 讲述mmap系统调用的实现 ...
- 《Linux Device Drivers》第十六章 块设备驱动程序——note
基本介绍 块设备驱动程序通过主传动固定大小数据的随机访问设备 Linux核心Visual块设备作为基本设备和不同的字符设备类型 Linux块设备驱动程序接口,使块设备最大限度地发挥其效用.一个问题 一 ...
- 《Linux Device Drivers》第十八章 TTY驱动程序——note
简单介绍 tty设备的名称是从过去的电传打字机缩写而来,最初是指连接到Unix系统上的物理或虚拟终端 Linux tty驱动程序的核心紧挨在标准字符设备驱动层之下,并提供了一系列的功能,作为接口被终端 ...
- 《Linux Device Drivers》第十章 中断处理——note
概述:系统要及时的感知硬件的状态,通常有两种方式:一种是轮询.一种是通过响应硬件中断.前者会浪费处理器的时间,而后者不会. 准备并口 在没有节设定产生中断之前,并口是不会产生中断的 并口的标准规定设置 ...
- linux device drivers ch03
ch03.字符设备驱动程序 编写驱动程序的第一步就是定义驱动程序为用户程序提供的能力(机制).接下来以scull(“Simple Character Utility for Loading Local ...
随机推荐
- POJ 2014 Flow Layout 模拟
http://poj.org/problem?id=2014 嘻嘻2014要到啦,于是去做Prob.ID 为2014的题~~~~祝大家新年快乐~~ 题目大意: 给你一个最大宽度的矩形,要求把小矩形排放 ...
- div宽度设置width:100%后再设置padding或margin超出父元素的解决办法
div宽度设置width:100%后再设置padding或margin超出父元素的解决办法 一.总结 一句话总结:直接加上box-sizing:border-box;即可解决上述问题. 1.box-s ...
- bc-win32-power-echo-vim-not-work
http://gnuwin32.sourceforge.net/packages.html linux ok, but win32 not ok [root@130-255-8-100 ~]# ech ...
- 【翻译自mos文章】Clusterware间歇性的hang,命令报CRS-184而且Network Socket Files in /tmp/.oracle or /var/tmp/.oracle被删
来源于: Clusterware Intermittently Hangs And Commands Fail With CRS-184 as Network Socker Files in /tmp ...
- 一起学Python:tcp服务器
tcp服务器 生活中的电话机 如果想让别人能更够打通咱们的电话获取相应服务的话,需要做以下几件事情: 买个手机 插上手机卡 设计手机为正常接听状态(即能够响铃) 静静的等着别人拨打 tcp服务器 如同 ...
- OpenGLES 关于 数学 的分支 - 线性变化量、离散量、随机量
关于 数学 的分支 - 线性变化量.离散量.随机量 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作 ...
- ASP.net 中 OutputCache 指令各个参数的作用。
使用@ OutputCache指令 使用@ OutputCache指令,能够实现对页面输出缓存的一般性需要.@ OutputCache指令在ASP.NET页或者页中包含的用户控件的头部声明.这种方式非 ...
- .net core ——微服务内通信Thrift和Http客户端响应比较
原文:.net core --微服务内通信Thrift和Http客户端响应比较 目录 1.Benchmark介绍 2.测试下微服务访问效率 3.结果 引用链接 1.Benchmark介绍 wiki中有 ...
- 学习OpenCV研究报告指出系列(二)源代码被编译并配有实例project
下载并安装CMake3.0.1 要自己编译OpenCV2.4.9的源代码.首先.必须下载编译工具,使用的比較多的编译工具是CMake. 以下摘录一段关于CMake的介绍: CMake是一个 ...
- Opencv光流运动物体追踪
光流的概念是由一个叫Gibson的哥们在1950年提出来的.它描述是空间运动物体在观察成像平面上的像素运动的瞬时速度,利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存 ...