关于应用程序头部信息


在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参数带入了?有意思!!!

 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/282513.html

(0)
上一篇 2022年8月27日 16:45
下一篇 2022年8月27日 16:46

相关推荐

发表回复

登录后才能评论