ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Linux驱动内核数据结构

2020-08-28 09:50:19  阅读:245  来源: 互联网

标签:head include struct list 内核 Linux entry 数据结构 字节


我们写的驱动程序,尽力能够运行在多个平台上(如:X86、ARM),为此,我们需要在数据类型、字节对齐、内存分页等多方面进行考虑,使我们的驱动程序有很强的可移植性。

1.数据类型

尽量使用typedef的数据类型,因为可能基础数据类型,如:long类型,在某些平台上可能是4字节,在某些平台上可能是8字节,而<linux/types.h>的typedef数据类型,为我们规避的这一不确定性。

#include <linux/types.h>
typedef u8;
typedef u16;
typedef u32;
typedef u64;

2.内存分页

内存分页是在#include <asm/page.h>中,通过宏PAGE_SIZE定义的。

3.字节序

Big-endian(大端序):数据的高位字节存放在地址的低端,低位字节存放在地址高端,即:高字节存在低地址,好别扭。
Little-endian(小端序):数据的高位字节存放在地址的高端,低位字节存放在地址低端,即:低字节存在低地址,好顺眼。
记住:别扭的是大端序,顺眼的是小端序。

#include <asm/byteorder.h>
__LITTLE_ENDIAN
__BIG_ENDIAN

根据体系结构,仅定义两个符号中的一个。可以通过#ifdef来编写你的代码。

u32 __cpu_to_le32 (u32);
u32 __le32_to_cpu (u32);

这两个函数可以在已知字节顺序和处理器字节顺序之间转换的函数,这样的函数有很多。

4.字节对齐

不要一贯的认为4字节对齐,尽管大多数是这样的。

#include <asm/unaligned.h>
get_unaligned(ptr);
put_unaligned(val, ptr);

有些架构需要使用这些宏来保护未对齐的数据访问。宏扩展到允许访问未对齐数据的体系结构的普通指针取消引用。

5.指针和错误值

许多内核函数返回一个指针给调用者,而这些函数中很多可能导致失败,在大部分情况下,通过NULL返回,但有时也会通过一个err指针返回,可通过下面函数来确定具体错误信息,而这种错误是不能简单的与NULL比较的,需要通过下面的函数处理才能得到具体的错误信息。

#include <linux/err.h>
void *ERR_PTR(long error); 
long PTR_ERR(const void *ptr);
long IS_ERR(const void *ptr);

6.内核链表list

内核链表list,定义在#include <linux/list.h>中,是一组非常强大的双向链表,不仅可以应用于内核和驱动的开发,在我们普通应用程序开发中,也可以广泛应用。

#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)

内核驱动的数据结构远不止这些,这里仅仅是一个基础中的基础,后面还需要更深入的学习。

标签:head,include,struct,list,内核,Linux,entry,数据结构,字节
来源: https://blog.51cto.com/14207158/2525080

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有