[Kernel/Drive] 驱动分发是否需要更新内核
Tofloor
poster avatar
black_white_bear
deepin
2022-04-10 23:07
Author
  • 据我现在观察到,大家所遇到的大多数问题,稳定性和兼容性问题,很多都是驱动引起;且每次内核更新,都会声明增加了哪些新的驱动
  1. 那么,这是否意味着,每增加或删除驱动,都需要更新系统内核?
  2. 这是否意味着,如果,某一个设备厂商,想要在Linux上兼容设备,不仅需要关注于驱动本身,还需要关注系统本身?然后由系统分发商决定是否收集,然后发布与否?
  3. 如果以上二者均为真?那么,这也就意味着,一个被广泛使用的Linux发行版必须包括市面上大多数设备用到的所有驱动,才可以保证可靠的市场占有?或是,由厂商,维护多套不同的产品线去兼容不同类型的设备?
  4. 如果以上为真,那么是否可以修改内核,使驱动脱离内核运行,操作系统仅完成一般的设备引导和配置,驱动由设备厂商依据开发规范,自行调试发布
Reply Favorite View the author
All Replies
enforcee
deepin
2022-04-10 23:24
#1

在GNU/Linux系统上的驱动(指内核态驱动)是以内核模块(扩展名.ko)的形式存在,系统(udev)在检测到硬件后通过modprobe动态进行内核模块的安装和卸载。由于Linux内核的ABI并不是完全稳定的,所以通常不能只分发内核模块的方式直接发布驱动(因为这样不能保证兼容任何版本的Linux内核)。系统几乎所有开源驱动都是在编译Linux内核(linux-image)的时候一起编译出来(linux-modules),发布的时候也是捆绑发布的(但是你可以自己删减一些模块)。

目前的一种解决方法是通过dkms进行动态编译,发布驱动的时候自带一些源代码,然后针对每一个内核现场编译出内核模块来(因此需要在系统里安装Linux的头文件headers),dkms通常在内核版本升级的时候自动运行,由于Linux的API是比较稳定的,所以这种方法是比较普遍。(如nvidia闭源驱动,就是采用的dkms)

Reply View the author
心平气和
deepin
2022-04-10 23:25
#2
  1. Linux设备驱动需要使用内核API来实现
  2. 驱动可以编译到内核,随着内核一起在系统启动的时候被加载
  3. 也可以编译成内核模块,在系统运行起来之后动态地加载到内核中
Reply View the author
神末shenmo
deepin
Spark-App
Q&A Team
2022-04-10 23:39
#3

看一楼的

Reply View the author
Linux小白2019
deepin
2022-04-11 23:22
#4
神末shenmo

看一楼的

系统几乎所有开源驱动都是在编译Linux内核(linux-image)的时候一起编译出来(linux-modules),发布的时候也是捆绑发布的**(但是你可以自己删减一些模块)。**

或许这就是为什么我装20.2有声音,装20.2以后的任何版本都没有声音,因为20.2以后的版本可能删减了某些模块导致丢失了我的声卡驱动

Reply View the author
black_white_bear
deepin
2022-04-12 01:03
#5
Linux小白2019

系统几乎所有开源驱动都是在编译Linux内核(linux-image)的时候一起编译出来(linux-modules),发布的时候也是捆绑发布的**(但是你可以自己删减一些模块)。**

或许这就是为什么我装20.2有声音,装20.2以后的任何版本都没有声音,因为20.2以后的版本可能删减了某些模块导致丢失了我的声卡驱动

是啊,这样的话,有必要像Windows那样,维护一个驱动池;在系统检测更新时,根据本地的设备信息,匹配是否需要更新驱动

Reply View the author
enforcee
deepin
2022-04-13 00:38
#6
Linux小白2019

系统几乎所有开源驱动都是在编译Linux内核(linux-image)的时候一起编译出来(linux-modules),发布的时候也是捆绑发布的**(但是你可以自己删减一些模块)。**

或许这就是为什么我装20.2有声音,装20.2以后的任何版本都没有声音,因为20.2以后的版本可能删减了某些模块导致丢失了我的声卡驱动

很多情况硬件问题并不是“驱动”问题。

多提供一点信息吧。

可以尝试:在设置里调整输出设备(或者用pavucontrol),调整alsamixer的通道音量,更换不同版本的内核

Reply View the author
Linux小白2019
deepin
2022-04-13 02:53
#7
enforcee

很多情况硬件问题并不是“驱动”问题。

多提供一点信息吧。

可以尝试:在设置里调整输出设备(或者用pavucontrol),调整alsamixer的通道音量,更换不同版本的内核

不是这么回事,你说的这些方法的我都试过了,没用。可以肯定是驱动问题。

Reply View the author
enforcee
deepin
2022-04-13 07:25
#8
Linux小白2019

不是这么回事,你说的这些方法的我都试过了,没用。可以肯定是驱动问题。

我去读了你以往的帖子,这个问题确实很棘手。

snd_hda_intel和snd_hda_codec_*这些模块应该是正常加载了,pulseaudio服务器也在运行。如果内核模块没有加载的话应该会显示“dummy output”伪输出这类字样,但是看之前的截图声卡名字和通道名字都是显示出来的。

毕竟这个问题还算是个例,我也没有相同的硬件用来分析(就算是有以我的水平也未必能解决),如果有其他信息可以告诉我。

sad

如果楼主还是想解决问题的话可以再试试:

systemctl --user stop pulseaudio.service pulseaudio.socket

关闭pulseaudio服务器,然后

aplay "音频文件.wav"

直接用alsa底层播放(只能用wav,其他音频会变成噪音),可以用alsamixer调节音量

Reply View the author
Linux小白2019
deepin
2022-04-13 16:59
#9
enforcee

我去读了你以往的帖子,这个问题确实很棘手。

snd_hda_intel和snd_hda_codec_*这些模块应该是正常加载了,pulseaudio服务器也在运行。如果内核模块没有加载的话应该会显示“dummy output”伪输出这类字样,但是看之前的截图声卡名字和通道名字都是显示出来的。

毕竟这个问题还算是个例,我也没有相同的硬件用来分析(就算是有以我的水平也未必能解决),如果有其他信息可以告诉我。

sad

如果楼主还是想解决问题的话可以再试试:

systemctl --user stop pulseaudio.service pulseaudio.socket

关闭pulseaudio服务器,然后

aplay "音频文件.wav"

直接用alsa底层播放(只能用wav,其他音频会变成噪音),可以用alsamixer调节音量

感谢!thanks

等有空我再按照你的方法试下。目前我手上有个USB声卡,需要播放声音的时候就插上,音质也还可以,就是总是想把这个问题解决了,但是我自己目前小白的水平又没有能力解决。

Reply View the author