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

本文深入探讨Nouveau源码,重点解析其如何通过模拟继承和虚拟函数来构建C++类似的结构。文章首先介绍模拟继承的概念,展示了相关代码示例,接着讲解了如何实现模拟虚拟函数,以及如何利用标识符获取oclass来实现对不同设备模块的统一访问。尽管Nouveau代码中还存在parent关系,但本文主要聚焦于继承和虚拟函数的模拟实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
### 安装 NVIDIA 驱动前的准备 在 CentOS 系统上安装 NVIDIA 驱动之前,需要完成一些准备工作以确保系统的稳定性和兼容性。这些工作主要包括禁用 Nouveau 开源驱动以及设置必要的编译环境。 #### 禁用 Nouveau 驱动 由于 NouveauLinux 默认加载的一个开源显卡驱动,它与 NVIDIA 的官方闭源驱动存在冲突,因此必须先将其禁用。可以通过以下命令确认系统当前是否启用了 Nouveau: ```bash lsmod | grep nouveau ``` 如果上述命令返回任何结果,则说明 Nouveau 正在运行。此时可以编辑 `/etc/default/grub` 文件来修改引导参数,从而永久禁用该模块[^2]。具体操作如下: 1. 打开 GRUB 配置文件: ```bash sudo vi /etc/default/grub ``` 2. 在 `GRUB_CMDLINE_LINUX` 参数中加入以下选项: ``` rd.driver.blacklist=nouveau modprobe.blacklist=nouveau nomodeset ``` 3. 更新 GRUB 并重启计算机: ```bash sudo grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg sudo reboot ``` 重新启动之后再次执行 `lsmod | grep nouveau` 命令验证其已被成功移除。 #### 下载并安装 NVIDIA 驱动 当完成了以上前置条件后就可以正式开始下载和安装过程了。以下是具体的实施方法: ##### 方法一:通过 YUM 或 DNF 软件包管理器自动获取最新版本 这是最简便的方式之一,在线检索适合本机硬件架构的最佳匹配项。 对于 CentOS 7 使用 yum 工具;而对于更高版本比如 CentOS Stream 则推荐采用 dnf 替代之。 - 添加 EPEL 和 ELRepo 存储库以便访问更多第三方资源: ```bash sudo yum install epel-release sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org sudo rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-5.el7.elrepo.noarch.rpm ``` - 查询可用的 nvidia-driver 版本列表: ```bash yum list available nvidia* ``` - 根据查询到的结果选定目标进行实际部署: ```bash sudo yum install nvidia-driver ``` ##### 方法:手动离线方式 适用于网络受限或者希望指定特定修订号的情况。 前往[NVIDIA官方网站](https://www.nvidia.com/)找到对应的操作系统平台链接地址下载 tarball 归档压缩包形式的数据集。解压后遵循 README 文档指示逐步推进直至结束。 注意:此途径可能涉及额外依赖关系解决环节,例如 GCC 编译工具链、Kernel 头文件集合等均需提前准备好才行[^1]。 最后一步始终记得更新 initramfs 映像缓存结构体并且激活服务单元: ```bash sudo dracut --force sudo systemctl enable gdm.service sudo systemctl set-default graphical.target reboot now ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值