Re: Mem under Linux



On Sun, 30 Dec 2007 16:10:24 GMT
Frank Kotler <fbkotler@xxxxxxxxxxx> wrote:

(note that you can also use sys_mmap of an anonymous object to get
memory - dunno which is best...)

Not much difference, actually, as brk is just a special case of mmap
which extends the existing allocation, instead of creating a new one.
The key point in both cases is that the kernel calls should be used
only to create a pool of storage from which smaller allocations can be
made by the application. For example:

;get buffer subroutine
;called with requested length in eax
;returns with buffer address in esi
getbuf: frame
push eax
push ebx
push ecx
push edx
push edi
mov ebx,eax ;original request
length add eax,31 ;allow for header & rounding
and eax,0fffffff8h ;round to doubleword boundry
mov edi,[faqehd] ;1st faqe pointer
or edi,edi ;exist?
jnz getb10 ;no problem
call initheap ;initialize heap
mov edi,[faqehd] ;1st faqe pointer
;scan faqe chain for available space
getb10: mov esi,[edi+qenxt] ;next q element
cmp esi,bfrhd ;in buffer pool?
debugt: jnb getb12 ;yes
err 204h ;bad faqe chain
getb12: cmp esi,bfrtl
cmp [esi+qelen],eax ;enough space?
jae getb20 ;yes
mov edi,esi ;previous in chain
cmp word [esi+qenxt],0 ;any more?
jnz getb10 ;yes
err 201h
;build allocated queue area header
getb20: mov ecx,[esi+qelen] ;free area length
mov [esi+qelen],eax ;allocation length
mov [esi+qetsk],ebx ;mark ownership
mov edx,[esi+qenxt] ;save chain pointer
mov dword [esi+qenxt],0 ;clear chain pointer
mov dword [esi+qedln],0 ;clear data length
sub ecx,eax ;remaining space
jz getb40 ;skip buileding faqe
;build faqe in remaining space
push esi
add esi,eax ;point to remaining space
cmp esi,[bfrtl] ;past end of buffer pool?
jb getb35 ;no problem
err 204h
getb35: mov [esi+qelen],ecx ;esize of free area
mov [esi+qenxt],edx ;pointer to next
mov dword [esi+qetsk],0 ;show unowned
mov dword [esi+qedln],0 ;show empty
mov edx,esi ;new faqe
pop esi
;update pointer in previous faqe
getb40: mov [edi+qenxt],edx ;current faqe
mov ecx,[esi+qelen] ;length of area
sub ecx,qedta ;length of data
xor eax,eax ;zero
add esi,qedta ;return start of data
mov edi,esi ;start of data
rep stosb ;clear allocated area
clc ;show allocated
pop edi
pop edx
pop ecx
pop ebx
pop eax
exitf


.