процессы ядра inux, чтобы получить полный путь трех методов
 

 

 

CopyRight этот документ принадлежит Джонатану всего, свободно перепечатывать, пожалуйста , сохранить целостность документа перепечатки.
/ * ------------------------------------------------ -------------------------------------------------- -------------------------- * /

В полном пути к процессу ядра Linux пути подобно ядру Windows, чтобы получить процесс получения путей, разнообразные методов. Однако из-за особенностей конструкции Linux не является хорошим способом получить прямой путь: процесс динамического исполнения, понятие не имеет физического местоположения, строго в концепции отдельной программы. Но если вы не можете получить полный путь к Linux Kernel обрабатывать? Не Ответ, конечно, нет.

task_struct структура имеет суб-сегмент комм, который хранит название программы, но самым большим именем является 16 (Windows внутри EPROCESS ImageName 16, который первым выдвинул? !!), но не включает в себя имя пути. Приобретенный от task_struct базового пути полагаться на mm_struct этой структуры, из которой вы можете получить полный путь процесса.

В ядре Linux, по моим личным методам контроля три вида их здесь.

1 по exe_file

     task_struct-> мм-> exe_file-> f_path доступен полный путь.

    Но такой подход имеет ограничения, ядро ​​должно быть включено PROC_FS. Общий релиз, чтобы удалить эту опцию. Таким образом, в основном без перекомпиляции ядра не может быть использована, в противном случае машина будет стал.

2 с помощью arg_xxx памяти параметров процесса   

task_struct-> мм-> память для хранения параметров процесса между arg_start ~ arg_end, конечно, включает в себя полный путь к программе.

     Но такой подход имеет ограничение, общий выпуск, кажется, стер эту часть. Я могу получить в собственном собранном ядре, но релиз не будет в состоянии получить содержание. Вот очень странно.

статической силы util_get_task_name (pid_t PID)
{
        структура task_struct * Задача = find_task_by_vpid (PID);
        
        если (задача! = NULL)
        {
                символ * имя = kzalloc (PATH_MAX, ATOM);
                символ * буфер = NULL;
                структура mm_struct * мм = get_task_mm (задача);
                INT Len = 0;
                без знака длинный адрес = 0;
  
                если (! имя || мм)
                        Гото вне;

                down_read (& мм-> mmap_sem);

                Len = мм-> arg_end - мм-> arg_start;
                Адрес = мм-> arg_start;
                Буфер = имя;

                 в то время как (LEN)
                {
                        недействительными * maddr = NULL;
                        структура страницы * страница = NULL;
                        структура vm_area_struct * VMA = NULL;
                        ИНТ байт = 0, смещение = 0;
                        
                        INT RET = get_user_pages (задача, мм, адрес, 1, 0, 1, стр &, & VMA);

                        если (RET <= 0)
                        {
                                байт = RET;
                                Гото следующий;
                        }
                                
                        Байт = Len;
                        Смещение = адрес & (PAGE_SIZE-1);       

                        если (байты> PAGE_SIZE-смещение)
                                байт = PAGE_SIZE - смещение;
                        
                        maddr = KMAP (страницы);
                        copy_from_user_page (VMA, страница, адрес буфера, maddr + смещение, байт);
                        kunmap (страницы);

                        page_cache_release (страницы);

следующая:
                        LEN - = байт;
                        адрес + = байт;
                        Буфер + = байт;
                }
                
                Up_read (& мм-> mmap_sem);
                mmput (мм);

                printk ( "XXXXXXXXXXXXX: имя =% s, длина =% d \ п", имя, LEN);
        }

Из:

        если (имя) kfree (имя);
        возвращение;
}

3 по vm_area_struct

task_struct->mm->mmap,这里需要检查检查影射的内存是代码段属性(VM_EXECUTABLE)。获取的进程对应的程序的文件名称不包含路径。

要想获取全路径,需要向上查找父路径,最后拼凑起来全路径。