Bonjour,

J'écris un driver linux dans ceci, il y a une fonction qui lit les donée d'un page frame d'une processus à un address virtuel. Malheresement, quand j'utilise cette fonction, il fait gelée iméditement le system. Quelqu'un peut m'aider de résoudre cette problème? Merci d'avance et éxcusez-moi pour ma mauvais française!

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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;
}