reduce kernel memory

git-svn-id: svn://kolibrios.org@363 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Sergey Semyonov (Serge) 2007-02-19 08:22:55 +00:00
parent 8df9a500b6
commit 0f0c0aabfa
8 changed files with 95 additions and 110 deletions

View File

@ -225,11 +225,10 @@ resendQ equ OS_BASE+0x0770000
;skin_data equ OS_BASE+0x0778000
draw_data equ OS_BASE+0x0800000
tss_data equ 0x780000
draw_data equ 0x988000
tss_data equ 0x0803000 ;OS_BASE+0x0920000
HEAP_BASE equ 0xA0B000 ;x00C00000
HEAP_BASE equ 0x98B000
pages_tab equ 0x60000000
master_tab equ 0x60180000
@ -435,7 +434,6 @@ struc PG_DATA
.kernel_tables dd ?
.sys_page_dir dd ?
.pg_mutex dd ?
.tmp_task_mutex dd ?
}
;struc LIB

View File

@ -461,6 +461,20 @@ proc read_file stdcall,file_name:dword, buffer:dword, off:dword,\
ret
endp
; description
; allocate kernel memory and loads the specified file
;
; param
; file_name= full path to file
;
; retval
; eax= file image in kernel memory
; ebx= size of file
;
; warging
; You mast call kernel_free() to delete each file
; loaded by the load_file() function
align 4
proc load_file stdcall, file_name:dword
locals

View File

@ -1363,7 +1363,6 @@ align 16
tmp_task_pdir rd 1
tmp_task_ptab rd 1
tmp_task_data rd 1
fdd_buff rd 1
LFBSize rd 1

View File

@ -543,14 +543,14 @@ get_app_params:
ret
uglobal
new_process_place dd 0x0
app_start dd 0x0
app_i_end dd 0x0
app_mem dd 0x0
app_esp dd 0x0
app_i_param dd 0x0
app_i_icon dd 0x0
app_mem_pos dd 0x0
; new_process_place dd 0x0
; app_start dd 0x0
; app_i_end dd 0x0
; app_mem dd 0x0
; app_esp dd 0x0
; app_i_param dd 0x0
; app_i_icon dd 0x0
; app_mem_pos dd 0x0
endg
end if

View File

@ -71,24 +71,54 @@ macro _clear_ op
rep stosd
}
align 4
proc fs_exec stdcall file_name:dword, cmd_line:dword, flags:dword
proc fs_execute
;fn_read:dword, file_size:dword, cluster:dword
; ebx - cmdline
; edx - flags
; ebp - full filename
; [esp+4] = procedure DoRead, [esp+8] = filesize & [esp+12]... - arguments for it
locals
cmdline rd 64 ;256/4
filename rd 256 ;1024/4
flags dd ?
save_cr3 dd ?
slot dd ?
slot_base dd ?
file_base dd ?
file_size dd ?
app_cmdline dd ? ;0x00
app_path dd ? ;0x04
app_eip dd ? ;0x08
app_esp dd ? ;0x0C
app_mem dd ? ;0x10
app_i_end dd ? ;0x14
;app header data
hdr_cmdline dd ? ;0x00
hdr_path dd ? ;0x04
hdr_eip dd ? ;0x08
hdr_esp dd ? ;0x0C
hdr_mem dd ? ;0x10
hdr_i_end dd ? ;0x14
endl
stdcall load_file,[file_name]
pushad
mov [cmdline], ebx
mov [flags], edx
; [ebp] pointer to filename
lea eax, [filename]
mov dword [eax+1020],0 ;force terminate
;string
stdcall k_strncpy, eax, [ebp], 1023
lea eax, [cmdline]
mov dword [eax+252], 0
stdcall k_strncpy, eax, [cmdline], 255
lea eax, [filename]
stdcall load_file, eax
mov ecx, -ERROR_FILE_NOT_FOUND
test eax, eax
jz .err_file
@ -96,7 +126,7 @@ proc fs_exec stdcall file_name:dword, cmd_line:dword, flags:dword
mov [file_base], eax
mov [file_size], ebx
lea ebx, [app_cmdline]
lea ebx, [hdr_cmdline]
call test_app_header
mov ecx, -0x1F
test eax, eax
@ -117,8 +147,8 @@ proc fs_exec stdcall file_name:dword, cmd_line:dword, flags:dword
cmp eax, 0
jne .wait_lock
pushfd
cli
; pushfd
; cli
call set_application_table_status
@ -135,14 +165,14 @@ proc fs_exec stdcall file_name:dword, cmd_line:dword, flags:dword
_clear_ 256 ;clean extended information about process
; write application name
mov edi, [file_name]
lea edi, [filename]
mov al, '/'
call k_strrchr ; now eax points to name without path
lea esi, [eax+1]
test eax, eax
jnz @F
mov esi, [file_name]
lea esi, [filename]
@@:
mov ecx, 8 ; 8 chars for name
mov edi, [slot_base]
@ -159,18 +189,18 @@ proc fs_exec stdcall file_name:dword, cmd_line:dword, flags:dword
mov ebx, cr3
mov [save_cr3], ebx
stdcall create_app_space,[app_mem],[file_base],[file_size]
stdcall create_app_space,[hdr_mem],[file_base],[file_size]
test eax, eax
jz .failed
mov ebx,[slot_base]
mov [ebx+APPDATA.dir_table],eax
mov eax,[app_mem]
mov eax,[hdr_mem]
mov [ebx+APPDATA.mem_size],eax
if GREEDY_KERNEL
else
mov ecx, [app_mem]
mov ecx, [hdr_mem]
mov edi, [file_size]
add edi, 4095
and edi, not 4095
@ -187,14 +217,15 @@ end if
; release only virtual space, not phisical memory
stdcall free_kernel_space, [file_base]
lea eax, [app_cmdline]
stdcall set_app_params ,[slot],eax,[cmd_line],\
[file_name], [flags]
lea eax, [hdr_cmdline]
lea ebx, [cmdline]
lea ecx, [filename]
stdcall set_app_params ,[slot],eax,ebx,ecx,[flags]
mov eax, [save_cr3]
call set_cr3
popfd
; popfd
xor ebx, ebx
mov [application_table_status],ebx ;unlock application_table_status mutex
mov eax,[process_number] ;set result
@ -203,7 +234,7 @@ end if
mov eax, [save_cr3]
call set_cr3
.err:
popfd
; popfd
.err_hdr:
stdcall kernel_free,[file_base]
.err_file:
@ -548,63 +579,6 @@ proc destroy_app_space stdcall, pg_dir:dword
ret
endp
align 4
proc fs_execute
;fn_read:dword, file_size:dword, cluster:dword
; ebx - cmdline
; edx - flags
; ebp - full filename
; [esp+4] = procedure DoRead, [esp+8] = filesize & [esp+12]... - arguments for it
locals
cmdline dd ?
flags dd ?
filename dd ?
retval dd ?
endl
pushad
mov [cmdline], ebx
mov [flags], edx
mov eax, [ebp]
mov [filename], eax
mov ebx, pg_data.tmp_task_mutex
call wait_mutex ;ebx
mov edi, [tmp_task_data]
mov ecx, (1024+256)/4
xor eax, eax
rep stosd
mov esi, [filename]
mov edi, [tmp_task_data]
mov ecx, 1024
rep movsb
mov esi, [cmdline]
test esi, esi
jz @f
mov ecx, 256
rep movsb
@@:
mov eax, [tmp_task_data]
lea ebx, [eax+1024] ;cmd line
stdcall fs_exec, eax, ebx, [flags]
mov [retval], eax
popad
mov [pg_data.tmp_task_mutex], 0
mov eax, [retval]
ret
endp
pid_to_slot:
;Input:
; eax - pid of process

View File

@ -96,7 +96,7 @@ create_event:
jz .fail
mov [eax+APPOBJ.magic], 'EVNT'
mov [eax+APPOBJ.destroy], destroy_event
mov [eax+APPOBJ.destroy], destroy_event.internal
mov [eax+EVENT.id], ebx
mov ebx, [CURRENT_TASK]
@ -144,12 +144,12 @@ destroy_event:
jne .fail
cmp [eax+EVENT.id], ebx
jne .fail
.internal:
mov ebx, [eax+APPOBJ.fd]
mov ecx, [eax+APPOBJ.bk]
mov [ebx+APPOBJ.bk], ecx
mov [ecx+APPOBJ.fd], ebx
.internal:
.force:
xor edx, edx ;clear common header
mov [eax], edx
mov [eax+4], edx
@ -268,7 +268,7 @@ proc get_event_ex stdcall, p_ev:dword, timeout:dword
ret
.destroy:
call destroy_event.internal
call destroy_event.force
ret
.switch:
mov eax, [0x3010]
@ -331,7 +331,7 @@ wait_event:
add esp, 4
ret
.destroy:
call destroy_event.internal
call destroy_event.force
add esp, 4
ret
.switch:

View File

@ -418,9 +418,6 @@ B32:
add eax, ebx
mov [ipc_ptab], eax
stdcall kernel_alloc, 0x1000
mov [tmp_task_data], eax
call init_events
mov eax, srv.fd-SRV_FD_OFFSET
@ -682,12 +679,18 @@ include 'vmodeld.inc'
cmp byte [0x2f0000+0x9030],1
jne no_load_vrr_m
stdcall fs_exec, vrr_m, 0, 0
mov ebp, vrr_m
xor ebx, ebx
xor edx, edx
call fs_execute
cmp eax,2 ; if vrr_m app found (PID=2)
je first_app_found
no_load_vrr_m:
stdcall fs_exec, firstapp, 0, 0
mov ebp, firstapp
xor ebx, ebx
xor edx, edx
call fs_execute
cmp eax,2 ; continue if a process has been loaded
je first_app_found
mov eax, 0xDEADBEEF ; otherwise halt

View File

@ -199,10 +199,10 @@
; 760000 -> 76ffff !vrr driver
; 770000 -> 777fff tcp memory ( 32 kb)
;
; 778000 -> 77ffff window skinning ( 32 kb)
; 780000 -> 7fffff reserved to physical memory manager
; 780000 -> 987FFF TSS and IO map for (8192*8)=65536 ports
; (128+8192)*256 = 2129920 = 0x208000
;
; 800000 -> 801FFF draw_data - 256 entries
; 988000 -> 98AFFF draw_data - 256 entries
;
; 00 dword draw limit - x start
; 04 dword draw limit - y start
@ -210,10 +210,7 @@
; 0C dword draw limit - y end
;
;
; 803000 -> 0xA0AFFF TSS and IO map for (8192*8)=65536 ports
; (128+8192)*256 = 2129920 = 0x208000
;
; 0xA0B000 -> kernel heap
; 0x0098B000 -> kernel heap