| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 25/10/2011 09:50:47
|
Javaanewworld
Thread.start()
Membro desde: 26/01/2009 23:59:13
Mensagens: 36
Offline
|
Olá, estou tentando alterar o mapeamento de memória reservada em um sistema linux. Mas em determinado momento do cálculo os valores não batem, vejam só um exemplo:
base=0x00000000 ( 0MB), size=1024MB
base=0x40000000 (1024MB), size= 256MB
base=0x50000000 (1280MB), size= 128MB
base=0x58000000 (1408MB), size= 64MB
base=0x5c000000 (1472MB), size= 32MB
base=0x5e000000 (1504MB), size= 16MB
O exemplo diz que:
0x58000000 = 1408MB = 64MB
64 x 1024 x 1024 = 67108864 Bytes
Vamos supor que eu queira trabalhar com o seguinte valor: 0x65000000
Usando um conversor Hexadecimal/Decimal ficaria assim: 1694498816 Bytes
Convertendo o valor 1694498816 para MB seria 1616MB.
.
Na visão geral, depois de converter ficaria assim:
base=0x65000000 (1616MB), size= ????
.
Eu não consigo achar o valor final "size" como mostrado no exemplo.
Estou me perdendo em algum lugar do cálculo, vocês entenderam?
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 25/10/2011 13:40:13
|
Javaanewworld
Thread.start()
Membro desde: 26/01/2009 23:59:13
Mensagens: 36
Offline
|
Basicamente eu preciso saber qual a relação entre os valores MB e size:
base=0x00000000 ( 0MB), size=1024MB
base=0x40000000 (1024MB), size=264MB
base=0x50000000 (1280MB), size=128MB
base=0x58000000 (1408MB), size=64MB
base=0x5c000000 (1472MB), size=32MB
base=0x5e000000 (1504MB), size=16MB
Assim, seguindo a lógica eu chegaria no resultado size abaixo:
base=0x65000000 (1616MB), size= ????
This message was edited 1 time. Last update was at 25/10/2011 13:41:06
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 25/10/2011 14:14:17
|
entanglement
GUJ Hacker
Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline
|
Não se esqueça que o mapeamento de memória para uma aplicação
a) É virtual (ou seja, o endereço de memória virtual não bate com o endereço de memória física - pode até se referir a uma região na partição de swap, em vez de um local na memória física)
b) Não precisa ser contínuo. Portanto, o tamanho não tem a ver com o endereço - pode ser menor que a diferença entre dois endereços, por exemplo. Tudo depende de como foi solicitada a alocação desse bloco de memória virtual.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/10/2011 12:11:41
|
Javaanewworld
Thread.start()
Membro desde: 26/01/2009 23:59:13
Mensagens: 36
Offline
|
Eu sei disso, não estou definindo o local, e sim a quantidade de memória reservado para determinadas funções.
Para isso eu preciso saber a relação desses números:
0MB, size=1024MB
1024MB, size=264MB
1280MB, size=128MB
1408MB, size=64MB
1472MB, size=32MB
1504MB, size=16MB
A partir do hexadecimal 0x60000000, por exemplo, eu só consigo chegar no valor da primeira coluna (1616).
Sabendo a relação entre os números acima eu poderia calcular quantos MB representa o 1616.
Talvez eu esteja entendendo errado, talvez minha pergunta não faça sentido. De qualquer forma, obrigado.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/10/2011 12:21:47
|
entanglement
GUJ Hacker
Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline
|
Se o mapeamento for contínuo, como é o caso que você mostrou, o tamanho do bloco ANTERIOR é a diferença entre o endereço do início do bloco ATUAL e do bloco ANTERIOR. Mas você quer o tamanho do bloco ATUAL sem saber o endereço inicial do PRÓXIMO bloco; aí como é que dá para fazer a conta?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/10/2011 07:03:43
|
Javaanewworld
Thread.start()
Membro desde: 26/01/2009 23:59:13
Mensagens: 36
Offline
|
Olá, amigo. Obrigado pela resposta.
Na verdade essa relação é apenas um exemplo que peguei na internet. Mas ao que parece os valores em hexadecimal variam (ainda não achei qual a base/cálculo que faz essa variação), mas as vezes 0x20000000 corresponde a 4mb, outras a 32mb.
Segue o meu código (não meu, do Linus Torvalds):
Eu precisaria entender o sistema de conversão/base hexadecimal que esse código usa, para assim poder alterar os valores coordenadamente. Aparantemente vem da função (UL) essa conversão. Na última linha do código que eu coloquei você pode ver ele subtraindo o hexadecimal convertido de um valor em kbytes.
De qualquer forma eu cheguei a conclusão de que poderia alterar os valores reservados para cada função sem alterar as bases hexadecimais, já fiz a alteração. Obrigado mais uma vez.
This message was edited 1 time. Last update was at 27/10/2011 07:04:55
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/10/2011 07:09:52
|
entanglement
GUJ Hacker
Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline
|
UL aparentemente é uma macro que expande para "(unsigned long)". Ou seja, um simples cast. Senão, pode ser uma outra macro que pega o valor que está escrito (por exemplo, 0x50000000) e adiciona o sufixo "UL", que em alguns compiladores C indica uma constante "unsigned long" - ou seja, 0x50000000UL.
|
|
|
 |
|
|