Rev 2 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2 | Rev 69 | ||
---|---|---|---|
1 | virtual at 0 |
1 | virtual at 0 |
2 | physical_mem_block: |
2 | physical_mem_block: |
3 | .start rd 1 |
3 | .start rd 1 |
4 | .size rd 1 |
4 | .size rd 1 |
5 | .flags rd 1 ;0-free, pid-used. |
5 | .flags rd 1 ;0-free, pid-used. |
6 | .sizeof: |
6 | .sizeof: |
7 | end virtual |
7 | end virtual |
8 | max_physical_mem_blocks = 24 |
8 | max_physical_mem_blocks = 24 |
9 | uglobal |
9 | uglobal |
10 | num_physical_mem_blocks rd 1 |
10 | num_physical_mem_blocks rd 1 |
11 | physical_mem_blocks rd 3*max_physical_mem_blocks |
11 | physical_mem_blocks rd 3*max_physical_mem_blocks |
12 | endg |
12 | endg |
13 | Init_Physical_Memory_Manager: |
13 | Init_Physical_Memory_Manager: |
14 | pushad |
14 | pushad |
15 | mov edi,physical_mem_blocks |
15 | mov edi,physical_mem_blocks |
16 | mov ecx,3*max_physical_mem_blocks |
16 | mov ecx,3*max_physical_mem_blocks |
17 | xor eax,eax |
17 | xor eax,eax |
18 | cld |
18 | cld |
19 | rep stosd |
19 | rep stosd |
20 | mov dword [num_physical_mem_blocks],2 |
20 | mov dword [num_physical_mem_blocks],2 |
21 | mov [physical_mem_blocks+physical_mem_block.start],0x60000 |
21 | mov [physical_mem_blocks+physical_mem_block.start],0x60000 |
22 | mov [physical_mem_blocks+physical_mem_block.size],0x20000 ;128Kb |
22 | mov [physical_mem_blocks+physical_mem_block.size],0x20000 ;128Kb |
23 | mov [physical_mem_blocks+physical_mem_block.sizeof+physical_mem_block.start],0x780000 |
23 | mov [physical_mem_blocks+physical_mem_block.sizeof+physical_mem_block.start],0x780000 |
24 | mov [physical_mem_blocks+physical_mem_block.sizeof+physical_mem_block.size],0x80000 ;512Kb |
24 | mov [physical_mem_blocks+physical_mem_block.sizeof+physical_mem_block.size],0x80000 ;512Kb |
25 | popad |
25 | popad |
26 | ret |
26 | ret |
27 | Insert_Block: |
27 | Insert_Block: |
28 | ;input: |
28 | ;input: |
29 | ; eax - handle |
29 | ; eax - handle |
30 | ;output: |
30 | ;output: |
31 | ; none |
31 | ; none |
32 | push eax ecx esi edi |
32 | push eax ecx esi edi |
33 | sub eax,[num_physical_mem_blocks] |
33 | sub eax,[num_physical_mem_blocks] |
34 | neg eax |
34 | neg eax |
35 | mov edi,physical_mem_block.sizeof |
35 | mov edi,physical_mem_block.sizeof |
36 | imul eax,edi |
36 | imul eax,edi |
37 | shr eax,2 |
37 | shr eax,2 |
38 | mov ecx,eax |
38 | mov ecx,eax |
39 | mov esi,[num_physical_mem_blocks] |
39 | mov esi,[num_physical_mem_blocks] |
40 | imul esi,edi |
40 | imul esi,edi |
41 | add esi,physical_mem_blocks |
41 | add esi,physical_mem_blocks |
42 | lea edi,[esi+physical_mem_block.sizeof] |
42 | lea edi,[esi+physical_mem_block.sizeof] |
43 | std |
43 | std |
44 | rep movsd |
44 | rep movsd |
45 | pop edi esi ecx eax |
45 | pop edi esi ecx eax |
46 | ret |
46 | ret |
47 | Delete_Block: |
47 | Delete_Block: |
48 | ;input: |
48 | ;input: |
49 | ; eax - handle |
49 | ; eax - handle |
50 | ;output: |
50 | ;output: |
51 | ; none |
51 | ; none |
52 | pushad |
52 | pushad |
53 | mov edi,eax |
53 | mov edi,eax |
54 | sub eax,[num_physical_mem_blocks] |
54 | sub eax,[num_physical_mem_blocks] |
55 | neg eax |
55 | neg eax |
56 | dec eax |
56 | dec eax |
57 | mov esi,physical_mem_block.sizeof |
57 | mov esi,physical_mem_block.sizeof |
58 | imul eax,esi |
58 | imul eax,esi |
59 | imul edi,esi |
59 | imul edi,esi |
60 | add edi,physical_mem_blocks |
60 | add edi,physical_mem_blocks |
61 | lea esi,[edi+physical_mem_block.sizeof] |
61 | lea esi,[edi+physical_mem_block.sizeof] |
62 | mov ecx,eax |
62 | mov ecx,eax |
63 | shr ecx,2 |
63 | shr ecx,2 |
64 | cld |
64 | cld |
65 | rep movsd |
65 | rep movsd |
66 | popad |
66 | popad |
67 | ret |
67 | ret |
68 | Allocate_Physical_Block: |
68 | Allocate_Physical_Block: |
69 | ;input: |
69 | ;input: |
70 | ; eax - size |
70 | ; eax - size |
71 | ;output: |
71 | ;output: |
72 | ; eax - address or 0 if not enough memory. |
72 | ; eax - address or 0 if not enough memory. |
73 | pushad |
73 | pushad |
74 | cmp [num_physical_mem_blocks],max_physical_mem_blocks |
74 | cmp [num_physical_mem_blocks],max_physical_mem_blocks |
75 | jge .error |
75 | jge .error |
76 | mov ebx,eax |
76 | mov ebx,eax |
77 | xor eax,eax |
77 | xor eax,eax |
78 | mov esi,physical_mem_blocks |
78 | mov esi,physical_mem_blocks |
79 | .loop: |
79 | .loop: |
80 | cmp dword [esi+physical_mem_block.flags],0 |
80 | cmp dword [esi+physical_mem_block.flags],0 |
81 | jnz .next |
81 | jnz .next |
82 | cmp [esi+physical_mem_block.size],ebx |
82 | cmp [esi+physical_mem_block.size],ebx |
83 | jg .addblock |
83 | jg .addblock |
84 | jz .noaddblock |
84 | jz .noaddblock |
85 | .next: |
85 | .next: |
86 | inc eax |
86 | inc eax |
87 | add esi,physical_mem_block.sizeof |
87 | add esi,physical_mem_block.sizeof |
88 | cmp eax,[num_physical_mem_blocks] |
88 | cmp eax,[num_physical_mem_blocks] |
89 | jl .loop |
89 | jl .loop |
90 | .error: |
90 | .error: |
91 | popad |
91 | popad |
92 | xor eax,eax |
92 | xor eax,eax |
93 | ret |
93 | ret |
94 | .noaddblock: |
94 | .noaddblock: |
95 | mov eax,[esi+physical_mem_block.start] |
95 | mov eax,[esi+physical_mem_block.start] |
96 | mov [esp+28],eax |
96 | mov [esp+28],eax |
97 | mov eax,[0x3010] |
97 | mov eax,[0x3010] |
98 | mov eax,[eax+0x4] |
98 | mov eax,[eax+0x4] |
99 | mov [esi+physical_mem_block.flags],eax |
99 | mov [esi+physical_mem_block.flags],eax |
100 | popad |
100 | popad |
101 | ret |
101 | ret |
102 | .addblock: |
102 | .addblock: |
103 | call Insert_Block |
103 | call Insert_Block |
104 | inc dword [num_physical_mem_blocks] |
104 | inc dword [num_physical_mem_blocks] |
105 | mov eax,[esi+physical_mem_block.start] |
105 | mov eax,[esi+physical_mem_block.start] |
106 | mov [esp+28],eax |
106 | mov [esp+28],eax |
107 | mov ecx,[0x3010] |
107 | mov ecx,[0x3010] |
108 | mov ecx,[ecx+0x4] |
108 | mov ecx,[ecx+0x4] |
109 | mov [esi+physical_mem_block.flags],ecx |
109 | mov [esi+physical_mem_block.flags],ecx |
110 | mov ecx,[esi+physical_mem_block.size] |
110 | mov ecx,[esi+physical_mem_block.size] |
111 | mov [esi+physical_mem_block.size],ebx |
111 | mov [esi+physical_mem_block.size],ebx |
112 | sub ecx,ebx |
112 | sub ecx,ebx |
113 | mov [esi+physical_mem_block.sizeof+physical_mem_block.size],ecx |
113 | mov [esi+physical_mem_block.sizeof+physical_mem_block.size],ecx |
114 | add ebx,[esi+physical_mem_block.start] |
114 | add ebx,[esi+physical_mem_block.start] |
115 | mov [esi+physical_mem_block.sizeof+physical_mem_block.start],ebx |
115 | mov [esi+physical_mem_block.sizeof+physical_mem_block.start],ebx |
116 | mov dword [esi+physical_mem_block.sizeof+physical_mem_block.flags],0 |
116 | mov dword [esi+physical_mem_block.sizeof+physical_mem_block.flags],0 |
117 | popad |
117 | popad |
118 | ret |
118 | ret |
119 | Free_Physical_Block: |
119 | Free_Physical_Block: |
120 | ;input: |
120 | ;input: |
121 | ; eax - address |
121 | ; eax - address |
122 | ;output: |
122 | ;output: |
123 | ; none |
123 | ; none |
124 | pushad |
124 | pushad |
125 | test eax,eax |
125 | test eax,eax |
126 | jz .ret |
126 | jz .ret |
127 | mov ebx,eax |
127 | mov ebx,eax |
128 | xor eax,eax |
128 | xor eax,eax |
129 | mov esi,physical_mem_blocks |
129 | mov esi,physical_mem_blocks |
130 | .loop: |
130 | .loop: |
131 | cmp ebx,[esi+physical_mem_block.start] |
131 | cmp ebx,[esi+physical_mem_block.start] |
132 | jz .endloop |
132 | jz .endloop |
133 | inc eax |
133 | inc eax |
134 | add esi,physical_mem_block.sizeof |
134 | add esi,physical_mem_block.sizeof |
135 | cmp eax,[num_physical_mem_blocks] |
135 | cmp eax,[num_physical_mem_blocks] |
136 | jl .loop |
136 | jl .loop |
137 | jmp .ret |
137 | jmp .ret |
138 | .endloop: |
138 | .endloop: |
139 | mov dword [esi+physical_mem_block.flags],0 |
139 | mov dword [esi+physical_mem_block.flags],0 |
140 | test eax,eax |
140 | test eax,eax |
141 | jz .no_union_previous |
141 | jz .no_union_previous |
142 | cmp dword [esi-physical_mem_block.sizeof+physical_mem_block.flags],0 |
142 | cmp dword [esi-physical_mem_block.sizeof+physical_mem_block.flags],0 |
143 | jnz .no_union_previous |
143 | jnz .no_union_previous |
144 | mov ebx,[esi-physical_mem_block.sizeof+physical_mem_block.start] |
144 | mov ebx,[esi-physical_mem_block.sizeof+physical_mem_block.start] |
145 | add ebx,[esi-physical_mem_block.sizeof+physical_mem_block.size] |
145 | add ebx,[esi-physical_mem_block.sizeof+physical_mem_block.size] |
146 | cmp ebx,[esi+physical_mem_block.start] |
146 | cmp ebx,[esi+physical_mem_block.start] |
147 | jnz .no_union_previous |
147 | jnz .no_union_previous |
148 | mov ebx,[esi+physical_mem_block.size] |
148 | mov ebx,[esi+physical_mem_block.size] |
149 | add [esi-physical_mem_block.sizeof+physical_mem_block.size],ebx |
149 | add [esi-physical_mem_block.sizeof+physical_mem_block.size],ebx |
150 | call Delete_Block |
150 | call Delete_Block |
151 | dec eax |
151 | dec eax |
152 | dec [num_physical_mem_blocks] |
152 | dec [num_physical_mem_blocks] |
153 | .no_union_previous: |
153 | .no_union_previous: |
154 | inc eax |
154 | inc eax |
155 | cmp eax,[num_physical_mem_blocks] |
155 | cmp eax,[num_physical_mem_blocks] |
156 | jge .no_union_next |
156 | jge .no_union_next |
157 | cmp dword [esi+physical_mem_block.sizeof+physical_mem_block.flags],0 |
157 | cmp dword [esi+physical_mem_block.sizeof+physical_mem_block.flags],0 |
158 | jnz .no_union_next |
158 | jnz .no_union_next |
159 | mov ebx,[esi+physical_mem_block.start] |
159 | mov ebx,[esi+physical_mem_block.start] |
160 | add ebx,[esi+physical_mem_block.size] |
160 | add ebx,[esi+physical_mem_block.size] |
161 | cmp ebx,[esi+physical_mem_block.sizeof+physical_mem_block.start] |
161 | cmp ebx,[esi+physical_mem_block.sizeof+physical_mem_block.start] |
162 | jnz .no_union_next |
162 | jnz .no_union_next |
163 | mov ebx,[esi+physical_mem_block.sizeof+physical_mem_block.size] |
163 | mov ebx,[esi+physical_mem_block.sizeof+physical_mem_block.size] |
164 | add [esi+physical_mem_block.size],ebx |
164 | add [esi+physical_mem_block.size],ebx |
165 | call Delete_Block |
165 | call Delete_Block |
166 | dec [num_physical_mem_blocks] |
166 | dec [num_physical_mem_blocks] |
167 | .no_union_next: |
167 | .no_union_next: |
168 | .ret: |
168 | .ret: |
169 | popad |
169 | popad |
170 | ret |
170 | ret |
171 | 171 | ||
172 | sys_allocate_physical_block: |
172 | sys_allocate_physical_block: |
173 | ;eax - subfunction number |
173 | ;eax - subfunction number |
174 | mov eax,ebx |
174 | mov eax,ebx |
175 | call Allocate_Physical_Block |
175 | call Allocate_Physical_Block |
176 | mov [esp+36],eax |
176 | mov [esp+36],eax |
177 | ret |
177 | ret |
178 | sys_free_physical_block: |
178 | sys_free_physical_block: |
179 | ;eax - subfunction number |
179 | ;eax - subfunction number |
180 | mov eax,ebx |
180 | mov eax,ebx |
181 | call Free_Physical_Block |
181 | call Free_Physical_Block |
182 | ret |
182 | ret |
183 | sys_set_buffer: |
183 | sys_set_buffer: |
184 | add ecx,std_application_base_address |
184 | add ecx,std_application_base_address |
185 | isys_set_buffer: ;for using in kernel |
185 | isys_set_buffer: ;for using in kernel |
186 | ;eax - subfunction number |
186 | ;eax - subfunction number |
187 | ;ebx - physical address |
187 | ;ebx - physical address |
188 | ;ecx - buffer start |
188 | ;ecx - buffer start |
189 | ;edx - buffer size |
189 | ;edx - buffer size |
190 | lea edi,[ebx+second_base_address] |
190 | lea edi,[ebx+second_base_address] |
191 | mov esi,ecx |
191 | mov esi,ecx |
192 | mov ecx,edx |
192 | mov ecx,edx |
- | 193 | cld |
|
193 | rep movsb |
194 | rep movsb |
194 | ret |
195 | ret |
195 | sys_get_buffer: |
196 | sys_get_buffer: |
196 | add ecx,std_application_base_address |
197 | add ecx,std_application_base_address |
197 | isys_get_buffer: ;for using in kernel |
198 | isys_get_buffer: ;for using in kernel |
198 | ;eax - subfunction number |
199 | ;eax - subfunction number |
199 | ;ebx - physical address |
200 | ;ebx - physical address |
200 | ;ecx - buffer start |
201 | ;ecx - buffer start |
201 | ;edx - buffer size |
202 | ;edx - buffer size |
202 | mov edi,ecx |
203 | mov edi,ecx |
203 | lea esi,[ebx+second_base_address] |
204 | lea esi,[ebx+second_base_address] |
204 | mov ecx,edx |
205 | mov ecx,edx |
- | 206 | cld |
|
205 | rep movsb |
207 | rep movsb |
206 | ret |
208 | ret |
207 | sys_internal_services: |
209 | sys_internal_services: |
208 | cmp eax,4 |
210 | cmp eax,4 |
209 | jle sys_sheduler |
211 | jle sys_sheduler |
210 | cmp eax,5 |
212 | cmp eax,5 |
211 | jz sys_allocate_physical_block |
213 | jz sys_allocate_physical_block |
212 | cmp eax,6 |
214 | cmp eax,6 |
213 | jz sys_free_physical_block |
215 | jz sys_free_physical_block |
214 | cmp eax,7 |
216 | cmp eax,7 |
215 | jz sys_set_buffer |
217 | jz sys_set_buffer |
216 | cmp eax,8 |
218 | cmp eax,8 |
217 | jz sys_get_buffer |
219 | jz sys_get_buffer |
218 | ret |
220 | ret |