zenglOX v3.0.2 PNG(Portable Network Graphics) and BUG Fix
=========================================
1. PNG(Portable Network Graphics)
=========================================
当前版本移植了lodepng项目, 该项目的链接地址为:http://lodev.org/lodepng/
lodepng除了可以分析PNG图片的结构外, 还将Deflate(zlib的压缩与解压缩算法也包含
进来了, 对libc即C库文件的依赖也很小, 因此可以方便的移植到hobby OS中)。
当前版本就创建了一个基于lodepng项目的showpng程式, 使用该程式可以将png图片
显示出来, 显示效果可以查看screenshot目录下的v302_1.jpg截图。
由于showpng程式默认位于iso镜像里, 所以需要通过isoget -all命令来获取该程式及
相关的png示例图片文件。
如果磁盘没进行过分区格式化的话, 先使用fdisk, format工具对磁盘进行分区格式化(当然,
也可以将之前版本的磁盘镜像拷贝到当前版本里, Qemu模拟器的磁盘镜像文件为hd_qemu.img)
, 具体的分区格式化命令, 如下所示(仅供参考, 你可以根据需要设置自己的分区大小等):
zenglOX> fdisk -hd 0 -pt 1 -type zenglfs -start 0 -num 123456
fdisk write MBR success , .......
zenglOX> format -hd 0 -pt 1 -type zenglfs
format success , .....
分区格式化的命令详情, 请参考"zenglOX v1.5.0 zenglfs文件系统..."对应的官方文章。
分区格式化后, 使用mount命令挂载hd与iso目录:
zenglOX> mount hd 0 1
mount to [hd] success! .....
zenglOX> mount iso
mount iso to [iso] success! ...
上面mount hd ...命令的详情, 也可以参考"zenglOX v1.5.0 zenglfs文件系统..."的官方文章。
接着就可以使用isoget -all命令了:
zenglOX> isoget -all
........................
copy content of iso/IMG/R.PNG;1 to hd/img/r.png success
copy content of iso/IMG/H.PNG;1 to hd/img/h.png success
copy content of iso/IMG/S.PNG;1 to hd/img/s.png success
copy content of iso/EXTRA/SHOWPNG.;1 to hd/bin/showpng success
上面的isoget -all命令会将showpng程式拷贝到hd/bin目录下, 并将相关测试用的png图片拷贝
到hd/img目录中.
由于showpng程式会自动搜索hd/img目录, 因此, 在使用时, 直接给出png的文件名即可, 如下所示:
zenglOX> showpng s.png
now load and decode hd/img/s.png
now wake up the parent task!
zenglOX> showpng h.png
now load and decode hd/img/h.png
now wake up the parent task!
zenglOX> showpng r.png
now load and decode hd/img/r.png
now wake up the parent task!
解析并显示出一张图片后, showpng会将父任务即shell任务唤醒, 让shell继续执行,
因此上面就可以在shell中连续运行三个showpng程式了, 从而不用为了显示三幅图片而启动
三个shell了。
showpng程式与依赖的lodepng的源代码位于build_initrd_img目录下的extra目录中,
分别对应为showpng.c与lodepng.c文件。
在稍后的当前版本的官方文章中, 会根据lodepng源码对PNG图片结构及Deflate算法进行分析。
=========================================
2. BUG Fix(BUG修复)
=========================================
1. 修复zlox_kheap.c(内核堆)与zlox_uheap.c(用户堆)中, 在对页表项进行操作后, 没有
更新TLB缓存的BUG, 有关TLB缓存的内容, 在之前zenglOX v1.0.0版本对应的官方文章中解释
过, 之前版本由于没有更新TLB, 就容易导致堆里的数据错误, 例如, 当从iso镜像拷贝比较大
的文件时, 当触发了堆中的expand(线性地址扩展)操作时, 新分配的页表项不能及时更新到TLB里,
从而导致读到堆里的正常数据, 会被突然变成一些无效的数据, 这些无效的数据写入到磁盘里,
就会导致磁盘里的文件会出现部分内容是无效的情况。
2. 修复模拟器下可能出现的无法收到按键irq中断的BUG, 主要是对zlox_ps2.c文件里的
zlox_ps2_init即PS/2控制器的初始化函数进行调整, 直接将PS/2控制器的configure byte
即配置字节设置为0x47 , 然后写入到PS/2控制器中, 省略掉之前版本里的读取configure byte的
步骤, 因为configure byte是通过0x60的I/O端口读取出来的, 而0x60端口又被用于鼠标与键盘
设备的输入事件中, 在鼠标键盘没有被禁用的情况下, 0x60端口容易读取出鼠标键盘设备的数据
出来, 而非真实的configure byte值, 即便鼠标键盘被禁用的情况下, 也无法保证0x60读出来的
就是原始的configure byte值, 因为, 很多PS/2命令的反馈信息都需要通过0x60端口读出来。
因此, 就省略掉读操作, 而直接将需要设置的值写进去即可。有关ps/2控制器的详情,可以参考
http://wiki.osdev.org/%228042%22_PS/2_Controller 该链接, configure byte里控制了
是否开启鼠标键盘设备, 以及是否开启鼠标键盘的中断, 因此, 错误的configure byte值
就会导致鼠标或键盘无响应的情况发生。
=========================================
3. 其他的一些改动
=========================================
1. 当用户程式通过系统调用, 出现内存地址不存在之类的分页错误时, 只会当掉当前任务, 不会当掉
整个系统, 改动的地方位于zlox_paging.c文件的zlox_page_fault函数里。
2. 增加shift + tab系统热键, 当你同时按下shift与tab键时, 可以在各窗口之间进行切换。
当然桌面是不参与窗口的这种切换的, 之所以不用alt + tab组合键, 是因为该组合键容易被模拟器所在的主机
给劫持掉, 而且alt作为通用热键, 在模拟器下有时候收不到释放信号(松开alt键时, 有时收不到
相关的中断信号)。shift + tab键最终会通过zlox_my_windows.c文件的zlox_shift_tab_window函数
来进行切换窗口的操作, 另外, 在你拖动窗口时, 该热键是不会起作用的, 因为拖动窗口时,
又进行切换窗口的话, 容易导致一些显示上的问题。
时间: 2015年3月9日
作者: zenglong
官网: www.zengl.com