Nouveau源码分析(二)

在讨论Nouveau对Nvidia设备的初始化前,我准备先说一下Nouveau结构体的基本框架

Nouveau的很多结构体都可以看作是C++中的类,之间有很多相似的东西,比如继承关系,virtual成员函数等.

模拟继承

先尝试阅读一下这个代码:

#include <stdlib.h>struct abc
{int a;int b;int c;
};struct def
{struct abc base;int d;int e;int f;
};#define abc_create(a,b,c,pabc) \abc_create_(a,b,c,sizeof(**pabc),(void **)pabc)int abc_create_(int a,int b,int c,size_t size,void **pabc)
{struct abc *abc_ = (struct abc *)malloc(size); //按传入的size分配空间abc_->a = a;abc_->b = b;abc_->c = c; //初始化自身*pabc = abc_;return 0;
}#define def_create(a,b,c,d,e,f,pdef) \def_create_(a,b,c,d,e,f,sizeof(**pdef),(void **)pdef) //获得实际应分配空间大小int def_create_(int a,int b,int c,int d,int e,int f,size_t size,void **pdef)
{struct def *def_;abc_create_(a,b,c,size,pdef); //先初始化基类def_ = (struct def *)*pdef;def_->d = d;def_->e = e; //然后初始化自身def_->f = f;return 0;
}int main(void)
{struct def *d;def_create(1,2,3,4,5,6,&d);return 0;
}

Nouveau中大部分的结构体都是这种模式的,模拟C++的继承关系

当然一般还会有配套使用的宏,比如这个例子中可以有:

#define nv_abc(a) ((struct abc *)a)//使用方法:struct def *b;
//初始化b,做一些事情
nv_abc(b)->a = 7;

[注意:实际在nouveau代码中,还有一种关系是parent关系,这和此处讨论的继承关系无关]

模拟virtual函数

改造一下上面写的程序,改成这样:

#include <stdlib.h>
#include <stdio.h>struct oclass
{int (*test)(int); //类的test函数
};/****************abc****************/
struct abc
{struct oclass *oclass;int a;int b;int c;
};int abc_test(int a)
{return a * a;
}struct oclass abc_oclass = {abc_test}; //abc的test函数#define nv_abc(a) ((struct abc *)a)#define abc_create(a,b,c,pabc) \abc_create_(&abc_oclass, \a,b,c,sizeof(**pabc),(void **)pabc)int abc_create_(struct oclass *oclass,int a,int b,int c,size_t size,void **pabc)
{struct abc *abc_ = (struct abc *)malloc(size);abc_->a = a;abc_->b = b;abc_->c = c;abc_->oclass = oclass;*pabc = abc_;return 0;
}/****************def****************/
struct def
{struct abc base;int d;int e;int f;
};int def_test(int a)
{return a;
}struct oclass def_oclass = {def_test}; //def的test函数#define nv_def(a) ((struct def *)a)#define def_create(a,b,c,d,e,f,pdef) \def_create_(a,b,c,d,e,f,sizeof(**pdef),(void **)pdef)int def_create_(int a,int b,int c,int d,int e,int f,size_t size,void **pdef)
{struct def *def_;abc_create_(&def_oclass,a,b,c,size,pdef);def_ = (struct def *)*pdef;def_->d = d;def_->e = e;def_->f = f;return 0;
}int main(void)
{struct def *d;struct abc *a;def_create(1,2,3,4,5,6,&d);abc_create(1,2,3,&a);printf("%d %d\n",nv_abc(d)->oclass->test(3),nv_abc(a)->oclass->test(3)); //尝试执行return 0;
}

利用这个,就可以用同一个接口nouveau_object,实现对很多不同设备模块的访问

使用标识符获得oclass

还有一种情况,传递参数时传递的是"u32 oclass",而不是"struct nouveau_oclass *oclass",这种情况就要依照parent向上搜索,得到具体的oclass

此处不展开讨论,等看到那部分代码再详细说明

Nouveau源码分析(二):Nouveau结构体的基本框架相关推荐

  1. Nouveau源码分析(三):NVIDIA设备初始化之nouveau_drm_probe

    Nouveau源码分析(三) 向DRM注册了Nouveau驱动之后,内核中的PCI模块就会扫描所有没有对应驱动的设备,然后和nouveau_drm_pci_table对照. 对于匹配的设备,PCI模块 ...

  2. 【投屏】Scrcpy源码分析二(Client篇-连接阶段)

    Scrcpy源码分析系列 [投屏]Scrcpy源码分析一(编译篇) [投屏]Scrcpy源码分析二(Client篇-连接阶段) [投屏]Scrcpy源码分析三(Client篇-投屏阶段) [投屏]Sc ...

  3. Android Q 10.1 KeyMaster源码分析(二) - 各家方案的实现

    写在之前 这两篇文章是我2021年3月初看KeyMaster的笔记,本来打算等分析完KeyMaster和KeyStore以后再一起做成一系列贴出来,后来KeyStore的分析中断了,这一系列的文章就变 ...

  4. 【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 二 )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

  5. SpringBoot源码分析(二)之自动装配demo

    SpringBoot源码分析(二)之自动装配demo 文章目录 SpringBoot源码分析(二)之自动装配demo 前言 一.创建RedissonTemplate的Maven服务 二.创建测试服务 ...

  6. gSOAP 源码分析(二)

    gSOAP 源码分析(二) 2012-5-24 flyfish 一 gSOAP XML介绍 Xml的全称是EXtensible Markup Language.可扩展标记语言.仅仅是一个纯文本.适合用 ...

  7. ENS最新合约源码分析二

    ENS(以太坊域名服务)智能合约源码分析二 0.简介 ​ 本次分享直接使用线上实际注册流程来分析最新注册以太坊域名的相关代码.本次主要分析最新的关于普通域名注册合约和普通域名迁移合约,短域名竞拍合约不 ...

  8. nginx源码分析—内存池结构ngx_pool_t及内存管理

    本博客( http://blog.csdn.net/livelylittlefish)贴出作者(阿波)相关研究.学习内容所做的笔记,欢迎广大朋友指正! Content 0.序 1.内存池结构 1.1 ...

  9. Vue.js 源码分析(二十三) 指令篇 v-show指令详解

    v-show的作用是将表达式值转换为布尔值,根据该布尔值的真假来显示/隐藏切换元素,它是通过切换元素的display这个css属性值来实现的,例如: <!DOCTYPE html> < ...

最新文章

  1. loadrunner用javavuser进行接口测试
  2. MFC CString转换为字符数组
  3. 哪个更值得入手?荣耀8与小米6对比评测
  4. ubuntu16 redis5.0以前版本集群部署示例
  5. 一步一步学Remoting系列文章
  6. 【AI视野·今日CV 计算机视觉论文速览 第206期】
  7. 关闭mysql权限管理_MySQL系列:用户及权限管理
  8. python修饰符的理解_python函数修饰符@的使用方法解析
  9. 苦口之药的拼音及解释
  10. android 百度地图覆盖物popupwindow自动弹出,android实现百度地图自定义弹出窗口功能...
  11. IOS开发笔记 IOS如何访问通讯录
  12. trivy【1】漏洞扫描工具安装
  13. 为electron添加Chrome扩展程序
  14. 178685-33-1,Azide-PEG3-Tos叠氮化物(N3)基团通过点击化学与炔烃、BCN、DBCO反应
  15. 关于阿里云对象存储OSS流量包说明
  16. C语言代码行数分类统计小程序(源代码)
  17. Java开发环境搭建步骤
  18. 地址转换和端口映射及内网穿透的区别
  19. videobuf2相关的videobuf-vmalloc.c 中内存分配kmalloc使用
  20. VScode下使用MySQL

热门文章

  1. 操作系统 | Minix安装及环境配置(Windows10)
  2. 蒙特卡洛算法学习笔记
  3. 发生异常: ModuleNotFoundError No module named ‘gym.envs.atari‘
  4. 刀锋战士,智能时代的守护者
  5. 好玩的js小球弹弹撞
  6. 【Electron-vue】构建桌面应用(23)- Error: spawn EACCESS
  7. ATT CORD架构解读
  8. 工控网络安全产品---学习笔记
  9. linux必需掌握的基础(二)
  10. [Vijos1579]宿命的PSS