1.swapon開啟zram交換分區
swapon /dev/block/zram0
mkswap /dev/block/zram0
上面命令調用了linux的swapon系統調用啟動zram0交換分區;mkswap命令向塊設備文件/dev/block/zram0寫入了swap_header信息
問題:實際安卓平臺是哪里觸發swapon和mkswap調用的,我們已MTK8195平臺為例:
init.xxx.rc:swapon_all /vendor/etc/fstab.enableswap其中fstab.enableswap內容如下:
/dev/block/zram0 none swap defaults zramsize=xx%
那么swapon_all命令執行了哪里的代碼呢?又是哪里解析fstab.enableswap文件呢,答案是:
system/core/init/builtins.cpp:
/* swapon_all [ <fstab> ] */
static Result<void> do_swapon_all(const BuiltinArguments& args) {auto swapon_all = ParseSwaponAll(args.args);if (!swapon_all.ok()) return swapon_all.error();Fstab fstab;if (swapon_all->empty()) {if (!ReadDefaultFstab(&fstab)) {return Error() << "Could not read default fstab";}} else {if (!ReadFstabFromFile(*swapon_all, &fstab)) {return Error() << "Could not read fstab '" << *swapon_all << "'";}}if (!fs_mgr_swapon_all(fstab)) { return Error() << "fs_mgr_swapon_all() failed";}return {};
}
而fs_mgr_swapon_all實現:/system/core/fs_mgr/fs_mgr.cpp:
bool fs_mgr_swapon_all(const Fstab& fstab) {...const char* mkswap_argv[2] = {MKSWAP_BIN,entry.blk_device.c_str(),};int err = logwrap_fork_execvp(ARRAY_SIZE(mkswap_argv), mkswap_argv, nullptr, false,LOG_KLOG, false, nullptr);if (err) {LERROR << "mkswap failed for " << entry.blk_device;ret = false;