在launcher.asm的应用程序中,可以看到头部信息如下:
use32
org 0x0
db 'MENUET01' ; 8 byte id
dd 0x01 ; header version
dd START ; start of code
dd I_END ; size of image
dd 0x100000 ; memory for app
dd 0x7fff0 ; esp
dd 0x0 , 0x0 ; I_Param , I_Icon
这些信息都是非常有用的,那么如何获取这些信息呢?launcher.asm调用了syscall_startapp, 而syscall_startapp调用了sys32.inc中的start_application_fl过程(3027行)。
start_application_fl过程将文件加载到了0x9000处,在memmap.inc文件中0x90000-0x9FFFF显示为tmp,意思为临时使用的地方。在start_application_fl中识别头部以后,就调用了get_app_params过程(3060行)。
在get_app_params过程中,如果是01,则执行如下部分:
mov eax,[0x90000+12]
mov [app_start],eax
mov eax,[0x90000+16]
mov [app_i_end],eax
mov eax,[0x90000+20]
mov [app_mem],eax
mov eax,[0x90000+24]
mov [app_esp],eax
mov eax,[0x90000+28]
mov [app_i_param],eax
mov eax,[0x90000+32]
mov [app_i_icon],eax
这样,在3243-3248行的内容就有了数据,获取了应用程序的头部信息。
等等,用launcher加载桌面背景,桌面图标和底部任务栏时都带了BOOT参数怎么设置的呢?可以肯定在内存中的应用程序用到的参数应该是BOOT呀。
把上述代码中的一下两行注释掉,看看效果:
;mov eax,[0x90000+28]
;mov [app_i_param],eax
没有效果,而且还有点怪异现象,看来不是在这里设置的。
再往下走就到了add_app_parameters过程了。当初在这里曾经做过实验,开始直接跳到no_app_params处,桌面显示的是不带BOOT参数的情况。在add_app_parameters
过程起始处到no_app_params之间,有一个标签显示的是app_new_param,难道是这里?注释掉从app_new_param开始的四行:
;app_new_param:
; cmp [esi],byte 0
; jz no_app_params
; movsb
; loop app_new_param
重新编译kernel.asm,命令行: fasm e:\menuet32\k086b\kernel.asm e:\menuet32\k086b\kernel.mnt, 用ultraISO写入磁盘文件。
不注释这四行,桌面正常显示,注释掉这四行,显示出来的如同不带BOOT参数一样,注释掉,如下:
注释掉的四行就把BOOT参数带入了?有意思!!!