HTC Kernel: Perflock?

Aus Android Wiki
< HTC

Perflock ist verallgemeinert eine Kernel-Funktion in vielen Android-Smartphones von HTC. Sie übernimmt die Aufgabe, in regelmäßigen Zeitabständen die CPU-Frequenzen auf die von HTC voreingestellten Standardwerte zurück zu setzten.[1] Dies beeinträchtigt maßgeblich das Über- bzw. Untertakten des Prozessors.

Durch das stetige Zurücksetzen der CPU-Werte muss die Methode, die zur Anpassung dieser verwendet wurde, in regelmäßigen Zeitabständen wiederhohlt werden, was zeitlich gesehen ein großer Aufwand und sein kann und vermutlich in den seltensten Fällen wirklich praktikabel ist.

Umgehen von Perflock[Bearbeiten | Quelltext bearbeiten]

Der Perflock kann in aller Regel durch ein Kernelmodul deaktiviert werden. Dies geht auch ohne Root oder Zugriff auf die /system-Partition (was S-OFF oder einen entsperrten Bootloader benötigen würde), muss dann allerdings zur Laufzeit (also nach dem Start des Kernels) geschehen. SetCPU bietet hierfür einen Automatismus an.

Alternativ kann mit einem init.d Script das Laden des Moduls auch während der Initialisierung des Kernels geschehen. Hierfür benötigt man i.d.R. allerdings einen veränderten Kernel, der dass Ausführen von init.d-Scripts ermöglicht. Hier ist es von Gerät zu Gerät verschieden, ob ein solcher angepasster Kernel und dem passenden Modul vorhanden ist oder nicht.

Hintergrund[Bearbeiten | Quelltext bearbeiten]

Definiert ist das Perflock-Interface im Kernel-Header[2] perflock.h, welcher im Kernel unter /arch/arm/mach-msm/include/mach zu finden ist (Beispiel HTC Wildfire S, sollte aber bei anderen Geräten gleich sein) und hat folgenden Inhalt:[3]

/* arch/arm/mach-msm/perflock.h
 *
 * MSM performance lock driver header
 *
 * Copyright (C) 2008 HTC Corporation
 * Author: Eiven Peng <eiven_peng@htc.com>
 *
 * This software is licensed under the terms of the GNU General Public
 * License version 2, as published by the Free Software Foundation, and
 * may be copied, distributed, and modified under those terms.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 */

#ifndef __ARCH_ARM_MACH_PERF_LOCK_H
#define __ARCH_ARM_MACH_PERF_LOCK_H

#include <linux/list.h>

/*
 * Performance level determine differnt EBI1 rate
 */

enum {
	PERF_LOCK_MEDIUM,	/* Medium performance */
	PERF_LOCK_HIGH,	/* High performance */
	PERF_LOCK_HIGHEST,	/* Highest performance */
	PERF_LOCK_INVALID,
};

struct perf_lock {
	struct list_head link;
	unsigned int flags;
	unsigned int level;
	const char *name;
};

struct perflock_platform_data {
	unsigned int *perf_acpu_table;
	unsigned int table_size;
};

#ifndef CONFIG_PERFLOCK
static inline void __init perflock_init(
	struct perflock_platform_data *pdata) { return; }
static inline void perf_lock_init(struct perf_lock *lock,
	unsigned int level, const char *name) { return; }
static inline void perf_lock(struct perf_lock *lock) { return; }
static inline void perf_unlock(struct perf_lock *lock) { return; }
static inline int is_perf_lock_active(struct perf_lock *lock) { return 0; }
static inline int is_perf_locked(void) { return 0; }
#else
extern void __init perflock_init(struct perflock_platform_data *pdata);
extern void perf_lock_init(struct perf_lock *lock,
	unsigned int level, const char *name);
extern void perf_lock(struct perf_lock *lock);
extern void perf_unlock(struct perf_lock *lock);
extern int is_perf_lock_active(struct perf_lock *lock);
extern int is_perf_locked(void);
#endif


#endif

Einzelnachweise[Bearbeiten | Quelltext bearbeiten]

  1. Interner Lua-Fehler: Der Interpreter beendet sich mit dem Status 127.
  2. Interner Lua-Fehler: Der Interpreter beendet sich mit dem Status 127.
  3. Interner Lua-Fehler: Der Interpreter beendet sich mit dem Status 127.