如何使用nasm访问linux中的声卡

时间:2009-05-13 19:47:06

标签: nasm

你好,我想知道如何使用int 0x80从nasm汇编程序访问声卡。 以及在访问声卡时我应该在寄存器中放入什么值。

是否有任何手册或其他内容包含我们必须传递给内核以访问声卡或其他硬件设备的参数的详细信息,如果有人知道请告诉我。

我已经做了很多搜索,很多c库和ALSA和OSS以及类似的东西,但我想要的是,如果任何人知道一些资源关于从基础知识学习汇编程序接口与硬件。

如果任何人可以给我一个关于如何完成访问的小代码列表,我将非常感激。

4 个答案:

答案 0 :(得分:1)

这就是声卡驱动程序的功能。必须为每个声卡自定义编写它们,以便实现可供O / S或应用程序使用的通用API。其他硬件设备也是如此。硬件制造商往往不太公开如何在这个级别访问他们的东西(一件事)。

并非我是Linux专家,但这是所有操作系统的一个相当基本的问题。

答案 1 :(得分:1)

正如您所看到的,Linux中用户空间和内核空间之间的接口是INT 0x80。

在Unix中,作为哲学问题,(几乎)一切都是文件,因此声卡被视为“字符文件”。内核系统调用符合POSIX规范 - 所以“打开”,“关闭”,“ioctl”,“读取”,“写入”。

通过驱动程序界面访问声卡,作为“/ dev /”下的文件。一些示例文档位于OSS documentation,但我不确定它是否是最新的。

要观察此通信,您可以使用“strace”查看任何现有应用程序正在使用的系统调用。

您可能会看到如下序列:

     open("/dev/dsp", ... ) 
     ioctl() 
     write() 
     ... 
     write()
     close()

通常你会通过C库“打开”,但既然你想跳过它,你可以通过几种方式找到系统调用 - 一种方式是

      objdump -d /usr/lib/libc.a

例如,您可以通过查找< __libc_ open>来找到open是系统调用0x5: 您会注意到eax是5,其余参数是ebx,ecx和edx。 (用法和参数也列在Linux Syscalls

答案 2 :(得分:0)

从用户模式来看,这不起作用 - 您将无法直接访问声音硬件。

如果您创建内核模式驱动程序,您将能够直接戳声卡硬件,但此时我认为大多数供应商都有不同的实现,并且不遵循一致的标准。较新的声卡可能仍然是Adlib& SoundBlaster 16兼容 - 当游戏针对DOS并直接使用硬件时,这是硬件标准 WAY ,但如果这不再有效,我不会感到惊讶。快速搜索应该会产生直接访问这些传统卡的接口的方法。或者,您可以在虚拟机内运行DOS并访问硬件 - 大多数虚拟机模拟此级别的声卡。

答案 3 :(得分:0)

根据你想要做的事情,你可能最好使用现有的库来处理声卡的接口,除非你打算写一个声卡驱动程序,我怀疑,这将是最好的在Linux上用C语言完成。

Portaudio是一个(免费)的,相对容易使用。 one example lib using portaudio with a C interface (I'm the author of wwviaudio)

FMOD对于游戏编程人员来说似乎很重要,但它并不是免费的。

sdl mixer是另一个与linux游戏开发者合作的人。

JACK在Linux专业音频世界中很重要。 (想想ardor--对Protools的linux答案。)

尝试直接从用户空间与音频硬件通信是没有意义的。