Advertisement
DavidsonDFGL

MemoryManager - Theldus

Jan 11th, 2014
362
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ###########################################################
  2. #PROPOSITO: Simples gerenciador de memoria                #
  3. #                                                         #
  4. #NOTAS: Isto e(ou deveria ser) um simples gerenciador     #
  5. #       de memoria que segue a estrutura abaixo para      #
  6. #       cada campo adicionado.                            #
  7. #                                                         #
  8. ###########################################################
  9. # #Disponivel#Tamanho memoria#Localizacao atual memoria#  #
  10. ###########################################################
  11. #                             ^--Ponteiro retornado       #
  12. #                                aponta aqui              #
  13. #         O ponteiro retornado, aponta para o inicio      #
  14. #         da regiao de memoria a comecar a ser escrita    #
  15. #        -(ate onde testei nao haviam leaks)-             #
  16. #-(memoria so e liberada efetivamente no termino do prog)-#
  17. #                                                         #
  18. #Para montar e linkar:                                    #
  19. #as theldus.s -o theldus.o                                #
  20. #ld theldus.o -o libtheldus.so -shared                    #
  21. #                                                         #
  22. #Para usar:                                               #
  23. #LD_PRELOAD=./libtheldus.so ./seuprogemC          #
  24. #                             #
  25. #*Seu programa para fazer uso do gerenciador, devera      #
  26. #utilizar malloc e free, :D               #
  27. #     --Funciona somente em sistemas Linux x86--          #
  28. #                             #
  29. #by Theldus 2014                                          #
  30. ###########################################################
  31.  
  32. .section .data
  33. #######VARIAVEIS GLOBAIS########
  34.  
  35. #Aponta inicio da memoria
  36. heap_begin:
  37. .long 0
  38.  
  39. #Aponta para 1 posicao a frente do Break
  40. current_break:
  41. .long 0
  42.  
  43. pos_free:
  44. .long 0
  45.  
  46. size_field:
  47. .long 0
  48.  
  49. popup: .ascii "\n###########################\n#Theldus MemoryManager, :D#\n###########################\n\0"
  50. .equ len_Popup, .-popup
  51.  
  52. ######INFORMACAO DO HEADER####
  53. #  1byte avail / 4bytes size #
  54.  
  55. #Tamanho do header
  56. .equ HEADER_SIZE, 5
  57. #Campo 'disponivel' no header
  58. .equ HDR_AVAIL,0
  59. #Campo tamanho no header
  60. .equ HDR_SIZE,1
  61. #Tamanho minimo para particionar 'bloco'
  62. .equ TAM_MIN,HEADER_SIZE+1
  63.  
  64.  
  65. ###########CONSTANTES###########
  66. .equ INDISP, 0
  67. .equ DISP, 1
  68. .equ SYS_BRK, 45
  69.  
  70. .equ SYSCALL, 0x80
  71.  
  72. .section .text
  73.  
  74. #############Funcao Malloc_Init#############
  75. #                                          #
  76. #Apenas inicializa as posicoes inicias do  #
  77. #break e do heap.                          #
  78. #                                          #
  79. #       -nao requer parametros-            #
  80. ############################################
  81.  
  82. .globl malloc_init
  83. .type  malloc_init,@function
  84. malloc_init:
  85. pushl %ebp
  86. movl  %esp,%ebp
  87.  
  88. #Propaganda, hu3hu3hu3#
  89. movl $4,%eax
  90. movl $2,%ebx
  91. movl $popup,%ecx
  92. movl $len_Popup,%edx
  93. int  $SYSCALL
  94.  
  95. movl $0,%eax
  96. movl $0,%ebx
  97. movl $0,%ecx
  98. movl $0,%edx
  99. ######################
  100.  
  101. movl $SYS_BRK,%eax
  102. movl $0,%ebx
  103. int  $SYSCALL
  104.  
  105. incl %eax    #<-- obtem primeira posicao inacessivel memoria
  106. movl %eax,heap_begin
  107. movl %eax,current_break
  108.  
  109. movl %ebp,%esp
  110. popl %ebp
  111. ret
  112.  
  113. #############Funcao Malloc##################
  114. #                                          #
  115. #Reserva espaco na heap de acordo com o    #
  116. #o tamanho informado em 8(%ebp).           #
  117. #                                          #
  118. #8(%ebp)=ecx (tamanho a ser reservado)     #
  119. #eax=pos heap analisada momento            #
  120. #ebx=breakpoint atual                      #
  121. #ecx=tamanho a ser alocado                 #
  122. #edx=espaco da posicao atual do heap       #
  123. #-4,-8 e -12(%ebp)=eventual temp           #
  124. ############################################
  125.  
  126. .globl malloc
  127. .type  malloc,@function
  128. malloc:
  129. pushl %ebp
  130. movl  %esp,%ebp
  131. subl  $12,%esp
  132.  
  133. #Assegura da inicializacao correta do Heap e Break#
  134. cmpl $0,current_break
  135. jne  alloc_begin
  136. call malloc_init
  137. ###################################################
  138.  
  139. alloc_begin:
  140. movl 8(%ebp),%ecx       #tamanho a ser alocado
  141. movl heap_begin,%eax    #inicio heap / posicao do heap analisada no momento
  142. movl current_break,%ebx #break point atual
  143.  
  144. movl $0,pos_free
  145. movl $0,size_field
  146.  
  147. alloc_start:
  148.  
  149. #se true, e necessario syscall para alocar espaco, :D
  150. cmpl %ebx,%eax
  151. je   new_space
  152.  
  153. #obtem espaco da primeira posicao do heap#
  154. movl HDR_SIZE(%eax),%edx
  155.  
  156. #se =, pos indisponivel
  157. cmpb $INDISP,HDR_AVAIL(%eax)
  158. jne  found
  159. movl $0,pos_free
  160. movl $0,size_field
  161. jmp  next_position
  162.  
  163. #se <=, encontrado, :D:D
  164. found:
  165. cmpl %edx,%ecx
  166. jle  space_found
  167.  
  168. #DISP e < do que tamanho requerido#
  169. treat_small_space:
  170.     cmpl $0,pos_free
  171.     je   tss_firstPos
  172.    
  173.     #Header agora tambem fara parte dos dados, 5bytes extras, :D
  174.     addl %edx,size_field
  175.     addl $HEADER_SIZE,size_field
  176.    
  177.     #Se ainda <, va tentar de novo
  178.     cmpl %ecx,size_field
  179.     jl   next_position
  180.    
  181.     #Se >=, encontramos, :D#
  182.     movl size_field,%edx
  183.    
  184.     movl pos_free,%eax
  185.     movl %edx,HDR_SIZE(%eax)
  186.     movb $INDISP,HDR_AVAIL(%eax)
  187.     addl $HEADER_SIZE,%eax
  188.    
  189.     movl %ebp,%esp
  190.     popl %ebp
  191.     ret
  192.    
  193.     tss_firstPos:
  194.         movl %eax,pos_free
  195.         movl %edx,size_field
  196.  
  197. next_position:
  198.     addl $HEADER_SIZE,%eax #<-- deslocamento para a proxima memoria
  199.     addl %edx,%eax         #no header ja levando em conta o tamanho do header
  200.                            #+ o tamanho reservado.
  201.     jmp alloc_start
  202.    
  203. space_found:
  204.     movb $INDISP,HDR_AVAIL(%eax) #<-- o HDR_SIZE nao e alterado pelo fato de a posicao
  205.                      #atual poder ser >= a posicao exigida, entao ao alterar o size
  206.                      #levaria a deslocamentos incorretos ao navegar pelo heap, :/
  207.                                                              
  208.     #Verifica se o espaco encontrado e grande o suficiente para ser dividido em um novo 'bloco'#
  209.     subl %ecx,%edx
  210.  
  211.     #Verifica se ha espaco minimo para divisao#
  212.     cmpl $TAM_MIN,%edx
  213.     jl   sf_nodivide
  214.  
  215.     #Se >=, preparamos os headers#
  216.     movl %ecx,HDR_SIZE(%eax) #<- primeiro header, o que sera usado
  217.     addl $HEADER_SIZE,%eax #<-- ajusta ponteiro para a 1a posicao livre da memoria
  218.     movl %eax,-4(%ebp)
  219.  
  220.     #Primeiro bloco OK, agora segundo...#
  221.     addl %ecx,%eax #<- eax aponta para novo header
  222.     movb $DISP,HDR_AVAIL(%eax)
  223.     subl $HEADER_SIZE,%edx
  224.     movl %edx,HDR_SIZE(%eax)
  225.  
  226.     movl -4(%ebp),%eax
  227.  
  228.     movl %ebp,%esp
  229.     popl %ebp
  230.     ret
  231.  
  232.     sf_nodivide:
  233.         addl $HEADER_SIZE,%eax
  234.         movl %ebp,%esp
  235.         popl %ebp
  236.         ret
  237.  
  238. #para setarmos uma nova posicao para o break, precisamos: pos break+tamanho_header+qtd dados#
  239. new_space:
  240.     addl $HEADER_SIZE,%ebx
  241.     addl %ecx,%ebx
  242.    
  243.     pushl %eax
  244.     pushl %ebx
  245.     pushl %ecx
  246.    
  247.     movl $SYS_BRK,%eax #<-- sobe o sysbreak atual para mapear + memoria, :D
  248.     int  $SYSCALL
  249.    
  250.     cmpl $0,%eax
  251.     je   new_space_error
  252.    
  253.     popl %ecx
  254.     popl %ebx
  255.     popl %eax
  256.    
  257.     #adiciona as flags de tamanho e 'status' para o header da memoria
  258.     movb $INDISP,HDR_AVAIL(%eax)
  259.     movl %ecx,HDR_SIZE(%eax)
  260.    
  261.     addl $HEADER_SIZE,%eax
  262.    
  263.     movl %ebx,current_break #<-- salva sysbreak atual
  264.    
  265.     #encerra
  266.     movl %ebp,%esp
  267.     popl %ebp
  268.     ret
  269.    
  270. #impossivel alocar mais espaco# ;'(
  271. new_space_error:
  272.     movl $0,%eax
  273.     movl %ebp,%esp
  274.     popl %ebp
  275.     ret
  276.  
  277. movl %ebp,%esp
  278. popl %ebp
  279. ret
  280.  
  281. ############################################
  282. #############Funcao Free####################
  283. #                                          #
  284. #Libera espaco na heap de acordo com o     #
  285. #o tamanho informado em 8(%ebp).           #
  286. #                                          #
  287. #8(%ebp)=ecx (tamanho a ser desalocado)    #
  288. ############################################
  289. .globl free
  290. .type free,@function
  291. free:
  292. pushl %ebp
  293. movl  %esp,%ebp
  294.  
  295. movl 8(%ebp),%eax
  296. subl $HEADER_SIZE,%eax     #<- voltar ao ponto de inicio do header
  297. movb $DISP,HDR_AVAIL(%eax)
  298.  
  299. movl %ebp,%esp
  300. popl %ebp
  301. ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement