Enviado em 27/04/2023 - 14:11h
Estou tentando executar uma funcao de um modulo pra linux que eu construi, mas nao obtenho sucesso.
Esse e o link do projeto: https://github.com/GuilhermeGiacomoSimoes/fp_printk
Eu criei uma pequena funcao para converter um interiro e uma string float:
Depois que ele converte o inteiro em uma string com ponto flutuante, ele da um strcpy() para o *destination.
Se eu chamar a funcao fp_printk() de dentro do proprio modulo na funcao init, ele funciona normalmente:
Porem eu criei um outro modulo somente para teste chamando o fp_printk() passando os parametros corretamente.
Esse outro modulo somente e para fins de teste, pq afinal a lib que criei e para ser usada por outros modulos, drivers e libs .. .
Entao fiz isso:
Mas quando eu rodo o **dmesg** Para visualizar os printk`s eu somente vejo:
Ele printa o printk() antes da conversao e printk() depois da conversao ... porem o printk() que contem a variavel *dest nao printa de foram alguma.
Eu somente preciso que a variavel *destination seja preenchida com a string float.
Esse e o link do projeto: https://github.com/GuilhermeGiacomoSimoes/fp_printk
Eu criei uma pequena funcao para converter um interiro e uma string float:
void fp_printk(int number, int decimal_places, char* destination)
{
printk(KERN_INFO "um test no inicio");
static char buffer[32] = { 0 };
int buf_index = 30;
int count_decimal_place = 0;
int point_include = 0;
for (; number && buf_index; --buf_index, number /= 10) {
count_decimal_place++;
if (!point_include && count_decimal_place > decimal_places) {
buffer[buf_index] = '.';
buf_index--;
point_include = 1;
}
buffer[buf_index] = "0123456789"[number % 10];
}
strcpy(destination, &buffer[buf_index + 1]);
}
EXPORT_SYMBOL(fp_printk);
Depois que ele converte o inteiro em uma string com ponto flutuante, ele da um strcpy() para o *destination.
Se eu chamar a funcao fp_printk() de dentro do proprio modulo na funcao init, ele funciona normalmente:
static int __init fp_printk_init(void)
{
printk(KERN_INFO "%s: initial execute module", OURMODNAME);
char *dest = kmalloc(sizeof("12.34"), GFP_KERNEL);
fp_printk(1243, 2, dest);
printk(KERN_INFO, "%s", dest);
return 0;
}
Porem eu criei um outro modulo somente para teste chamando o fp_printk() passando os parametros corretamente.
Esse outro modulo somente e para fins de teste, pq afinal a lib que criei e para ser usada por outros modulos, drivers e libs .. .
Entao fiz isso:
printk(KERN_INFO, "before exec\n");
char *r = kmalloc(sizeof("12.34"), GFP_KERNEL);
extern __visible void fp_printk(number, decimal_places, r);
printk(KERN_INFO, "%s: %s\n", "test_fp_printk", r);
printk(KERN_INFO, "after exec\n");
Mas quando eu rodo o **dmesg** Para visualizar os printk`s eu somente vejo:
[1210228.128703] test_fp_printk: before exec
[1210228.128712] test_fp_printk: after exec
Ele printa o printk() antes da conversao e printk() depois da conversao ... porem o printk() que contem a variavel *dest nao printa de foram alguma.
Eu somente preciso que a variavel *destination seja preenchida com a string float.