行情
HOME
行情
正文内容
nand驱动 linux 程序员笔记:LINUX安装NVIDIA驱动程序
发布时间 : 2024-11-23
作者 : 小编
访问数量 : 23
扫码分享至微信

程序员笔记:LINUX安装NVIDIA驱动程序

众所周知,Linux发行版繁多,不同版本之间差异奇大,对Nvidia驱动的支持也是良莠不齐。

作为一个Linux发行版,如何集成一个可用的显卡驱动是一个不得不面对的问题。N卡的Linux驱动分为开源驱动和闭源驱动。开源驱动就是大名鼎鼎的nouveau。

在法文中,Nouveau的意思相当于"new",就是新的意思,是一个由爱好者组织的针对Nvidia显卡开发的第三方开源3D驱动的共同项目,并且nouveau是在完全没有得到NVIDIA任何支持的情况下进行开发的,Nouveau算是X.Org基金会的一个项目(注:X.Org基金会是负责X Window System开发的社团,2004年1月22日在Open Group的X.org网站基础上建立。 )。开发所用方式我们也都很熟悉,和创新声卡kX驱动当年开发的方法类似,反编译Nvidia的Linux显卡驱动,然后进行再加工深处理的进一步开发工作。

由于其开源特性,Nouveau是是Linux KMS驱动的一部分,最新的版本在Linux内核中支持Nvidia的帕斯卡构架。

但是,其与NVIDIA官方驱动存在冲突,并且会影响GPU运行的可靠性。因此,对于显卡使用需求不高的用户,可以考虑直接使用Linux KMS集成的nouveau驱动。但对于游戏、高性能计算、3D渲染等场景,则需要使用Nvidia GPU官方驱动。

在Linux系统中安装NVIDIA显卡驱动前,建议先卸载Linux系统自带的显卡驱动nouveau。

# 查看是否开启

lsmod | grep nouveau

#不同Linux系统nouveau驱动禁用方式

Ubuntu

创建文件/etc/modprobe.d/blacklist-nouveau.conf,添加如下文本:blacklist nouveauoptions nouveau modeset=0重新生成initramfs$ sudo update-initramfs -u

Fedora

创建文件/usr/lib/modprobe.d/blacklist-nouveau.conf,添加如下文本:blacklist nouveauoptions nouveau modeset=0重新生成initramfs。$ sudo dracut --force

RHEL/CentOS

创建文件/etc/modprobe.d/blacklist-nouveau.conf,添加如下文本:blacklist nouveauoptions nouveau modeset=0重新生成initramfs$ sudo dracut --force

OpenSUSE

创建文件/etc/modprobe.d/blacklist-nouveau.conf,添加如下文本:blacklist nouveauoptions nouveau modeset=0重新生成initrd$ sudo /sbin/mkinitrd

SLES

SLES中未安装nouveau驱动。

#重启电脑

reboot

#验证是否屏蔽成功

lsmod | grep nouveau

成功禁用nouveau后,到官网下载对应版本驱动的.run文件,进行Nvidia闭源驱动的安装

#安装驱动

./NVIDIA-Linux-x86_64-515.76.run

如果希望命令行静默安装,则

./NVIDIA-Linux-x86_64-515.76.run -s

在安装过程中,最后会提示我们安装 xconfig, 这时候果断选"no"。

显卡驱动里集成的opengl版本可能与Linux桌面环境的opengl版本冲突,则

./NVIDIA-Linux-x86_64-515.76.run --no-opengl-files

#查看显卡基本信息:

nvidia-smi

nvidia-smi展示显卡状态

如果可以看到显卡的信息,那么这次安装的驱动就可以正常打开了。

Linux 的启动流程

本篇的重点是讲解设备和驱动的启动流程,设备和驱动的流程是整个内核启动的核心,也是工作中最常面对的问题。出于知识点的系统性考虑,在进入主题之前我们先看下整个 Linux 在 ARM 中的启动流程如何。

Uboot 的启动流程

ARM Linux 的启动流程大致为:Uboot → Kernel → Root filesystem。Uboot 在上电的时候就拿到 CPU 的控制权,实现了硬件的初始化。具体是怎么实现的呢?一起来看一下,CPU 的内部集成了小容量的 Sram,而 PC 指针一上电就指向 Sram 的起始地址 0x00000000,所以一上电 Uboot 代码就得到了运行。

Uboot 拿到 CPU 使用权就开始做初始化工作,比如关闭看门狗、设置 CPU 运行模式、设置堆栈、初始化内存、网卡、nand flash 等,最后把 Linux 内核加载到内存中。

初始化 RAM

因为内核要在 RAM 中运行,所以在调用内核之前必须初始化和设置 RAM,为调用内核做好准备。

初始化串口

内核在启动过程中可以将信息通过串口输出,这样就可以清楚的知道内核启动信息。虽然串口不是 Uboot 必须要完成的工作,但是通过串口可以方便调试 Uboot 和内核的各种信息。

检测处理器类型

Uboot 在调用内核前需要检测系统的处理器类型,并将其保存在某个变量中提供给内核,内核在启动过程中会根据该处理器的类型调用相应的初始化程序。

设置内核启动参数

内核在启动过程中会根据该启动参数进行相应的初始化工作。

调用内核镜像

值得注意的是存储 Uboot 的存储器不同,Uboot 的执行过程也并不相同,一般来讲 Flash 分为 nor Flash 和 nand Flash 两种:nor Flash 支持芯片内执行(XIP,eXecute In Place),这样代码可以在 Flash 上直接执行而不必复制到 RAM 中去执行。

但是 nand Flash 并不支持 XIP,所以要想执行 nand Flash 上的代码,必须先将其复制到 RAM 中去,然后跳到 RAM 中去执行。如果内核存放在 nor Flash 中,那么可直接跳转到内核中去执行。但通常由于在 nor Flash 中执行代码会有种种限制,而且速度也远不及 RAM 快,所以一般的嵌入式系统都是将内核复制到 RAM 中,然后跳转到 RAM 中去执行。不论哪种情况,在跳到内核执行之前 CPU 的寄存器必须满足以下条件:r0 = 0,r1 = 处理器类型,r2 = 标记列表在 RAM 中的地址。

Linux 内核的启动流程(设备和驱动的加载)

关于 Uboot 的启动本课程不做详细介绍,因为本课程的主要内容是内核。在讲述内核启动之前让我们先了解下内核的组成结构:

其中,

(1)vmlinusx 是 ELF 格式的 Object 文件,这种文件只是各个源代码经过连接以后得到的文件,并不能在 ARM 平台上运行。

(2)经过 objcopy 这个工具转换以后,得到了二进制格式文件 Image,Image 文件相比于 vmlinusx 文件,除了格式不同以外,还被去除了许多注释和调试的信息。

(3)Image 文件经过压缩以后得到了 piggy.gz,这个文件仅仅是 Image 的压缩版,并无其他不同。

(4)接着编译生成另外几个模块文件 misc.o、big_endian.o、head.o、head-xscale.o,这几个文件组成一个叫 Bootstrap Loader 的组件,又叫引导程序,编译生成 piggy.o 文件。

(5)最后 piggy.o 文件和 Bootstrap Loader 组成一个 Bootable Kernel Image 文件(可启动文件)。

经过上面的分析不难知道 piggy.o 就是内核镜像,而剩下的几个文件就组成了引导程序。知道了内核的组成结构,Uboot 就是按照内核的组成结构一层一层剥开然后引导内核的:

可以说 start_kernel之前的所有工作都是为了将环境准备好,满足start_kernel的要求,然后由start_kernel开始进行内核的加载:

关于 start_kernl函数的内容太多,可以通过红色回调函数看出,start_kernel函数基本是在回调很多对应的注册函数。为了本系列课程的结构性这里就不展开所有知识点讲解,本篇内容接着前一篇设备树的内容重点讲解下设备和驱动的匹配过程。

还记得上一篇讲到的设备树三大作用吗?

平台标识;

运行时配置;

设备信息集合。

接下来我们就看看内核在启动的时候是如何寻找设备,驱动又如何和设备绑定的。

首先在平台目录下可以看到有很多平台描述的文件,如图:

有那么多的平台,我们到底要执行哪个平台是首先要考虑的事情。这也是设备三大功能的第一个功能——平台标识。

设备树里有对设备根节点的 Compatible 描述,平台文件里有对 __initconst的描述,如果两个字段一致则找到了对应的板级文件,这样就通过设备树把要用的设备平台与其他平台区分开来了,如图:

找到平台后就可以根据回调函数的指针调用该平台的注册函数。这里以飞思卡尔 imx.6dl 平台为例,回调的时候会调用 imx6q_init_machine函数,如下:

这里补充一个知识点,细心的读者也许发现了在 Compatible 字段里用逗号分隔了两个字符串。板级匹配的时候用的是哪个字符串,另外一个字符串又是做什么用?首先后面的字段 "fsl,imx6dl" 是抽象共用平台描述符,前面的字段 "fsl,imx6dl-sabresd" 是通用平台下的具体平台描述符,可以理解为母板和子板的区别。在具体的子板文件中我们可以通过前面的字段进行设备信息的获取,如图:

接着是运行时配置,让内核在启动的时候根据参数设置进行不同的处理。有经验的读者清楚在 Uboot 里也有对 Bootargs 的配置,这里为什么多此一举呢,是为了在 Uboot 中更灵活的对内核启动进行配置。

最后的作用就是设备信息集合,这是设备和驱动匹配的核心,也是工作中面对最多的情况。出于这一作用的内容是工作中经常遇到的重点也是难点,我们专门用一篇内容来详细讲解各级设备是如何展开的,并且手把手教你如何定制一套自己的开发板全新案例。

相关问答

and nuio是操作系统吗?

是个独立操作系统来的,直接安装到硬盘的。安装完就接管硬件,然后可以在它的虚拟平台上面安装Windowslinux等系统。是个虚拟机管理器,不过不需要依赖其他的...

linux 系统无法安装打印机 驱动 ?

别找了没有的。我也找了N年了。linux下的驱动基本没有。试试三星的产品吧,大多数都有LINUX驱动。别找了没有的。我也找了N年了。linux下的驱动基本没有。试...

如何在Fedora Linux 上安装NVIDIA 驱动 ?

这类问题从15年前就有,网上一搜一把。就不会搜搜?另外,不会去fedora社区看看诸如新手入门之类的文档?安装N卡驱动,A卡驱动,应该是经典文章之一吧?好好学学...

linux 不需要 驱动 吗?

linux也是需要驱动程序的。驱动程序是操作系统操作控制特定硬件的一个中间层,他给和操作系统对接来控制具体的硬件。因为不同的硬件是由不同的厂商开发的,里...

linux驱动 程序是什么?

Linux驱动程序是一种软件模块,用于管理系统硬件设备和与之交互。它们控制着硬件操作,使操作系统能够和硬件设备通信,管理和监视设备。Linux系统中各种设备通常...

请问怎么安装windows linux 双系统?

并没有结束!正常安装完了之后,进入不了桌面,卡死在登陆界面,这还是显卡驱动问题。Ubuntu系统集成的显卡驱动程序是nouveau,我们需要先将nouveau从linux内核...正...

amd怎么用 linux ?

AMD可以通过在Linux上安装适当的驱动程序来使用。首先,了解您的AMD显卡型号并检查Linux的兼容性。然后,从AMD官网下载适当的驱动程序,并按照说明安装。一旦...

Linux驱动 工程师需要掌握哪些驱动子系统?

作为一名Linux驱动工程师,你需要掌握以下几个重要的驱动子系统:1.内核基础知识:了解Linux内核的基本概念、架构和组织结构,包括进程管理、内存管理、文件系...

Deepin Linux 怎么样?能够代替XP吗? - 红网问答

深度的Linux系统叫做LinuxDeepin,在本地化和图形界面方面确实是做得非常好的,不止是在国内,全球众多的Linux发行版中,Deepin都是拔尖的那一群,不知...

Linux 系统基本上不需要装 驱动 。这是为何!-ZOL问答

内核自带了很多驱动。所以不用自己安装。有用(0)回复agykgzvneu就算是装上了,驱动也会是更新的这样讲容易明白些有用(0)回复dsjgtyokdavq支持的linux操...

 亲亲家园幸福里  张宗真简介 
王经理: 180-0000-0000(微信同号)
10086@qq.com
北京海淀区西三旗街道国际大厦08A座
©2024  上海羊羽卓进出口贸易有限公司  版权所有.All Rights Reserved.  |  程序由Z-BlogPHP强力驱动
网站首页
电话咨询
微信号

QQ

在线咨询真诚为您提供专业解答服务

热线

188-0000-0000
专属服务热线

微信

二维码扫一扫微信交流
顶部