当前版本将zengl嵌入式脚本语言移植到了zenglOX里,从而在zenglOX里可以编辑和执行一些简单的脚本了。
zenglOX v2.3.0 移植zengl嵌入式脚本语言 先按照v2.0.0版本的要求, 编译好bochs,让其支持e1000网卡, 将源代码解压后, 执行make和make iso命令, 分别得到initrd.img, zenglOX.bin及zenglOX.iso文件, 在root权限下运行startBochs来启动bochs虚拟机, 如果执行失败, 可能是bochsrc.txt配置不正确, 具体原因请参考v2.0.0的官方文章 默认情况下, 源代码根目录下的hd.img只有32.5KB大小(该文件可以随着使用而动态的增加体积), 也就是没有分区过的bochs磁盘镜像文件, 如果你在该版本不想重新分区格式化一遍的话, 可以直接将上一个v2.2.0版本中使用过的hd.img文件拷贝到解压后的源码根目录, 以 覆盖掉默认的hd.img文件。(当前版本并没有对zenglfs文件系统做任何调整, 因此 可以直接使用之前版本里的磁盘镜像文件) 此外,和上一个版本类似, zengl可执行程式放置在光盘镜像里, 需要通过isoget命令 加载到磁盘中。 假设你的分区位于0号ide磁盘设备的1号分区里, 则输入如下命令来分别挂载光盘和磁盘分区: 图1 当挂载iso和hd成功后, 就可以使用isoget命令来获取更新的ee编辑器, 更新的libc.so库文件, 以及zengl可执行文件到磁盘中(zengl脚本语言是以静态库的形式直接捆绑在zengl可执行文件里的, 因为目前zenglOX对动态库支持的并不完整, zengl动态库里的函数地址在进行赋值时, 有些地方并没有被替换为真实的线性地址, 而且动态库也不方便调试, 因此就使用的静态库): 图2 上面除了前面提到的ee, libc.so, 以及zengl外, 还有 21.zl , 21_def.zl 以及 21_fun.zl 这三个脚本文件, 这三个是21点扑克命令行界面的zengl脚本 小游戏。是从zengl language项目的v1.0.0版本里的console_21_point目录中提取和 移植过来的(修改了文件名, 去掉了脚本里的中文字符等)。 执行了isoget -all命令后, 就可以测试zengl脚本了: 图3 玩法请参考官方zengl编程语言栏目v1.0.0版本的相关文章。 读者也可以通过ee编辑器修改21.zl脚本, 比如将Android的初始资金由180亿调整为 200亿等, 读者还可以用ee编辑器自己写一个小脚本: 图4 上面用ee打开一个新的test.zl脚本文件, 可以在编辑器中输入如下内容: 图5 保存完test.zl脚本后, 就可以进行测试了: 图6 还可以对test.zl脚本进行调试: 图7 通过在最后加入一个 -d 参数, 就可以对脚本进行调试了, 上面先用s命令进行单步 执行, 当执行完第三行代码后, 也就是对hello变量赋值以后, 就可以用p命令显示 hello变量的值了, 最后用c命令继续执行。 有关zengl脚本调试的方法, 请参考zengl编程语言栏目的v1.4.0版本的相关文章。 上面zengl hd/test.zl命令的输出显示: 当前使用的zengl语言的版本号为1.5.0, 这个 版本主要就是增加了对zenglOX操作系统的支持。v1.5.0版本还没有在zengl编程语言 栏目中发布, 过段时间应该会发布。 ee编辑器的版本由v1.3.8更新到了v1.3.9 , 当前版本的ee编辑器主要过滤了 \r字符(因为\r字符会破坏文件内容的显示输出, 也会影响文件的保存)。 每执行一个zengl脚本后, 都会在hd根目录中覆盖生成一个zl.log的日志调试文件, 读者 可以用ee hd/zl.log命令来查看该日志文件的内容, 里面记录了脚本文件的语法树 结构, 生成的指令集等信息。 此外, 如果脚本中有语法错误的话, 显示的语法错误信息中, 只会显示 英文字符, 中文字符则不会被显示出来。 内核代码部分并没做什么大的调整。 最后, 由于zenglOX在读磁盘时使用的是PIO模式, 没有使用DMA模式(DMA模式虽然快, 但是驱动比较难写, 不同的IDE控制器芯片的初始化过程都不太一样, 总之, 作者目前 写不出来), PIO模式读写数据都是通过i/o端口来完成的, 当数据量大的时候, 例如 zengl可执行文件(包含了zengl语言的静态库在内)就有650多KB , 因此, zengl执行时 , 绝大部分时间都消耗在磁盘的读写操作上了, 在VirtualBox虚拟机下, 尤其是 在开启了硬件加速的情况下(默认都开启了), 会明显感觉到读取上的时间消耗。 VirtualBox硬件加速的开关位置位于: 虚拟机的设置界面的 系统 -->> 硬件加速 标签下, 虽然关闭硬件加速可以明显提高读写速度, 但是在 关闭硬件加速的情况下, PS2的第一个端口即键盘相连的端口容易出现reset failed的 情况, 而导致键盘无法使用(这个问题有时候会出现, 有时候不会出现)。因此, 是否需要关闭硬件加速需要读者自行测试来决定。(关闭硬件加速时, 需要全部关闭, 只关闭 一部分容易出现蓝屏, 在之前的zenglOX v1.4.0与v1.4.1的官方文章里还提到过, 关闭 硬件加速可以方便VirtualBox的调试, 所以硬件加速目前是个矛盾体, 关与不关都有各自 的利弊, 不过如果读者只是用VirtualBox简单测试zenglOX的话, 并且不需要VirtualBox 自带的调试功能的话, 作者建议还是保持默认的开启加速的好, 因为硬件加速情况下, 当前版本表现的比较稳定, 虽然磁盘读取速度稍微慢点) 在bochs与VMware下, 读取速度都还可以接受。 如果读者有好的DMA驱动的话, 可以email给作者。 时间: 2014年10月19日 作者: zenglong 官网: www.zengl.com |
#makefile for zenglOX GCC_PATH = /mnt/zenglOX/opt/cross/bin AS = @$(GCC_PATH)/i586-elf-as CC = @$(GCC_PATH)/i586-elf-gcc export CROSS_AS = $(AS) export CROSS_CC = $(CC) export CROSS_LD = @$(GCC_PATH)/i586-elf-ld export CROSS_AR = @$(GCC_PATH)/i586-elf-ar export CROSS_AS_FLAGS = -gstabs ................................................. |
#makefile for ram disk .................................................. AS_TARGET = cpuid uname reboot shutdown C_TARGET = shell ls ps cat ata mount unmount testoverflow fdisk format file vga lspci isoget C_NET_TARGET = arp dhcp ipconf ping C_EXTRA_TARGET = extra/output/ee extra/output/libc.so extra/output/zengl C_DEP_LIB = ld.so libcommon.so C_DEP_NET_LIB = libnetwork.so .................................................. LIBC_SRCS = standard/libc.c standard/printf.c standard/vsnprintf.c standard/fcvt.c standard/modf.c ZENGL_SRCS = extra/zengl/linux/zengl_main.c extra/zengl/linux/zengl_parser.c extra/zengl/linux/zengl_symbol.c extra/zengl/linux/zengl_locals.c extra/zengl/linux/zengl_assemble.c extra/zengl/linux/zengl_ld.c extra/zengl/linux/zenglrun_main.c extra/zengl/linux/zenglrun_func.c extra/zengl/linux/zenglApi.c extra/zengl/linux/zenglApi_BltModFuns.c extra/zengl/linux/zenglDebug.c extra/output/ee: extra/ee.c standard/include/stdlib.h common.h syscall.h task.h fs.h kheap.h extra/output/libc.so @echo "building $@" @mkdir -p extra/output $(CROSS_CC) -Wl,-emain -Wl,-dynamic-linker,ld.so -o extra/output/ee extra/ee.c $(CROSS_CLINK_FLAGS) -I standard/include -I. -L. -lcommon -L extra/output -lc extra/output/libc.so: $(LIBC_SRCS) standard/include/stdlib.h common.h syscall.h task.h fs.h kheap.h @echo "building $@" @mkdir -p extra/output $(CROSS_CC) -fPIC -Wl,-shared -Wl,-soname,hd/lib/libc.so -o extra/output/libc.so $(LIBC_SRCS) $(CROSS_CLINK_FLAGS) -I standard/include -I. -L. -lcommon extra/output/zengl: extra/zengl/zenglOX/zengl.c $(ZENGL_SRCS) libcommon.so extra/output/libc.so @echo "building $@" @mkdir -p extra/output @(cd extra/zengl/zenglOX; make all) @cp -rvf extra/zengl/zenglOX/zengl extra/output/ .................................................. clean: $(RM) $(RMFLAGS) *.o $(RM) $(RMFLAGS) $(AS_TARGET) $(C_TARGET) $(C_NET_TARGET) $(C_DEP_LIB) $(C_DEP_NET_LIB) $(RM) $(RMFLAGS) extra/output $(RM) $(RMFLAGS) make_initrd $(RM) $(RMFLAGS) initrd.img @(cd extra/zengl/zenglOX; make clean) all: initrd.img |
#makefile for zengl language CC = $(CROSS_CC) AR = $(CROSS_AR) ARFLAGS = rc CFLAGS = -g3 -ggdb -O0 -std=c99 -Wall -Wextra -Wno-switch -Wno-unused-variable -Wno-unused-parameter -Wno-uninitialized -Wno-sign-compare -Wno-return-type -Wno-missing-braces -Wno-pointer-sign -ffreestanding -nostdlib CDEFINES = -D ZL_LANG_EN_WITH_CH -D ZL_EXP_OS_IN_ZENGLOX STATIC_CFLAGS = $(CFLAGS) -fvisibility=hidden SRCS = ../linux/zengl_main.c ../linux/zengl_parser.c ../linux/zengl_symbol.c ../linux/zengl_locals.c ../linux/zengl_assemble.c ../linux/zengl_ld.c ../linux/zenglrun_main.c ../linux/zenglrun_func.c ../linux/zenglApi.c ../linux/zenglApi_BltModFuns.c ../linux/zenglDebug.c OBJS = zengl_main.o zengl_parser.o zengl_symbol.o zengl_locals.o zengl_assemble.o zengl_ld.o zenglrun_main.o zenglrun_func.o zenglApi.o zenglApi_BltModFuns.o zenglDebug.o zengl: zengl.o libzengl.a @echo "building $@" $(CC) $(CFLAGS) -Wl,-emain -Wl,-dynamic-linker,ld.so -o zengl zengl.o libzengl.a -I ../../../standard/include -I ../../.. -L ../../../ -lcommon -L ../../output -lc libzengl.a : $(OBJS) longjmp.o setjmp.o @echo "building $@" $(AR) $(ARFLAGS) libzengl.a $(OBJS) longjmp.o setjmp.o $(OBJS): $(SRCS) ../linux/zengl_global.h ../linux/zengl_locals.h ../linux/zengl_exportfuns.h ../../../standard/include/stdlib.h ./setjmp.h @echo "building $@ ..." $(CC) $(CDEFINES) $(STATIC_CFLAGS) -c $(SRCS) -I . -I ../../../standard/include -I ../../.. -I ../linux -L ../../../ -lcommon -L ../../output -lc zengl.o: zengl.c ../linux/zengl_exportfuns.h @echo "building $@" $(CC) $(CFLAGS) -c zengl.c -I ../../../standard/include -I ../../.. -I ../linux %.o: %.s @echo "building $@" $(CROSS_AS) -o $@ $< $(CROSS_AS_FLAGS) clean: rm -fv *.o rm -fv libzengl.a rm -fv zengl all: zengl |
/* * global.h * * Created on: 2012-1-22 * Author: zenglong */ .................................................. #ifdef ZL_EXP_OS_IN_ZENGLOX #include <stdlib.h> #include "setjmp.h" #include "zengl_locals.h" #include "zengl_exportfuns.h" #else #include <stdio.h> #include <stdlib.h> #include <memory.h> #include <stdarg.h> #include <ctype.h> #include <string.h> #include <time.h> #include "setjmp.h" #include "zengl_locals.h" #include "zengl_exportfuns.h" #endif .................................................. |
#define ZL_EXP_OS_IN_ZENGLOX //在加载下面的zengl头文件之前,windows系统请定义ZL_EXP_OS_IN_WINDOWS,linux , mac系统请定义ZL_EXP_OS_IN_LINUX #include "zengl_exportfuns.h" #include <stdlib.h> .................................................... /** 用户程序执行入口。 */ int main(VOID * task, int argc, char * argv[]) { ZL_EXP_INT builtinID; ZL_EXP_VOID * VM; if(argc < 2) { printf("usage: %s <script_filename> \n",argv[0]); exit(-1); } else if(argc == 2 && (strcmp(argv[1], "-v")==0)) { printf("zengl lib version is v%d.%d.%d", ZL_EXP_MAJOR_VERSION, ZL_EXP_MINOR_VERSION, ZL_EXP_REVISION); return 0; } debuglog = fopen("hd/zl.log", "w"); VM = zenglApi_Open(); zenglApi_SetFlags(VM,(ZENGL_EXPORT_VM_MAIN_ARG_FLAGS)(ZL_EXP_CP_AF_IN_DEBUG_MODE | ZL_EXP_CP_AF_OUTPUT_DEBUG_INFO)); zenglApi_SetHandle(VM,ZL_EXP_VFLAG_HANDLE_COMPILE_INFO,main_userdef_info); zenglApi_SetHandle(VM,ZL_EXP_VFLAG_HANDLE_RUN_INFO,main_userdef_run_info); zenglApi_SetHandle(VM,ZL_EXP_VFLAG_HANDLE_RUN_PRINT,main_userdef_run_print); if((builtinID = zenglApi_SetModInitHandle(VM,"builtin",main_builtin_module_init)) == -1) main_exit(VM,"set use module failed:%s",zenglApi_GetErrorString(VM)); if(argc >= 3 && strcmp(argv[2],"-d") == 0) zenglApi_DebugSetBreakHandle(VM,main_debug_break,main_debug_conditionError,ZL_EXP_TRUE,ZL_EXP_FALSE); //设置调试API if(zenglApi_Run(VM,argv[1]) == -1) //编译执行zengl脚本 main_exit(VM,"compile and run <%s> failed:%s\n",argv[1],zenglApi_GetErrorString(VM)); zenglApi_Close(VM); fclose(debuglog); return 0; } |
#include <stdlib.h> #define EE_MAJOR_VERSION 1 #define EE_MINOR_VERSION 3 #define EE_REVISION 9 ................................................... /* file operation ---*/ void file_read(void) { ................................................... /* read complete line */ do { c = fgetc(fi); if(c == EOF) { fclose(fi); fi = 0; /* no more read */ break; } if(c == 9) { /* tab */ if(flag[TAB] == 0) show_flag(TAB, 1); do (*ae++ = BLK); while( ((ae-col) % tabsize) != 0); } else if(c == '\r') // 自动跳过和剔除 \r 字符 ; else if(c == LF) { *ae++ = EOL; col = ae; ytot++; } else *ae++ = c; } while(ae < aa+AMAX-BMAX || c != LF); ................................................... } ................................................... |
// convert ASCII string to long // see http://code.google.com/p/minilib-c/source/browse/trunk/stdlib/atol.c long atol(const char *s) { return strtol (s, NULL, 10); } |
.................................................... //zenglOX kernel main entry ZLOX_SINT32 zlox_kernel_main(ZLOX_MULTIBOOT * mboot_ptr, ZLOX_UINT32 initial_stack) { .................................................... zlox_syscall_monitor_write("! I will execve a shell\n" "you can input some command: ls , ps , cat , uname , cpuid , shell ," " reboot , shutdown , ata , mount , unmount , testoverflow , fdisk , " "format , file , vga , dhcp isoget...\n\n" " this version we ported zengl language O(^_^)O~~ \n\n"); asm ("finit"); zlox_syscall_execve("shell"); .................................................... } |