Autor Tópico: Oque são "old_mmap" e "madvise"  (Lida 785 vezes)

Xevious

  • Membro Jr.
  • **
  • Mensagens: 17
  • Karma: +0/-0
Oque são "old_mmap" e "madvise"
« Online: Dezembro 30, 2009, 10:56:51 am »
Já estou 'trabalhando' no meu novo emprego, e me passaram uma taréfa de fazer funcionar um driver pra uma impressora fiscal Bematech.
Veio um aplicativo de testes junto com o driver e ele vai na boa, mas um aplicativozinho mínimo que fiz em Kylix não vai, da erro de acesso a memória quando vai instanciar a biblioteca...

Bem tenho que resolver isso, e como já testei várias possibilidades cheguei agora no desespero de debugar os dois aplicativos pra ver pq um funciona e o outro não.

Então encontrei onde os dois instanciam a biblioteca, existem poucas diferenças mas estas podem ser cruciais, mas preciso entender dois comandos que obtive usando o STRACE.

Dei uma googlada, mas a quantidade de logs com esses comandos é tão grande que não da pra achar alguma página me explicando o funcionamento deles :-\

Então estou apelando aos ilustres colégas na esperança que possam me dar essas informações...

Esse é um pedaço do Log do aplicativo que da certo

open("/usr/lib/libbemafiscal.so", O_RDONLY) = 5
read(5, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\320\343"..., 512) = 512
fstat64(5, {st_mode=S_IFREG|0777, st_size=4503086, ...}) = 0
old_mmap(NULL, 2239892, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 5, 0) = 0x40018000
madvise(0x40018000, 2239892, MADV_SEQUENTIAL|0x1) = 0
old_mmap(0x40226000, 77824, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 5, 0x20e000) = 0x40226000
old_mmap(0x40239000, 7572, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x40239000
close(5)                                = 0

E esse é doq da errado
open("/usr/lib/libbemafiscal.so", O_RDONLY) = 5
read(5, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\320\343"..., 512) = 512
fstat64(5, {st_mode=S_IFREG|0777, st_size=4503086, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x4002c000
old_mmap(NULL, 2239892, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 5, 0) =0x4002d000
madvise(0x4002d000, 2239892, MADV_SEQUENTIAL|0x1) = 0
old_mmap(0x4023b000, 77824, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 5, 0x20e000) = 0x4023b000
old_mmap(0x4024e000, 7572, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x4024e000
close(5)         

da pra notar que o log que deu erro, tem uma instrução old_mmap a mais.
Como o parâmetro resultante de old_mmap é utilizado na instrução madvise da pra concluir que o old_mmap retorna um endereço de acesso, talvez a alguma função ou algo tipo MAIN da biblioteca.

Um retorno errado desse endereço justifica o erro SIGSEV(11) ou Segmentation fault ou ainda Runtime error 230.
São todos o mesmo erro mas sendo mostrados em níveis diferentes de informação.

Bem pra entender oq ta acontecendo ou pelo menos saber se estou 'na pista certa' ou na errada, preciso entender o funcionamento dessas duas funções.

Portanto Oque são "old_mmap" e "madvise" ::)

Comunidade de Usuários do openSUSE

Oque são "old_mmap" e "madvise"
« Online: Dezembro 30, 2009, 10:56:51 am »