NASM直接访问声卡(无操作系统)

Posted

技术标签:

【中文标题】NASM直接访问声卡(无操作系统)【英文标题】:NASM accessing sound card directly (No OS) 【发布时间】:2009-12-12 01:37:50 【问题描述】:

我正在尝试用 ASM 和 C 编写一个非常简单的操作系统。(NASM 汇编器) 我想直接访问声卡,有或没有驱动程序。 如果我不需要驱动程序,我如何访问和发送示例音频文件 到声卡? (一个例子会很好) 如果我确实需要驱动程序,是否有接口它们并调用函数 来自司机?以及如何访问示例音频文件并将其发送到 声卡? (再举个例子就好了)

【问题讨论】:

什么声卡?您可以访问卡的注册地图吗? 【参考方案1】:

我不想让您气馁,但是现代声卡驱动程序非常复杂,而且您可能知道,特定于操作系统。这是操作系统开发中的困难挑战之一——驱动程序支持。这不是简单的代码sn-p就能实现的。

为了加载文件,您需要一个文件系统。你实施了吗?您使用“内核”标志的事实表明您的操作系统仍处于起步阶段。我不确定我是否愿意将声音支持放入操作系统的内核中。

话虽如此,有一个很好的模拟器叫 Bochs,它有Sound Blaster 16 emulation。还有一些really old documentation 用于编程。这可能是你最好的选择。在过去,访问声音硬件要容易得多。

【讨论】:

是的。但是,许多声卡/板载芯片组都兼容 AC97。直接对这些进行编程比对 SB16 进行编程更容易。幸运的是,OP 拥有这些芯片之一.. 嗯....我实际上在考虑 SB16。但是,既然你提到它,AC97 是我认识的东西。但是,我不知道如何为该芯片组编程......:P 我的板载声卡,一个基于 Intel HDA 的芯片组,确实支持 AC97,这是一个完美的测试平台。【参考方案2】:

您最好的选择可能是查看 Linux 或 FreeBSD 声音驱动程序,看看它们的作用。除了最简单的声卡之外,您不可能获得更好的实现文档...

这是一个难题。警告:-p

【讨论】:

我知道。太糟糕了声卡制造商不专注于一种实现,而只是四处奔走制造自己的。 :P 我想知道是否可以将 ALSA 移植到我的内核...【参考方案3】:

当然,您需要一个驱动程序,当然没有简单的方法可以与现有的驱动程序交互(有一些关于统一操作系统无关的“统一驱动程序接口”的建议——但我认为它没有得到任何地方)。

因此,在您编写了从硬盘读取文件的代码后,您需要推出自己的音频驱动程序。

现在,我已经有一段时间没有这样做了,所以这可能已经过时了,但是在 90 年代,您会为您的声卡配置一些“out dx, al”(详细信息因声卡而异),然后设置 DMA 以将数据从内存缓冲区发送到您的卡。卡(或者是 DMA 控制器?)在到达缓冲区末尾时会触发中断,您可以使用该中断来用新数据填充缓冲区。

如果您的卡有一个可以工作的 linux 驱动程序,我会先查看它的代码。否则,您将不得不对 Windows 驱动程序进行逆向工程,Soft-Ice 的 bpio(中断 io 端口访问)日志记录曾经对 iirc 有好处。

祝你好运。

【讨论】:

那种“90 年代”的界面是我的想法。我听说有人说较新的声卡可以(可能)支持 SoundBlaster 接口。问题是 - 我不知道如何让它工作! :P 我希望只支持 ALSA 驱动程序集。我不会去尝试自行拆卸或记录专有驱动程序,因为这对于一个特定的芯片组来说只是浪费时间。也许我可以为我的操作系统编译 ALSA ....? (我打算实现 ELF 兼容性。)【参考方案4】:

这是一个用所有程序集编写的免费开源操作系统。如果您不熟悉汇编内核编程,这是一个很好的参考。

http://www.menuetos.net/index.htm

【讨论】:

以上是关于NASM直接访问声卡(无操作系统)的主要内容,如果未能解决你的问题,请参考以下文章

win7的操作系统打不开汇编编译器(yasm&nasm)

NASM,如何直接写入硬盘并在实模式下读取

linux 音频子系统代码分析

自己动手写操作系统--"Hello, OS world!"

NASM汇编学习系列——获取命令行参数

NASM汇编学习系列——示例打印0到10