2013-08-28 6 views
4

Мне нужно получить доступ к некоторым файлам proc в модуле на ядре Android. В основном мне нужна информация, указанная в команде cat, например cat /proc/uptime. Однако мне нужно сделать это программно.Доступ к данным из файла proc в модуле ядра

Я пробовал работать с функциями proc_fs, но для меня это было немного нечетким, как правило, это примеры создания файла proc, а затем его чтение и все. Мне нужно фактически использовать данные из файлов proc.

Я также использовал хороший fopen, но он не работает на модули.

Как я могу это сделать? Я действительно новичок в этом. Я работаю над ядром Android с золотыми рыбками.

Спасибо.

+0

Вы пробовали читать/proc/foo, как и обычный файл? Прочитайте все это, а затем проанализируйте его. BTW, 'linux-kernel' будет лучшим тегом для этого вопроса. –

+0

Я пробовал, не работает. Спасибо за совет. – douglasd3

+0

Почему кто-то хочет использовать proc fs в контексте ядра, они для пользовательского пространства, почему бы вам не напрямую использовать структуры данных и глобальные, откуда proc собирает информацию. –

ответ

4

Procfs - это файловая система в памяти. Это интерфейс для пользовательского пространства для сбора информации и ввода (конфигурации) информации в структуры данных ядра. Другими словами, procfs позволяет пользовательскому пространству взаимодействовать и анализировать структуры данных ядра так, как они существуют во время выполнения.

Следовательно, любой файл внутри/proc - это , а не, предназначенный для чтения изнутри ядра или модуля ядра. И зачем это нужно делать? В монолитном ядре, таком как Linux, вы можете получить доступ к структурам данных одной подсистемы в ядре через другую напрямую или через заранее определенную функцию.

Следующий вызов функции может помочь:

struct timespec uptime; 

do_posix_clock_monotonic_gettime(&uptime); 

Вы можете обратиться к реализации/Proc/безотказной работы по ссылке ниже, это по существу seq_file.

http://lxr.free-electrons.com/source/fs/proc/uptime.c

+0

Моя цель - фактически оценить использование процессора в данном процессе. Я попал в файлы proc, выполнив этот принятый ответ. Http://stackoverflow.com/a/16736599/1132848 Но я думаю, что я получил основную идею. Спасибо – douglasd3

0

Я использовал вершину, чтобы сделать это, потому что это на самом деле дает CPU%. Используемый мной код выглядит следующим образом:

Process process = Runtime.getRuntime().exec("top -n 1"); 
       //Get the output of top so that it can be read 
       BufferedReader bufferedReader = new BufferedReader(
       new InputStreamReader(process.getInputStream())); 
       String line; 
       //Read every line of the output of top that contains data 
       while (((line = bufferedReader.readLine()) != null)) { 
        //Break the line into parts. Any number of spaces greater than 0 defines a new element 
        numbersC = line.split("[ ]+");    
        if (i > 6) { 
         //Some lines start with a space, so their indices are different than others 
         if (numbersC[0].equals("")){ 
          //If name contains the string com.android, then it is a process that we want to take values for 
          if (numbersC[numbersC.length - 1].toLowerCase().contains("com.android".toLowerCase())){ 
           //Add the name of the process to the Name arraylist, excluding the com.android. part 
           Name.add(numbersC[numbersC.length - 1].replace("com.android.", "")); 
           //Add the CPU value of the process to the CPU arraylist, without the % at the end 
           CPU.add(Long.parseLong(numbersC[3].replace("%", ""))); 
          } 
         } 
         else { 
          //This is basically the same as above, except with different index values, as there is no leading space in the numbers array 
          if (numbersC[numbersC.length - 1].toLowerCase().contains("com.android.".toLowerCase())){ 
           Name.add(numbersC[numbersC.length - 1].replace("com.android.", "")); 
           CPU.add(Long.parseLong(numbersC[2].replace("%", ""))); 
          } 
         } 
        } 
        i++; 
       } 
+0

Это не ответ на заданный вопрос (который пытается получить эту информацию * в ядре *) по трем причинам. Во-первых, вы используете 'top', который по существу косвенный по сравнению с непосредственным прочтением/proc. Во-вторых, вы пишете в java, который не запускается в контексте ядра. В-третьих, основная проблема заключается в том, что ни/proc (как объяснено в принятом ответе), ни 'top' предназначены для использования из контекста ядра. –