Linux 通用数据结构说明

  1. device_driver include/linux/device.h struct device_driver {

const char             * name; /* 驱动名称 */

struct bus_type        * bus;  /* 总线类型 */

struct completion      unloaded;  /* 卸载事件通知机制 */ struct kobject                      kobj; /* sys 中的对象 */

struct klist           klist_devices; /* 设备列表 */ struct klist_node                       knode_bus; /* 总线结点列表 */

struct module          * owner;/* 所有者 */

/* 设备驱动通用方法 */

int     (*probe)    (struct device * dev); /* 探测设备 */ int    (*remove)   (struct device * dev); /* 移除设备 */ void    (*shutdown)     (struct device * dev); /* 关闭设备 */

/* 挂起设备        */

int    (*suspend)     (struct device * dev, pm_message_t state, u32 level); int       (*resume)      (struct device * dev, u32 level); /* 恢复 */

};

  1. platform_device include/linux/device.h struct platform_device {

const char     * name;  /* 名称 */

u32            id;      /* 设备编号, -1 表示不支持同类多个设备 */ struct device dev;               /* 设备 */

u32            num_resources; /* 资源数 */ struct resource * resource; /* 资源列表 */

};

3. resource struct resource {

const char name;          /*
资源名称 */

unsigned
long start, end; /* 开始位置和结束位置 */ unsigned long flags;                         /* 资源类型 */

/* 资源在资源树中的父亲,兄弟和孩子
*/ struct resource *parent, *sibling, *child;

};

4. device include/linux/device.h
struct device {

struct klist           klist_children; 
/* 在设备列表中的孩子列表 */ struct klist_node                       knode_parent;   /* 兄弟结点 */

struct
klist_node  knode_driver;   /* 驱动结点 */ struct klist_node   knode_bus;    /* 总线结点 */ struct device   parent; /* 父亲    */

struct kobject kobj;                   /* sys结点 */ char  
 bus_id[BUS_ID_SIZE];

struct semaphore       
sem;    /* 同步驱动的信号量 */

struct bus_type * bus;        /* 总线类型         */
struct device_driver *driver;   /* 设备驱动      */ void  *driver_data;  
/* 驱动的私有数据   */

void           *platform_data; /* 平台指定的数据,为 device
核心驱动保留 */ void               *firmware_data; /* 固件指定的数据,为 device
核心驱动保留 */ struct dev_pm_info
power;     /* 设备电源管理信息  */

u64            *dma_mask;      /* DMA掩码          */

u64            coherent_dma_mask;

struct
list_head dma_pools;     /* DMA缓冲池       */

struct dma_coherent_mem *dma_mem; /* 连续 DMA 内存的起始位置
*/

void    (*release)(struct device * dev);  /*
释放设置方法 */

};

  1. nand_hw_control
    include/linux/mtd/nand.h struct nand_hw_control {

spinlock_t   lock;   /* 自旋锁,用于硬件控制 */ struct nand_chip *active; /* 正在处理 MTD 设备
*/ wait_queue_head_t wq;      /* 等待队列    */

};

  1. nand_chip
    include/linux/mtd/nand.h struct nand_chip {

void    iomem   *IO_ADDR_R; /* 读地址 */ void    iomem               *IO_ADDR_W; /* 写地址 */

/* 字节操作   */

u_char         (*read_byte)(struct mtd_info *mtd);  /*
读一个字节 */

void           (*write_byte)(struct mtd_info *mtd, u_char byte); /* 写一个字节 */

/*
双字节操作 */

u16            (*read_word)(struct mtd_info mtd); /* 读一个字 */

void           (*write_word)(struct mtd_info *mtd, u16 word); /* 写一个字 */

/*
buffer 操作 */

void           (*write_buf)(struct mtd_info *mtd, const u_char *buf, int len); void               (*read_buf)(struct mtd_info
*mtd, u_char *buf, int len);

int            (*verify_buf)(struct
mtd_info *mtd, const u_char
*buf, int len);

/*
选择一个操作芯片 */

void           (*select_chip)(struct
mtd_info *mtd, int chip);

/*
坏块检查操作 */

int            (*block_bad)(struct
mtd_info *mtd, loff_t ofs, int getchip);

/*
坏块标记操作 */

int            (*block_markbad)(struct
mtd_info *mtd, loff_t ofs);

/*
硬件控制操作 */

void           (*hwcontrol)(struct
mtd_info *mtd, int cmd);

/*
设备准备操作 */

int            (*dev_ready)(struct
mtd_info *mtd);

/*
命令发送操作 */

void           (*cmdfunc)(struct mtd_info *mtd, unsigned command, int column, int
page_addr);

/*
等待命令完成 */

int            (*waitfunc)(struct mtd_info
*mtd, struct nand_chip
*this, int state);

/*
计算 ECC 码操作 */

int            (*calculate_ecc)(struct
mtd_info *mtd, const u_char *dat,
u_char

*ecc_code);

/*
数据纠错操作 */

int            (*correct_data)(struct mtd_info *mtd, u_char *dat, u_char *read_ecc,
u_char *calc_ecc);

/*
开启硬件 ECC */

void           (*enable_hwecc)(struct
mtd_info *mtd, int mode);

/* 擦除操作     */

void           (*erase_cmd)(struct
mtd_info *mtd, int page);

/* 检查坏块表   */

int            (*scan_bbt)(struct
mtd_info *mtd);

int            eccmode;   /* ECC 模式      */

int            eccsize;   /* ECC 计算时使用的字节数 */

int            eccbytes;  /*
ECC 码的字节数 */

int            eccsteps;  /*
ECC 码计算的步骤数 */

int            chip_delay;
/* 芯片的延迟时间 */ spinlock_t               chip_lock;  /*
芯片访问的自旋锁 */ wait_queue_head_t wq;            /* 芯片访问的等待队列 */ nand_state_t  state;  /*
Nand Flash 状态 */

int            page_shift; /* 页右移的位数,即 column
地址位数 */

int            phys_erase_shift; /* 块右移的位数, 即 column 和页一共的地址位数 */ int               bbt_erase_shift; /* 坏块页表的位数 */

int            chip_shift; /* 该芯片总共的地址位数 */

u_char         *data_buf;  /*
数据缓冲区 */

u_char         *oob_buf;  /*
oob 缓冲区 */

int            oobdirty;  /*
oob 缓冲区是否需要重新初始化 */

u_char         *data_poi;  /* 数据缓冲区指针 */ unsigned int               options;   /*
芯片专有选项 */

int            badblockpos;/* 坏块标示字节在 OOB 中的位置 */

int            numchips;  /* 芯片的个数   */


unsigned


long


chipsize;


/*
在多个芯片组中, 一个芯片的大小 */


int


pagemask;


/* 每个芯片页数的屏蔽字, 通过它取出每个芯片包含多少个页 */


int


pagebuf;


/*
在页缓冲区中的页号 */

struct nand_oobinfo    *autooob; /* oob 信息 */ uint8_t  *bbt;                      /* 坏块页表 */
struct nand_bbt_descr               *bbt_td;
/* 坏块表描述 */

struct nand_bbt_descr  *bbt_md; /*
坏块表镜像描述 */

struct nand_bbt_descr  *badblock_pattern; /* 坏块检测模板 */
struct nand_hw_control *controller; /* 硬件控制 */

void           *priv;
/* 私有数据结构 */

/*
进行附加错误检查 */

int            (*errstat)(struct mtd_info *mtd, struct nand_chip *this, int state, int status, int page);

};

  1. mtd_info include/linux/mtd/mtd.h struct mtd_info {

u_char type;   /* 设备类型   */ u_int32_t flags; /* 设备标志位组 */ u_int32_t
size; /* 总共设备的大小 */ u_int32_t
erasesize;  /* 擦除块的大小 */

u_int32_t
oobblock; /* OOB 块的大小,如:512 个字节有一个 OOB */ u_int32_t oobsize; /* OOB数据的大小,如:一个 OOB 块有 16 个字节
*/ u_int32_t ecctype; /* ECC 校验的类型 */

u_int32_t eccsize;  /* ECC 码的大小  */

char
*name;        /* 设备名称       */

int
index;         /* 设备编号       */

/* oobinfo
信息,它可以通过 MEMSETOOBINFO ioctl 命令来设置 */ struct nand_oobinfo oobinfo;

u_int32_t
oobavail;  /* OOB区的有效字节数,为文件系统提供 */

/* 数据擦除边界信息         */
int numeraseregions;

struct mtd_erase_region_info *eraseregions;

u_int32_t
bank_size; /* 保留 */

/*
擦除操作 */

int (*erase) (struct mtd_info *mtd,
struct erase_info *instr);

/* 指向某个执行代码位置 */

int (*point) (struct mtd_info *mtd,
loff_t from,

size_t len, size_t *retlen, u_char **mtdbuf);

/*
取消指向 */

void (*unpoint)
(struct mtd_info *mtd, u_char *
addr, loff_t from, size_t len);

/*
读/写操作 */

int (*read) (struct
mtd_info *mtd, loff_t
from, size_t len, size_t *retlen, u_char *buf); int (*write) (struct mtd_info
*mtd, loff_t to, size_t
len,

size_t *retlen, const u_char *buf);

/* 带 ECC 码的读/写操作 */

int
(*read_ecc) (struct mtd_info
*mtd, loff_t from, size_t len,
size_t *retlen, u_char *buf,
u_char *eccbuf, struct nand_oobinfo *oobsel);

int (*write_ecc) (struct mtd_info
*mtd, loff_t to, size_t len, size_t *retlen,
const u_char *buf, u_char *eccbuf, struct
nand_oobinfo *oobsel);

/* 带 OOB 码的读/写操作 */

int
(*read_oob) (struct mtd_info
*mtd, loff_t from, size_t len,
size_t *retlen, u_char *buf);

int
(*write_oob) (struct mtd_info
*mtd, loff_t to, size_t
len, size_t *retlen, const u_char *buf);

/* 提供访问保护寄存器区的方法 */

int (*get_fact_prot_info) (struct
mtd_info *mtd, struct
otp_info *buf, size_t
len); int (*read_fact_prot_reg) (struct
mtd_info *mtd, loff_t
from, size_t len,

size_t *retlen, u_char *buf);

int (*get_user_prot_info) (struct
mtd_info *mtd, struct
otp_info *buf, size_t
len); int (*read_user_prot_reg) (struct
mtd_info *mtd, loff_t
from, size_t len,

size_t *retlen, u_char *buf);

int (*write_user_prot_reg) (struct
mtd_info *mtd, loff_t from, size_t len,

size_t *retlen, u_char *buf);

int (*lock_user_prot_reg) (struct
mtd_info *mtd, loff_t from, size_t len);

/* 提供 readv
和 writev 方法         */

int
(*readv) (struct mtd_info
*mtd, struct kvec *vecs, unsigned long count, loff_t from, size_t *retlen);

int
(*readv_ecc) (struct mtd_info
*mtd, struct kvec *vecs, unsigned long count, loff_t from, size_t *retlen, u_char *eccbuf,

struct nand_oobinfo *oobsel);

int (*writev) (struct mtd_info *mtd, const struct kvec *vecs, unsigned long count, loff_t to, size_t *retlen);

int (*writev_ecc) (struct mtd_info
*mtd, const struct kvec *vecs,
unsigned long count, loff_t to, size_t *retlen, u_char *eccbuf, struct
nand_oobinfo *oobsel);

/*
同步操作 */

void (*sync) (struct mtd_info *mtd);

/* 芯片级支持的加/解锁操作 */

int (*lock) (struct mtd_info *mtd, loff_t ofs, size_t len);
int (*unlock) (struct mtd_info *mtd, loff_t ofs, size_t len);

/* 电源管理操作           */

int (*suspend) (struct mtd_info *mtd); void (*resume) (struct mtd_info *mtd);

/* 坏块管理操作           */

int (*block_isbad) (struct mtd_info *mtd, loff_t ofs); int (*block_markbad) (struct mtd_info *mtd, loff_t ofs);

/* 重启前的通知事件        */

struct
notifier_block reboot_notifier; void *priv; /* 私有数据结构 */

struct module
*owner; /* 模块所有者 */ int usecount; /* 使用次数 */

};

原文地址:https://www.cnblogs.com/fanweisheng/p/11106199.html

时间: 2024-08-13 03:10:09

Linux 通用数据结构说明的相关文章

linux内核数据结构学习总结(undone)

本文旨在整理内核和应用层分别涉及到的数据结构,从基础数据结构的角度来为内核研究作准备,会在今后的研究中不断补充 目录 1. 进程相关数据结构 1) struct task_struct 2. 内核中的队列/链表对象 3. 内核模块相关数据结构 2) struct module 1. 进程相关数据结构 0x1: task_struct 我们知道,在windows中使用PCB(进程控制块)来对进程的运行状态进行描述,对应的,在linux中使用task_struct结构体存储相关的进程信息,task_

Unix Linux 通用vi命令,使用帮助手册【珍藏版

Unix Linux 通用vi命令,使用帮助手册[珍藏版] Vi 简介 Vi 是 Unix 世界里极为普遍的全萤幕文书编辑器,几乎可以说任何一台 Unix 机器都会提供这套软体.Linux 当然也有,它的 vi 其实是 elvis(版权问题),不过它们都差不多.熟悉 DOS 下的文书处理後,也许会感到 vi 并不好用:Unix 上也已经发展出许多更新.更好用的文书编辑器,但是并不一定每一台 Unix 机器上都会安装这些额外的软体.所以,学习 vi 的基本操作还是有好处,让你在各个不同的机器上得心

linux 通用时钟框架CCF

linux 通用时钟框架CCF 简介 这里讲的时钟是给soc各组件提供时钟的树状框架,并不是内核使用的时间,和其他模块一样,clk也有框架,用以适配不同的平台.适配层之上是客户代码和接口,也就是各模块(如需要时钟信号的外设,usb等)的驱动.适配层之下是具体的soc平台的时钟操作细节. 内核中另外一个具有类似树状框架特点的是regulator框架.对比regulator框架,clk框架不确定性更大,内核中仅仅提供了少数的适配规范,struct clk都是各平台自己的clk驱动实现.       

Go语言移植Linux内核数据结构hlist

hlist(哈希链表)可以通过相应的Hash算法,迅速找到相关的链表Head及节点. 在有些应用场景,比Go标准库提供的list(一种双向链表)更合适. 依照list.h中的源码,我实现了一个Go语言版本的hlist例子. 首先说下hlist的构成:             在hlist(哈希链表)中, 头结点使用struct hlist_head来表示,hlist_head仅一个first指针. 普通节点使用struct hlist_node来表示. 源码中有几个特别的地方: 1. 在stru

一步一步写算法(之通用数据结构)

原文:一步一步写算法(之通用数据结构) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 上一篇博客介绍了通用算法,那么有了这个基础我们可以继续分析通用数据结构了.我们知道在c++里面,既有数据又有函数,所以一个class就能干很多事情.举一个简单的例子来说,我们可以编写一个数据的class计算类. class calculate{ int m; int n; public: calculate():m(0),n(0) {} calcula

AT&T汇编语言与GCC内嵌汇编,Linux内核数据结构之链表

最近在看<Linux内核源代码情景分析>,作者毛德操.书中刚开始介绍了AT&T汇编语言与GCC内嵌汇编,以及Linux内核数据结构之链表.可惜书中介绍的不够全面.因为推荐大家阅读下面两篇文章.很不错. AT&T汇编语言与GCC内嵌汇编:http://grid.hust.edu.cn/zyshao/Teaching_Material/OSEngineering/Chapter2.pdf. Linux内核数据结构之链表:http://www.cnblogs.com/Anker/p/

Linux通用小技能

Linux通用小技能 前言 无论你用ubuntu还是centos,通通没问题,运维这东西,踩坑写文档就是了. 小技能 新磁盘挂载 不管是阿里云还是腾讯云,还是自己的机器,请记住这条命令. mkfs.ext4 /dev/vdb echo '/dev/vdb /opt ext4 defaults 0 0' >> /etc/fstab mount -a 不得不装的语言 无论你们家用什么开发语言,总有工具或环境依赖可爱的Java.那么: 安装Java下载:http://download.oracle.

Linux 内核数据结构:双向链表

Linux 内核提供一套双向链表的实现,你可以在 include/linux/list.h 中找到.我们以双向链表着手开始介绍 Linux 内核中的数据结构 ,因为这个是在 Linux 内核中使用最为广泛的数据结构,具体你可以 查看 这里. 首先让我们看一下主要的结构体: struct list_head { struct list_head *next, *prev; }; 你可以看到其与常见的结构体实现有显著不同,比如 glib 中所使用到的双向链表实现. struct GList { gp

Linux 内核数据结构:Linux 双向链表

Linux 内核提供一套双向链表的实现,你可以在 include/linux/list.h 中找到.我们以双向链表着手开始介绍 Linux 内核中的数据结构 ,因为这个是在 Linux 内核中使用最为广泛的数据结构,具体你可以 查看 这里. 首先让我们看一下主要的结构体: struct list_head { struct list_head *next, *prev; }; 你可以看到其与常见的结构体实现有显著不同,比如 glib 中所使用到的双向链表实现. struct GList { gp