LDD3学习笔记(14):内核中的数据类型

 #include <linux/types.h>

typedef u8;

typedef u16;

typedef u32;

typedef u64;

保证是 8-位, 16-位, 32-位 和64-位 无符号整型值的类型. 对等的有符号类型也存在. 在用户空

间, 你可用 __u8, __u16, 等等来引用这些类型.

#include <asm/page.h>

PAGE_SIZE

PAGE_SHIFT

给当前体系定义每页的字节数, 以及页偏移的位数( 对于 4 KB 页是 12, 8 KB 是 13 )的符号.

#include <asm/byteorder.h>

__LITTLE_ENDIAN

__BIG_ENDIAN 

这 2 个符号只有一个定义, 依赖体系.

#include <asm/byteorder.h>

u32 __cpu_to_le32 (u32);

u32 __le32_to_cpu (u32);

在已知字节序和处理器字节序之间转换的函数. 有超过 60 个这样的函数: 在 include/linux/

byteorder/ 中的各种文件有完整的列表和它们以何种方式定义.

#include <asm/unaligned.h>

get_unaligned(ptr);

put_unaligned(val, ptr);

一些体系需要使用这些宏保护不对齐的数据存取. 这些宏定义扩展成通常的指针解引用, 为

那些允许你存取不对齐数据的体系.

#include <linux/err.h>

void *ERR_PTR(long error);

long PTR_ERR(const void *ptr);

long IS_ERR(const void *ptr);

允许错误码由返回指针值的函数返回.

#include <linux/list.h>

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_empty(struct list_head *head);

list_entry(entry, type, member);

list_move(struct list_head *entry, struct list_head *head);

list_move_tail(struct list_head *entry, struct list_head *head);

list_splice(struct list_head *list, struct list_head *head);

操作环形, 双向链表的函数.

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)

方便的宏定义, 用在遍历链表上.

时间: 2024-09-16 08:19:51

LDD3学习笔记(14):内核中的数据类型的相关文章

目标跟踪学习笔记_1(opencv中meanshift和camshift例子的应用)

在这一节中,主要讲目标跟踪的一个重要的算法Camshift,因为它是连续自使用的meanShift,所以这2个函数opencv中都有,且都很重要.为了让大家先达到一个感性认识.这节主要是看懂和运行opencv中给的sample并稍加修改.      Camshift函数的原型为:RotatedRect CamShift(InputArray probImage, Rect& window, TermCriteria criteria).      其中probImage为输入图像直方图的反向投影

《从零开始学Swift》学习笔记(Day 11)——数据类型那些事儿?

 原创文章,欢迎转载.转载请注明:关东升的博客    在我们学习语言时都会学到这种语言的数据类型,在Swift中数据类型有那些呢?整型.浮点型.布尔型.字符.字符串这些类型是一定有的,其中集合.枚举.结构体.类也是Swift中的数据类型.元组是Swift中特有的. 其他那些类型我们可能多少知道些或是听说过.元组是在Swift中有的,它是什么呢? 它是一种数据结构,在数学中应用广泛.在计算机科学中,元组是关系数据库中的基本概念,元组表中的一条记录,每列就是一个字段.因此在二维表里,元组也称为记

LDD3学习笔记(15):PCI驱动

 #include <linux/pci.h> 包含 PCI 寄存器的符号名和几个供应商和设备 ID 值的头文件. struct pci_dev; 表示内核中一个 PCI 设备的结构. struct pci_driver; 代表一个 PCI 驱动的结构. 所有的 PCI 驱动必须定义这个. struct pci_device_id; 描述这个驱动支持的 PCI 设备类型的结构. int pci_register_driver(struct pci_driver *drv); int pci_m

LDD3学习笔记(2):建立和运行模块

1.建立开发环境 在开始编写代码以及研究代码之前,你需要有一个开发环境,也就是一个linux系统.通常我们的做法是在windows下安装一个虚拟机软件,然后在虚拟机软件中安装一个linux系统的发行版本,在众多的发行版本中我推荐ubuntu,不过具体还要看个人爱好. 2.hello world模块 许多编程书籍都从hello world开始,下面的代码是一个完整的hello world模块.将下列代码输入hello.c文件中. #include <linux/init.h>#include &

jQuery学习笔记[1] jQuery中的DOM操作_jquery

DOM分为3个方面,即DOM Core,HTML-DOM,CSS-DOM. 1,DOM Core并不专属于JavaScript,任何一种支持DOM的程序设计语言都可以使用它. JavaScript中的getElementById(),getElementsByTagName()...等方法. 例如:使用DOM Core来获取表单对象的方法: document.getElementsByTagName("form"); 2,HTML-DOM. 在使用JavaScript和DOM为HTML

LDD3学习笔记(7):调试技术

  1.内核中的调试 开发中需要激活的配置选项 CONFIG_DEBUG_KERNEL CONFIG_DEBUG_SLAB CONFIG_DEBUG_PAGEALLOC CONFIG_DEBUG_SPINLOCK CONFIG_DEBUG_SPINLOCK_SLEEP CONFIG_INIT_DEBUG CONFIG_DEBUG_INFO CONFIG_MAGIC_SYSRQ CONFIG_DEBUG_STACKOVERFLOW CONFIG_DEBUG_STACK_USAGE CONFIG_K

LDD3学习笔记(6):字符驱动4

  1.快速参考 本章介绍了下面符号和头文件. struct file_operations 和 struct file 中的成员的列表这里不重复了. #include <linux/types.h> dev_t  dev_t 是用来在内核里代表设备号的类型. int MAJOR(dev_t dev); int MINOR(dev_t dev); 从设备编号中抽取主次编号的宏. dev_t MKDEV(unsigned int major, unsigned int minor); 从主次编号

LDD3学习笔记(5):字符驱动3

  1.字符设备注册 在运行时获得一个独立的cdev结构的代码: Struct cdev* my_cdev=cdev_alloc(); My_codev->ops=&my_fops; 将cdev结构嵌入自己设备特定的结构: Void cdev_init(struct cdev* cdev , struct file_operations* fops); Cdev结构建立后,告诉内核: Int cdev_add(struct cdev*dev ,dev_t num,unsigned int c

LDD3学习笔记(3):字符驱动1

1.scull( Simple Character Utility for Loading  Localities)的设计 Scull是一个字符驱动,它操作一块内存区域,就好像它是一个设备,因此在以下的介绍中我们可以互换的使用设备和scull操作的内存区. 编写驱动的第一步是定义驱动将要提供给用户的功能. 模块实现的每种设备都被引用为一种类型. Scull源码实现: scull0到scull3四个设备,每个都由一个全局永久的内存区组成,全局表示如果设备被多次打开设备中含有的数据将由所有打开它的文

LDD3学习笔记(11):内存分配

 Kmalloc分配内存快并且不清零获得的内存区,内存区保留它原来的内容,分配的区在物理内存中连续. #include <linux/slab.h> void *kmalloc(size_t size, int flags); void kfree(void *obj); 内存分配的最常用接口. #include <linux/mm.h> GFP_USER GFP_KERNEL GFP_NOFS GFP_NOIO GFP_ATOMIC  控制内存分配如何进行的标志, 从最少限制的到