安卓zram设置大小

安卓zram设置大小,第1张

可以通过修改android的init.qcom.post_boot.sh实现配置zram大小。

通过压缩长时间不在前台的进程来节省内存占用,不会像swap一样频繁 *** 作闪存,也可以减少IO *** 作节省资源,延长闪存寿命,不过内存压缩是一种用时间换空间的方式,解压缩过程也是需要消耗少量cpu资源。

这里看起来似乎除了android Go设备其他内存大于1G的设备都可以开到100%,而且从倒数第1、2条判断开启的zram大小跟cpu有很大关系,最大似乎只建议开4G,但是这份文档是18年or19年的。而现在的cpu对zram的资源消耗占比应该更低,建议的最大值应该调高。

不过根据zram的原理我这里有个更简单的判断方法,那就是根据自己的设备使用情况下个DevCheck查看下自己大部分情况下zram的占用。

实现方法:

有root的情况下很好实现,下载Scene4就可以实现修改zram,不过这个修改要app自启,所以秉承能使用magisk模块就决不使用app的宗旨,我决定自己写个magisk模块来实现这个功能。

这种技术实在不新鲜,因为它的前身 compcache -Compressed Caching for Linux 早在 09 年就在

Android 民间开发社区流传了。经过两年的开发与完善,终被上游内核正式接纳(之前可能有进 staging,没空去查),然后 Google 顺水推舟把这一技术加入了 KitKat 更新列表中。最新版本的 zRAM 模块没有测试过,但直到 12 年的版本在小内存设备上的实际表现非常有限。CM 中早已将它作为性能选项引入,但社区反响可以说非常一般。

技术上,zRAM 因为需要开辟一小块内存作为 compressed block 使用,所以在本来内存就不大的设备上反而增加了负担,这是缺点。它的优点是压缩页面(Page cache),让系统内存使用更加有效,效果相当于内存似乎扩大了一样。问题是压缩虽然很快,但也需要占用 CPU 时间,而低端设备普通都装备单核。所以你可以看出,zRAM 其实是一种权衡之术 Running Android with low RAM,Google 又一次将决定权扔给了系统开发者。

1,同目录下的makefile,如

#

# Makefile for industrial I/O Magnetometer sensors

#

obj-$(CONFIG_SENSORS_AK8975)+= ak8975.o

obj-$(CONFIG_SENSORS_HMC5843)+= hmc5843.o

2,同目录下的kconfig

#

# Magnetometer sensors

#

comment "Magnetometer sensors"

config SENSORS_AK8975

tristate "Asahi Kasei AK8975 3-Axis Magnetometer"

depends on I2C

help

Say yes here to build support for Asahi Kasei AK8975 3-Axis

Magnetometer.

To compile this driver as a module, choose M here: the module

will be called ak8975.

3,总的config(配置变量为Y)

各项目配置文件的位置不同,

coffee:kernel/arch/arm/configs/M7023Q-debug-perf_defconfig

juice:common/customer/configs

配置信息如下:

# CONFIG_CFG80211 is not set

CONFIG_EXPERIMENTAL=y

CONFIG_LOCALVERSION="$(KERNEL_LOCAL_VERSION)-perf"

CONFIG_SWAP=y

CONFIG_ZRAM=m

CONFIG_SYSVIPC=y

CONFIG_SENSORS_AK8975=y

......

查看变量是否在编译时配置成功:

out/target/product/m7023q/obj/KERNEL_OBJ/include/generated/Autoconf.h

查找CONFIG_SENSORS_AK8975

若在编译时有配置成功,将找到这一行:

#define CONFIG_SENSORS_AK8975 1

4、修改板级文件:

4.0及后续项目统一在:kernel/arch/arm/mach-msm/board-qrd7627a.c

注意juice中,很多配置(如tp)写在kernel/arch/arm/mach-msm/board-msm7627a-io.c

在代码中增加新模块的内容,应该有两处,第一处设置函数和结构体,第二处实际调用,注意引用上述第3步新增的编译开关将代码限制起来。

这些内容大多可以拷贝其它模块,但是名字要和driver中的相同,注意要改的地方除了名字之外,还有中断脚和I2C脚。其中固定模块的中断脚大部分时候不会改变(如tp就是int:48,reset:26),除非板子的datasheet特别注明才需要改变。但是I2C脚是会随着slaver device的改变而改变的,需要查清楚。

配置platform_data:

一般需要初始化一个xxx_platform_data结构体(这个结构体的声明应该让驱动文件可视,probe中才知道去读某个platformdata.yyy),并在i2c_board_info结构体中用.platform_data指向它,然后这个i2c_board_info将在板级文件中被注册(作为函数i2c_register_board_info()的参数)。而这个.platform_data很有可能在驱动的probe函数中调用到,例如:

static struct msg2133_ts_platform_data msg2133_platformdata= {

.irq = 0,

.reset = GPIO_TP_RESET,

}

static struct i2c_board_info i2c_info_msg2133_dpt = {

I2C_BOARD_INFO("msg2133", 0x27),

.platform_data = &msg2133_platformdata,

}

i2c_info_msg2133_dpt.platform_data->irq = gpio_to_irq(GPIO_TP_INT)//结构体初始化的时候只能以常量赋值,因为此处需要做GPIO到irq的映射,所以要在此处赋值。

i2c_register_board_info(MSM_GSBI1_QUP_I2C_BUS_ID, &i2c_info_msg2133_dpt, 1)

在驱动的probe中:pdata =client->dev.platform_data

...... = pdata.yyy......//(msg2133_ts_platform_data在该文件中可见)


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11832797.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-19
下一篇2023-05-19

发表评论

登录后才能评论

评论列表(0条)

    保存