您好,我想知道如何使用 int 0x80 从 nasm 汇编程序访问声卡。以及访问声卡时我应该在寄存器中输入什么值。
是否有任何手册或有关我们必须传递给内核以访问声卡或其他硬件设备的参数的详细信息,如果有人知道,请告诉我。
我已经做了很多搜索,并且有很多 c 库和 ALSA 和 OSS 之类的东西,但我想要的是,如果有人知道一些关于从基础开始学习有关与硬件接口的汇编程序的资源。
如果有人能给我一个关于如何访问的小代码清单,我将非常感激。
您好,我想知道如何使用 int 0x80 从 nasm 汇编程序访问声卡。以及访问声卡时我应该在寄存器中输入什么值。
是否有任何手册或有关我们必须传递给内核以访问声卡或其他硬件设备的参数的详细信息,如果有人知道,请告诉我。
我已经做了很多搜索,并且有很多 c 库和 ALSA 和 OSS 之类的东西,但我想要的是,如果有人知道一些关于从基础开始学习有关与硬件接口的汇编程序的资源。
如果有人能给我一个关于如何访问的小代码清单,我将非常感激。
这就是声卡驱动程序所做的。它们必须为每个声卡定制编写,以实现可由操作系统或应用程序使用的通用 API。其他硬件设备也是如此。硬件制造商对于如何在这个级别访问他们的东西往往不太开放(一方面)。
并不是说我是 Linux 专家,但这是所有操作系统的一个相当基本的问题。
如您所见,Linux 中用户空间和内核空间之间的接口是 INT 0x80。
在 Unix 中,作为哲学问题,(几乎)一切都是文件,因此声卡被视为“字符文件”。内核系统调用符合 POSIX 规范 - 所以“open”、“close”、“ioctl”、“read”、“write”。
对声卡的访问是通过驱动程序接口完成的,作为“/dev/”下的文件。一些示例文档位于OSS 文档中,但我不确定它是否是最新的。
要观察这种通信,您可以使用“strace”来查看任何现有应用程序正在使用哪些系统调用。
您可能会看到如下序列:
打开(“/dev/dsp”,...) ioctl() 写() ... 写() 关闭()
通常你会通过 C 库“打开”,但由于你想跳过它,你可以通过几种方法找到系统调用——一种方法是
objdump -d /usr/lib/libc.a
例如,你可以通过查找< __libc_
open>发现open是syscall 0x5:你会注意到eax是5,其余参数在ebx、ecx和edx中。( Linux Syscalls上也列出了用法和参数)
在用户模式下,这将不起作用 - 您将无法直接访问声音硬件。
如果您创建内核模式驱动程序,您可以直接戳声卡硬件,但在这一点上,我认为大多数供应商都有不同的实现,并且没有遵循一致的标准。较新的声卡可能仍与 Adlib 和 SoundBlaster 16 兼容——这是当游戏以 DOS 为目标并直接使用硬件时的硬件标准,但如果这不再有效,我不会感到惊讶。快速搜索应该会产生直接访问这些旧卡界面的方法。或者,您可以在虚拟机内部运行 DOS 并访问硬件 - 大多数虚拟机模拟此级别的声卡。
根据您要执行的操作,您最好使用现有的库来处理声卡的接口,除非您打算编写声卡驱动程序,我对此表示怀疑,最好在 C 中完成在 Linux 上。
Portaudio是一款(免费)相对容易使用的。一个使用带有 C 接口的 portaudio 的示例库(我是 wwviaudio 的作者)。
FMOD似乎对游戏编程人员来说很重要,尽管它不是免费的。
sdl 混音器是另一个对 linux 游戏开发者来说很重要的混音器。
JACK在 linux 专业音频领域非常重要。(想想热情——Linux 对 Protools 的回答。)
尝试直接从用户空间与音频硬件对话是没有意义的。