**:博主寫的很好,留做筆記
倘若應用程式需要對/dev/***進行讀寫操作,就需要提公升其許可權。提權方法不唯一,需要根據具體需求情況而選擇。歸根結底,終究都落到chmod 777 /dev/*** 上,不同的是,chmod操作被執行在何時何地,在此做個分析總結。
核心啟動後會執行/system/init,傳說中的系統1號程序,init程式起初的任務是初始化,包括各種mkdir來構建檔案系統,得到硬體資訊建立裝置節點,安裝sigchld訊號來**殭屍程序的資源,解析init.rc啟動指令碼等等,然後init程式變身為property_service來管理系統的許可權。我們可以下手的地方有兩處: device_init和init.rc
。這個方案是大家用的比較多的,在其中新增chmod操作很簡單不多說。
這個方案用的比較少,先了解下device.c。
device_init在/system/core/init/device.c中,詳細分析如下:
[cpp]view plain
copy
//分別遍歷/sys/class /sys/block /sys/devices
device_init()
//後面有個遞迴 /sys下是核心生成的裝置,這就相當於udev的作用
do_coldboot()
} //從socket裡讀出add處理
handle_device_fd()
} //得到裝置的相關資訊建立裝置節點
make_device()
get_device_perm()
elseif(get_device_perm_inner(devperms,path, uid, gid, &perm) == 0)else
//得到devperms結構體的資訊
get_device_perm_inner
else
*uid= perms[i].uid;
*gid= perms[i].gid;
*perm= perms[i].perm; //許可權位
return0;
} }
這是devperms的具體內容
structperms_ ;
staticstructperms_ devperms = ,
, ,
, ,
, ,
, ,
/* logger should be world writable (for logging) but not readable*/
, /*these should not be world writable */
, ,
, ,
, ,
, ,
, ,
, ,
, ,
, ,
, ,
, ,
, ,
, ,
, ,
, ,
, ,
, };
init.rc指令碼和老版本android中的init.goldfish.rc指令碼很早就被parse_config_file()函式解析將指令碼內容分為幾個段,early-init,init,early-boot,boot,和各個服務。然後在不同的時間點上執行各個段得命令或者開啟各種服務。
init.c的一段節選:
[cpp]view plain
copy
intmain(intargc,
char
**argv)
device_init其實就是linux中的udev的乙個簡單的替代。把/sys/下的所有核心提供的裝置都安排在/dev下建立裝置節點。如果要改動/dev/一些裝置的許可權,可以把chmod 777寫在init.rc中,但是要注意寫的位置,不能太早執行,不能寫在early-init段內,因為那時/dev/下的裝置節點還沒有被建立。
在devices.c中修改的方法隱藏的較深不容易被發現,但是如果init.rc內再次修改就可能把之前的修改覆蓋掉。
為Android應用程式讀取 dev下裝置而提權2
在 為android應用程式讀取 dev下裝置而提權 一 中,簡單總結了提權的兩種方法 device init和init.rc 在此篇文章中,我將詳細總結的是稍一不留神,就容易把人弄暈乎的init.c device init和init.rc 三者之間的關係,ta們到底是如何工作的。ls一下syste...
dev下的檔案
dev 是裝置 device 的英文縮寫。這個目錄對所有的使用者都十分重要。因為在這個目錄中包含了所有linux系統中使用的外部裝置。但是這裡並不是放的外部裝置的驅動程式。這一點和我們常用的windows,dos作業系統不一樣。它實際上是乙個訪問這些外部裝置的埠。我們可以非常方便地去訪問這些外部裝置...
Linux的 dev裝置目錄詳解
在linux下,dev目錄是很重要的,各種裝置都在下面。下面簡單總結一下 dev是裝置 device 的英文縮寫。dev這個目錄包含了所有linux系統中使用的外部裝置。但是這裡並不是放的外部裝置的驅動程式,這一點和windows,dos作業系統不一樣。它實際上是乙個訪問這些外部裝置的埠,但是沒有入...