【Operating System】 基於Android爲進程添加級別及調試

最近在學習 操作系統

看到每個進程都有 pid 等很多屬性。 那我們可以做到修改或者添加進程的某個屬性, 進而影響操作系統的運行嗎?

本文 以 Android 系統爲例,嘗試爲進程添加級別屬性。

第一步 是要找到進程屬性的定義的地方。在/include/linux/sched.h內的 task_struct 結構體內定義了許多屬性。那首先,筆者在此處添加了p_level屬性。

第二步是 在相同文件夾下,可以觀測到有一個syscall.h 文件。這個頭文件內定義了系統調用的函數列表。我們定義的P_level顯然需要基本的 set 和 get 功能。此時我們需要將這兩個函數添加進入syscall的頭文件內。

第三步 對於系統調用而言。一般會有一個tbl的表格,表明了所有的系統調用的代號。我們自己生成的調用函數,也要保存在內才行。對於64位的系統,一般在 /arch/x86/entry/syscalls/syscall_64.tbl 內會定義。

如果有需要的話,比如設定默認的屬性時。還需要修改kernel內的fork.c文件。此我們就將它默認值設爲0了

此時我們基本完成了系統設置的內容。我們在 syscall 表內添加了我們自定義的call,然後在syscall的頭文件內定義了函數名。在進程的屬性結構體內添加了自定義的屬性。那下面,我們要做的就是實現我們定義的函數了。

 

# include <linux/kernel.h>
# include <linux/sched.h>
# include <linux/pid.h>

asmlinkage int sys_set_P_level(int pid, int level){
    struct task_struct *task;
    //若小於0, 則返回err
	if (level < 0) return -1; 
    /* 普通用戶時 */
	if (current_euid().val !=0){
        //當前進程?
        if (pid == current->pid){
            //當前進程要比設置的level高
            int temp = current->P_level>=level ? level : -1; 
            if(temp != -1) current->P_level = level;
            return temp;
        }
        else{
            for_each_process(task){
                //尋找進程,而且要修改的級別小於當前進程時方可修改
          	    if(task->pid == pid && current->P_level > task->P_level){
                        int temp = current->P_level>=level ? level : -1;
                        if(temp != -1) task->P_level = level;
                        return temp;
                }
            }
            return -1;
        }          
    }
    /* 當用戶是root user時,自帶最高級別屬性*/
    else{
        for_each_process(task){ //尋找對應進程
            if(task->pid == pid )  {
                task->P_level = level; 
                return task->P_level;
            }
        }
        //未找到則返回err
        return -1;
    }
} 

asmlinkage int sys_get_P_level (int pid){
    /* 對於get函數 就很簡單 
        遍歷進程池 
        若找到則return P_level, otherwise return -1;
    */
}

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章