Name | Modified | Size | Downloads / 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