查找放置进程的位置
在中断调用int 0x40,19号调用中,获取应用本身的参数以后,调用了一个获取未被占用内存的过程call find_free_mem。在获取内存之前调用了一个过程获取放置进程位置的过程find_free_process_slot。
find_free_process_slot:
pusha ;保留现场参数
mov ebx,[0x3004] ;把进程数赋值给ebx
mov [check_processes],ebx ; 把进程数赋值到check_processes地址中
inc ebx ; ebx加一
mov [new_process_place],ebx ; ebx加一后赋值到new_process_place地址中
mov ebx,2 ;把ebx赋值为2, 1估计是用于osloop了
newfps: ;newfps= new free process slot
mov eax,ebx ; 把ebx赋值给eax
imul eax,0x20 ; 从3020开始放置进程信息,每个进程占用32个字节
add eax,0x3000+0xa ;eax+0xa, 得到进程状态信息
cmp [eax],byte 9 ;是否状态为9
je ffpl ;如果是,则找到
inc ebx ;否,则ebx加一
cmp ebx,[0x3004] ; 和进程数比大小
jbe newfps ;小于等于,则跳转newfps, 去比较相应的状态是否可用
cmp dword [0x3004],dword max_processes ;和预定义的最大进程数255比较(kernel.asm中第一行)
jae noaddnewp ; 如果大于等于则无法再增加进程了
mov ebx , [0x3004] ;将现有进程数赋值ebx
add ebx , 1 ;ebx+1
imul ebx , 0x20 ; 乘以32
mov [0x3000+ebx+0xa],byte 9 ;+0xa,赋值进程状态为9
add dword [0x3004],dword 1 ; 将进程数+1
mov ebx,[0x3004] ;将进程数赋值给ebx
mov [check_processes],ebx ; 将进程数赋值给check_processes地址
mov [new_process_place],ebx ;找到进程放置位置,赋值给以后要用到的new_process_place
noaddnewp:
popa ; 恢复现场参数
ret ;调用返回
ffpl:
mov [new_process_place],ebx
popa
ret
浙公网安备 33010602011771号