vma (loop 4ever)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi all ,
     I'm studying vma.This is my proc_read function and I want to return vma list information related with a current task. But , the loop(while (vma)) does not stop.What is wrong  ?
Can anyone help me ?
       
int my_get_info( char *buf, char **start, off_t off, int count )
{
        struct task_struct      *tsk = current;
        struct vm_area_struct   *vma;
        unsigned long           ptdb;
        int    i = 0, len = 0;

        // display title
        len += sprintf( buf+len, "\n\nList of the Virtual Memory Areas " );
        len += sprintf( buf+len, "for task \'%s\' ", tsk->comm );
        len += sprintf( buf+len, "(pid=%d)\n", tsk->pid );

        // loop to traverse the list of the task's vm_area_structs
        vma = tsk->mm->mmap;
        while ( vma )
                {
                char    ch;
                len += sprintf( buf+len, "\n%3d ", ++i );
                len += sprintf( buf+len, " vm_start=%08lX ", vma->vm_start );
                len += sprintf( buf+len, " vm_end=%08lX  ", vma->vm_end );

                ch = ( vma->vm_flags & VM_READ ) ? 'r' : '-';
                len += sprintf( buf+len, "%c", ch );

                ch = ( vma->vm_flags & VM_WRITE ) ? 'w' : '-';
                len += sprintf( buf+len, "%c", ch );

                ch = ( vma->vm_flags & VM_EXEC ) ? 'x' : '-';
                len += sprintf( buf+len, "%c", ch );

                ch = ( vma->vm_flags & VM_SHARED ) ? 's' : 'p';
                len += sprintf( buf+len, "%c", ch );

                vma = vma->vm_next;
                }
        len += sprintf( buf+len, "\n" );
        // display additional information about tsk->mm
        asm(" movl %%cr3, %%ecx \n movl %%ecx, %0 " : "=m" (ptdb) );
        len += sprintf( buf+len, "\nCR3=%08lX ", ptdb );
        len += sprintf( buf+len, " mm->pgd=%p ", tsk->mm->pgd );
        len += sprintf( buf+len, " mm->map_count=%d ", tsk->mm->map_count );
        len += sprintf( buf+len, "\n\n" );

        return  len;

}

My code is based on  : http://www.cs.usfca.edu/~cruse/cs635/vma.c

--
--
Francisco Keppler Silva Alecrim
Instituto Nokia de Tecnologia (INdT)
Open Source Mobile Research Center (OSMRC)

[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux