1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| static int read_addr(int pid, unsigned long linear_addr, unsigned int n_bytes, char* buff)
{
/*
pid: id of process
linear_addr: linear address of memory region to be read
n_bytes: nombre bytes to be read
buff: the buffer containing the result
*/
struct task_struct *task;
struct mm_struct *mm = NULL;
pgd_t *pgd;
pmd_t *pmd;
pte_t *pte;
unsigned long pteval;
int ret = 0;
for_each_process(task)
{
if(task->pid == pid)
{
mm = task->mm;
}
}
if(mm == NULL)
return 1;
spin_lock(&mm->page_table_lock);
pgd = pgd_offset(mm, linear_addr);
if(pgd_none(*pgd))
{
ret = 2;
goto out;
}
pmd = pmd_offset(pgd, linear_addr);
if(pmd_none(*pmd))
{
ret = 3;
goto out;
}
pte = pte_offset_map(pmd, linear_addr);
if(pte_present(*pte))
{
unsigned long pteid = pte_index(linear_addr);
pteval = pte_val(*pte);
memcpy(buff, pteval + pteid, n_bytes);
}
else
{
ret = 4;
goto out;
}
pte_unmap(pte);
spin_unlock(&mm->page_table_lock);
return 0;
out:
printk("error: %d\n", ret);
spin_unlock(&mm->page_table_lock);
return ret;
} |
Partager