Subversion Repositories Kolibri OS

Rev

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