Linux创始人数据结构,Linux 通用数据结构说明

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); /* 恢复 */

};

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);  /*

释放设置方法 */

};

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;      /* 等待队列    */

};

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

};

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; /* 使用次数 */

};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/534772.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python在浏览器运行一片空白_Webdriver启动Firefox浏览器后,页面显示空白

在使用pycharm码代码时编译总是出错,后来验证发现浏览器启动后出现问题。白白耗了我2个小时。我把我的解决方案写出来,希望对大家有帮助。1.现象:起初安装的时候总是能正常运行,有一天突然发现Webdriver打开fFirefox浏览器后&…

centos linux7修改主机名,CentOS7操作系统下永久修改主机名

操作系统:CentOS Linux release 7.8任务:修改主机名为sky9899操作步骤如下:[root146 ~]# hostname*.*.*.*.adsl-pool.jx.chinaunicom.com[root146 ~]# hostnamectlStatic hostname: localhost.localdomainTransient hostname: *.*.*.*.adsl-…

稀疏自编码器_自编码(AutoEncoder)模型及几种扩展之二

4. 稀疏自编码假设我们只有一个没有类别标签的训练样本集合{x(1),x(2)...},一个自编码神经网络就是一种非监督学习算法,它使用BP算法,并将目标值设为: y(i)x(i)。我们的目标是希望得到hW,b(X)≈x。用aj(2)(x)表示输入向量x对隐藏层单元j的激活…

linux x86 关机 过程,linux在x86上的中断处理过程(详细)

Linux在x86上的中断处理过程一:引言在Intel的文档中,把中断分为两种。一种是异常,也叫同步同断。一种称之为中断,也叫异常中断。同步中断指的是由CPU控制单元产生,之所以称之为同步,是因为只有一条指令执行完毕后才会发出中断。例如除法运算中,除数为零的时候,就会产…

thymealf 高级用法_Thymeleaf

JSP 已经存在很长时间了,很多公司还在用,它看起来像 HTML,但其实并不是,它有一些缺陷。比如,每个页面顶部都需要有如下声明与 Servlet 规范紧密耦合的,依赖 Servlet 容器(意味着无法直接浏览效果)。工作过的…

linux 显卡转码,ffmpeg用GPU转码

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?有些视频编码太屌,播放起来对CPU消耗巨大,而在电视上或者电视盒子上看视频,编码就需要合适,楼主用的FireTV Stick&a…

ant实例 jmeter_Jmeter+ant搭建环境

1.将jmeter3.3和ant1.9.6放在一个文件夹下2.配置环境a、安装jdk,配置环境变量变量名: JAVA_HOME变量值: C:\Program Files\Java\jdk1.8.0_91 (即jdk安装的位置)变量名: Path (这个变量名已在系统变量中存在,现只需在这…

c语言课程设计作业五子棋,C语言课程设计报告五子棋游戏课程设计

C语言课程设计报告五子棋游戏课程设计 C语言课程设计报告_五子棋游戏-课程设计C语言课程设计报告_五子棋游戏|c语言程序代码编程小程序设计|c语言课程设计报告课程案例**********************************************************//* 本程序在Turbo C或Borland C下编译通过 */…

sqlmap图形化_Web安全:SQL注入工具

原标题:Web安全:SQL注入工具SQL注入工具主要是针对Web服务器后台数据库的注入,其主要目的是获取数据库中的数据。以前常用的SQL注入工具有啊D注入工具及Domain(明小子注入工具),现在常用的SQL注入工具有HackBar、SQLMap、Pangolin…

在c语言程序中 对文件进行操作首先要,《C语言程序设计》试题八及答案

版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如果有侵权请立即联系:55525090qq.com,我们立即下架或…

vue中多行文本标签_vue控制多行文字展开收起的实现示例

这里讲一下,如何使用vue控制多行文字展开收起(也叫控制文字展开隐藏)。效果:这里设置了控制三行,如果超过三行会展示,“显示更多” 超出文字显示省略号。点击“显示更多”会展开所有文案,按钮变成“收起”(未超出三行的…

c语言什么时候需要加分号,归纳一下html中什么时候需要分号什么时候需要冒

公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解。话题:归纳一下html中什么时候需要分号什么时候需要冒号什么时候问题详情:最近初学html和php,弄晕了回答:一般情况下,HTML…

python wheel使用_【转载】Python,使用Wheel打包

转载自: http://blog.sina.com.cn/s/blog_1318255b00102wbtz.htmlPython的第一个主流打包格式是.egg文件,现在大家庭中又有了一个叫做Wheel(*.whl)的新成员。wheel“被设计成包含PEP 376兼容安装(一种非常接近于磁盘上的格式)的所有文件”。在本文中&…

c语言提取七位数讲解,C语言-体育彩票7位数,感受身中500万的fell

//体育彩票7位数,感受身中500万的fell#include #include #include #include //用到随机数函数#include int main(){int iUser[7]; //保存我们购买彩票的号码int iSys[7];//保存开奖的号码int i, j;int count 0;//保存我们中奖号码的个数//srand((unsigned)time(0…

cuda linux编译器_linux下如何编译CUDA+QT(qtcreator下)

具体操作,修改qt项目配置文件pro,在配置后面加入如下代码,我们就实现了qtcuda的交叉编译。# 让你的项目可以看到后缀cu的cuda代码文件OTHER_FILES ./Bll/ImageReconstruction/Cuda/CudaFDK.cu \./Bll/ImageReconstruction/Cuda/CudaFDK_ker…

linux的sonar安装,Linux安装sonar

前置依赖​ mysql 5.6 or 5.7​ jdk 1.81.下载2.安装unzip并解压sonarqube并移动到/usr/localyum install unzipunzip sonarqube-6.7.4.zipmv sonarqube-6.7.4 /usr/local/3.mysql里新增数据库CREATE DATABASE sonar DEFAULT CHARACTER SET utf8;4.修改sonarqube相应的配置vim …

redis内存淘汰和持久化_redis 持久化

一、RDB持久化(一)、RDB介绍可以在指定的时间间隔内生成数据集的 时间点快照(point-in-time snapshot),新快照会覆盖老快照(二)、优点压缩格式,恢复速度快,适合于用做备份…

android实现后台静默安装,Android 静默安装实现方法

Android静默安装的方法,静默安装就是绕过安装程序时的提示窗口,直接在后台安装。注意:静默安装的前提是设备有ROOT权限。代码如下:/*** 静默安装* param file* return*/public boolean slientInstall(File file) {boolean result …

pythonwrite连续写入_python文件写入write()的操作

本文实例为大家分享了python文件写入write()的操作的具体代码,供大家参考,具体内容如下filename pragramming.txtwith open(filename,w) as fileobject: #使用‘w来提醒python用写入的方式打开fileobject.write(i love your name!\ni love your cloth!\…

最新变态传奇android,新开变态传奇单职业

新开变态传奇单职业这款传奇手游中拥有这极为丰富的游戏玩法,玩家既可以进入各种副本中,挑战那些强大的副本boss,也可以和自己的兄弟好友们一起组队,前往各种跨服战场,和全服的高手玩家们一起进行最激烈的战斗。游戏中…