Download Latest Version zenglOX.iso (5.1 MB)
Email in envelope

Get an email when there's a new version of zenglox

Home / zenglOX_v3.1.0
Name Modified Size InfoDownloads / Week
Parent folder
zenglOX.iso 2015-04-30 5.0 MB
zenglOX_v3.1.0.zip 2015-04-30 1.8 MB
readme.txt 2015-04-30 17.4 kB
SoundBlaster_RemovePassword.pdf 2015-04-15 487.9 kB
Totals: 4 Items   7.4 MB 0
zenglOX v3.1.0 Sound Blaster 16

当前版本新增了Sound Blaster 16相关的声卡驱动,同时新增了play程式,在ramdisk中放入了
两个测试用的wav文件,通过play test.wav或play test2.wav命令就可以播放这两个音频文件。

不过当前版本的开发,遇到了很多阻力,一方面有来自模拟器的问题,另一方面还有来自
Linux系统本身的问题,等等。

可以将网盘中的iso光盘镜像,挂载到VirtualBox或VMware下进行简单的测试
(作者是在windows环境下安装的VirtualBox和VMware),
在测试之前,还需要先对VirtualBox及VMware的声卡进行配置,让它们使用sound blaster 16
的声卡。

对于VirtualBox,可以在虚拟机的设置界面的左侧,选择声音,然后在右边的声音界面中,
从控制芯片里选择"SoundBlaster 16",最后点确定即可。

对于VMware,则需要修改vmx的配置文件,例如:作者在VMware中安装zenglOX时,所设置的
配置文件名为zenglOX.vmx,那么就打开该配置文件,并在其中加入一条
sound.virtualDev = "sb16" 的配置信息即可。

如果想在VMware下设置详细点的话,可以在配置文件中设置如下信息:

sound.autodetect = "FALSE"
sound.virtualDev = "sb16"
sound.baseAddr = "0x220"
sound.dma16 = "5"
sound.irq = "5"

上面配置信息里的sound.autodetect的原始值为TRUE,可以将其设置为FALSE,关闭自动检测,
要求VMware使用sound.virtualDev中所指定的sb16(也就是sound blaster 16声卡)。

sound.baseAddr = "0x220" 用于设置sound blaster 16中的DSP芯片的I/O端口的基地址,这个声卡是
ISA插槽上的声卡,通过设置主板上的jumper(跳线),可以将DSP的I/O基地址设置为0x220,
0x240等等,默认是0x220。主要是在zenglOX的sb16的声卡驱动程式中,已经将这个基地址
通过宏定义,设置为了0x220。因此,如果你设置为0x240的话,就无法对DSP的I/O端口进行读写
操作了,zenglOX的sb16的声卡驱动是从Minix3中移植过来的,在Minix3的源码中,也将其
固定为了0x220。各个模拟器的缺省值也都是0x220 。

sound.dma16 = "5" 用于将DMA16的通道设置为5,在ISA的DMA中,5、6、7三个通道是用于16位传输的,
各模拟器中的缺省值为5,在zenglOX的驱动程式里,也是通过通道5来进行DMA的16位传输的。
有关ISA DMA的相关信息,可以参考 http://wiki.osdev.org/ISA_DMA 该链接对应的文章。

sound.irq = "5" 用于将sb16声卡的中断号设置为5,这也是和zenglOX的驱动程式相匹配的,
有的版本的VMware里,这个中断号的缺省值可能为7,因此,可以将其设置为5,从而让zenglOX的
声卡驱动能够正常运作,Minix3的源码里,中断号默认为7。作者之所以使用5,是因为在
Qemu模拟器下,通过分析Qemu的源代码可知,它在初始化时,就将sb16的中断号,固定为5了,
而且,无法通过sb16的mixer芯片的0x80寄存器来修改这个中断号,因此,为了让zenglOX的声卡
驱动能够在VirtualBox,VMware及Qemu下都正常运行,就将中断号统一设置为了5

当然,一开始你可以只添加一条sound.virtualDev = "sb16"的配置信息,如果不能正常工作的话,
再将其他的配置信息加进去。

Qemu模拟器的配置,放在最后再进行介绍,因为会涉及到比较多的内容。

在VirtualBox及VMware下,配置好声卡后,挂载zenglOX v3.1.0版本的iso镜像文件,在启动进入
桌面前,应该就可以看到Sound Blaster 16声卡的DSP的版本号信息了,qemu及VirtualBox下的sb16的
DSP的版本号为4.5,VMware中的sb16的DSP的版本号则为4.13 。

进入zenglOX的桌面后,启动term终端,在终端里,通过 play test.wav 和 play test2.wav 命令
就可以播放test.wav与test2.wav这两个音频文件了:

zenglOX> play test.wav
play test.wav...[20%]...[27%]...[34%]...[41%]...[48%]...[55%]...[62%]...[69%]...
[76%]...[83%]...[90%]...[97%]...[99%]...[99%]...audio end!
zenglOX> play test2.wav
play test2.wav...[28%]...[37%]...[46%]...[56%]...[65%]...[74%]...[84%]...[93%]..
.[99%]...[99%]...audio end!
zenglOX> 

上面当处理器,每收到一个声卡的IRQ中断时,就会向play程式发送一个消息,在该消息的
处理过程中,就会将百分数信息显示出来,表示当前大概播放到了什么位置。
在play程式的播放过程中,可以按p键暂停,按c键继续,按ESC键退出,VMware下,如果
使用暂停和继续功能的话,会导致一些播放上的问题,有可能是VMware模拟器的BUG,也有可能是
当前驱动的问题。

在VirtualBox及VMware下,还可以通过mixer程式来调节音量:

zenglOX> mixer -mv 31 31
Mixer detected!
set Mixer Master successed!
set Mixer Voice successed!
zenglOX> mixer -l
Mixer detected!
Mixer Master left:31 Mixer Master right:31
Mixer Voice left:31 Mixer Voice right:31
....................................
....................................
....................................

可以通过mixer -h命令来查看mixer的帮助信息,虽然,mixer有很多的参数,但是只有-mv参数
可以在VMware及VirtualBox下起作用,因为模拟器,并没有完全按照硬件来进行模拟,很多
环节都被忽略掉了,尤其是在Qemu模拟器下,Mixer芯片对控制音量完全没作用,因此,在Qemu
模拟器下使用mixer程式没有多大的含义,顶多用mixer -l命令来查看当前Mixer芯片里各音量控制
相关的寄存器的值而已。

Mixer音量控制芯片相关的内容,可以参考pdf手册的第4章,在pdf手册的第71页(顶部分页输入框中
的页数),有一幅音量控制相关的电路原理图,真实的硬件,应该是按照这个图来调节音量的,
从图中可以看到,每个Mixer寄存器在音量控制中的作用。

mixer -mv命令在调节音量时,其有效值在0到31之间,上面的mixer -mv 31 31命令中,输入的
两个31,分别用来设置左右两声道(但其实,你将一边设为31,另一边设为0,还是可以两边都有声音,
因此,模拟器的模拟还是不够真实)。

上面提到的play程式,mixer程式,test.wav及test2.wav音频文件,都存储在ramdisk中,
因此,都可以直接进行测试。

=========================================
Qemu中的相关配置
=========================================

在zenglOX源码根目录的readme.md文件中,作者加入了新的针对当前版本的,Qemu相关的配置信息。

以下是readme.md中新加入的主要内容(之前版本中的内容,通过....省略掉):

.........................................

安装完依赖项后, 对于zenglOX v3.1.0及之后的版本,由于引入了sound blaster 16之类的声卡的驱动,
并且,声音输出在qemu下执行时,它的I/O线程会很繁忙,以至于在Ubuntu系统下,
如果不开启kvm硬件加速的话,qemu的I/O线程会严重阻塞VCPU线程,从而导致qemu的CPU指令无法正常执行,
也就会让qemu里的音乐播放,图形界面渲染,鼠标操作等一系列功能都无法正常运作
(主要是在播放音乐过程中)。
因此,对于zenglOX v3.1.0及之后的版本就必须开启KVM硬件加速(至少在ubuntu的系统下是这样的)。

要开启KVM(也就是处理器的虚拟化技术), 
读者可以参考 http://www.linuxfromscratch.org/blfs/view/svn/postlfs/qemu.html 该链接里的内容。

该链接中,提示读者可以先用如下命令,来查看处理器是否支持虚拟化技术:

egrep '^flags.*(vmx|svm)' /proc/cpuinfo

如果什么输出信息都没有,那么很遗憾,你的处理器不支持虚拟化技术
(或者是: 你的Linux是安装在VirtualBox之类的虚拟机中的,VirtualBox不会将
处理器的虚拟化功能,传递给运行在其中的系统),
如果该命令产生了任何输出信息的话,就说明你的处理器支持虚拟化技术,
接着就可以进入BIOS中查看该虚拟化技术是否开启了,如果没开启就手动开启。

作者的台式机用的是技嘉的主板(型号GA-F2A85XM-DS2),在该主板的BIOS里的M.I.T.页面下,
有一个Advanced Frequency Settings项目,进入该项目后,
再进入Advanced CPU Core Features项目,该项目里,有一个SVM Mode选项,
该选项默认是Enabled开启状态,因此,作者的技嘉主板默认就开启了CPU的虚拟化技术。
作者的华硕笔记本默认也是开启了处理器的虚拟化技术的。
对于其他主板,则需要查看主板的说明书,或者网上搜索。

如果CPU不支持虚拟化技术的话,就只能将生成的iso镜像放置到VirtualBox或VMware下进行测试了.

在开启了CPU的虚拟化功能后,还需要查看Linux内核是否将KVM编译为了内建模式,
或者将KVM编译为了模块模式,在上面那个链接里已经写的比较详细了,这里就不多说了,
在ubuntu系统下(作者所使用的是ubuntu 12.04的系统),KVM默认就被编译为了模块模式,
读者可以使用 modinfo kvm-intel 和 modinfo kvm-amd 命令来查看这两个模块的相关信息,
对于Intel处理器,需要使用kvm-intel模块,
对于AMD处理器,则需要使用kvm-amd模块。
要加载kvm-amd模块,可以使用sudo modprobe kvm-amd命令,
要加载kvm-intel模块,则可以使用sudo modprobe kvm-intel命令,
如果你的处理器不支持某个模块的话,modprobe命令执行时,就会抛出Operation not supported的信息,
并且不会去加载该模块,因此,你不需要担心,因加载到了错误的模块而影响到系统的正常运行。

如果想让kvm-intel或kvm-amd模块在启动时,自动被加载的话,在ubuntu系统下,
可以在/etc/modules文件中加入对应的模块名.

要查看模块是否被成功加载了,可以通过 lsmod | grep kvm 命令来查看。
如果显示出了kvm的相关信息,那么就说明对应的模块被加载成功了。

在kvm模块被成功加载后,qemu不需要什么额外的配置(qemu本身就支持kvm),
只需在qemu的启动命令行参数中,加入-enable-kvm参数即可,
从zenglOX v3.1.0版本开始,作者默认就在startQemu的脚本文件中,加入了-enable-kvm的参数。
如果你的Linux系统环境下,不需要开启kvm硬件加速,qemu也能正常播放音乐的话,
可以将该参数去掉。不过如果能开启kvm硬件加速的话,最好还是开启,
因为它可以有效的提高qemu的执行速度。

此外,从zenglOX v3.1.0版本开始,startQemu脚本文件的开头,
加入了一条export QEMU_AUDIO_DRV=alsa命令,这条命令用于强制要求qemu使用ALSA音频驱动来播放声音。

要让qemu播放出声音,首先需要确保qemu所在的Linux系统能发出声音,
如果Linux系统都不能发出声音的话,运行在Linux系统中的qemu就更不可能发出声音了。

作者的台式机安装的是ubuntu 12.04的Linux发行版, 一开始该系统是没有声音的,
alsamixer命令执行后,显示出"This sound device does not have any controls"的信息,
根本没有音量可供调节,因此,应该是alsa音频驱动的问题。
作者就参考 http://blog.csdn.net/rainysia/article/details/12907443 这篇文章
将ALSA音频驱动重新安装了一下(作者也是realtek alc887的声卡),
同时参考 http://blog.csdn.net/wangzhilife/article/details/7881722 和
http://blog.163.com/seven_7_one/blog/static/162606412201185114049121 这两个链接里的文章,
将ALSA相关的alsa-lib及alsa-utils都安装了一遍
(安装时,要注意alsa-driver,alsa-lib及alsa-utils的版本号要一致),
重启后,alsamixer就可以正常调节音量了, ubuntu也就可以正常播放声音了。

作者的笔记本上,装的也是ubuntu 12.04的系统,但是,默认就可以播放声音,因为,
现在的Linux内核中,默认就集成了alsa的音频驱动,作者笔记本上的声卡比较旧,
内核集成的alsa驱动可以识别出来, 不像作者台式机上的声卡, 内核集成的alsa驱动无法识别,
就只有到alsa的官方网站(http://www.alsa-project.org/), 下载新版的驱动来安装了。
当然,你也可以将ubuntu 12.04升级到14.04或者15.04的新版本,
让新版本的内核中集成的alsa驱动来识别。不过,作者不喜欢升级,
一方面要等满久,另一方面,新版本是否稳定也不清楚。

对于2.6.x的linux内核,你可以从alsa官网的old drivers (alsa-driver)的ftp站点(当前地址为
ftp://ftp.alsa-project.org/pub/driver/),
下载到1.0.23,1.0.24或者1.0.25的alsa-driver来进行编译安装,
对于3.x.x或者更高版本的Linux系统,alsa驱动已经被彻底整合进Linux的内核源码中了,
alsa官方已经不再提供单独的alsa-driver的下载地址了。

在系统加入了ALSA音频驱动以及相关的alsa-lib, alsa-utils的情况下,如果系统能正常播放声音,
那么,接下来,就只需在qemu的配置中加入alsa的支持即可, 
对于zenglOX v3.1.0之前的版本,你可以使用如下配置: 

zengl@zengl.com:~/Downloads/qemu-build$ ../qemu-2.2.0/configure --target-list=i386-softmmu --enable-debug --disable-pie

对于zenglOX v3.1.0之后的版本,就需要使用如下所示的配置:

zengl@zengl.com:~/Downloads/qemu-build$ ../qemu-2.2.0/configure --target-list=i386-softmmu --enable-debug --disable-pie --enable-sdl --audio-drv-list='oss alsa sdl'

增加了--enable-sdl和--audio-drv-list='oss alsa sdl'两个配置参数,
--enable-sdl表示采用SDL来进行渲染,有的linux系统中会使用gtk来渲染,
gtk渲染下,播放声音时,会阻塞gtk的渲染工作。在startQemu的启动脚本中,
也加入了一条-display sdl的启动参数,表示强制使用SDL引擎来进行渲染,
--audio-drv-list='oss alsa sdl'表示qemu将支持oss,alsa及sdl的音频驱动,
这样在startQemu脚本文件里加入export QEMU_AUDIO_DRV=alsa命令后,
qemu就会通过alsa音频驱动来播放声音了,如果没有--audio-drv-list='oss alsa sdl'这条配置信息的话,
那么qemu就将只支持原始的oss音频驱动,当export QEMU_AUDIO_DRV=alsa命令执行后,再启动qemu时,
会提示audio: Unknown audio driver `alsa'的信息,这样qemu就无法通过alsa音频驱动来播放声音了,
因此,必须加入--audio-drv-list='oss alsa sdl'这条配置信息。

在使用configure对qemu配置完后,就可以通过make和make install命令来编译安装qemu了:

zengl@zengl.com:~/Downloads/qemu-build$ ../qemu-2.2.0/configure --target-list=i386-softmmu --enable-debug --disable-pie --enable-sdl --audio-drv-list='oss alsa sdl'
zengl@zengl.com:~/Downloads/qemu-build$ make
zengl@zengl.com:~/Downloads/qemu-build$ sudo make install
zengl@zengl.com:~/Downloads/qemu-build$ qemu-system-i386 --version
QEMU emulator version 2.2.0, Copyright (c) 2003-2008 Fabrice Bellard
zengl@zengl.com:~/Downloads/qemu-build$ 

.........................................

以上就是readme.md文件中新增的主要内容,在重新配置,和编译安装qemu后,
编译运行zenglOX的方式与之前的版本是一样的。

因此,对于qemu来说,当前版本,主要就是需要开启kvm虚拟化技术,还有就是加入alsa音频驱动的支持。
在startQemu的启动脚本中,还加入了一条-soundhw sb16的启动参数,表示在qemu中使用Sound blaster 16
的声卡。

和Sound blaster 16相关的驱动程式位于zenglOX源码根目录的zlox_sb16.c及zlox_sb16.h的文件中,
和play程式相关的源码位于build_initrd_img目录中的play.c文件里,mixer程式相关的源码位于
build_initrd_img目录中的mixer.c文件里。
此外,还新增了zlox_audio.c及zlox_audio.h两个音频驱动文件,有点类似于Linux中的alsa,
属于中间驱动层,他会将用户指令传递到底层的具体的声卡驱动中。

和Sound blaster 16声卡相关的信息可以参考网盘中的pdf手册,以及参考
http://wiki.osdev.org/Sound_Blaster_16 该链接对应的文章,不过这篇文章的内容过于简单了,
还是pdf手册讲的详细点。

网盘里的pdf手册名为SoundBlaster_RemovePassword.pdf ,该名称里的RemovePassword表示
该PDF手册是去除了密码保护的,可以对PDF里的内容进行复制操作。比如对某些英文句子复制后,
放到Google翻译中,进行翻译,原版的PDF受到保护,无法复制,不方便查看和翻译。

wav音频文件的格式,可以参考 

https://web.archive.org/web/20141213140451/https://ccrma.stanford.edu/courses/422/projects/WaveFormat/

这个链接地址有点古怪,URL的中间还有一个https://,这个地址需要通过代理访问。
必须将上面这条古怪的地址完全输入到浏览器的地址栏中,才能访问。
并且浏览器还需要通过GoAgent之类的代理才能访问到。

当前版本及以后的版本都将不再提供Bochs相关的启动脚本,因为Bochs已经不再适合后续版本的开发了。

可以看到,声卡驱动的开发,会遇到不少问题,如果读者想在自己的hobby OS中写入声卡驱动的话,
也需要对这些问题一一进行处理。

时间: 2015年4月30日
作者: zenglong
官网: www.zengl.com
Source: readme.txt, updated 2015-04-30