от Мариян Маринов(24-06-2006)

рейтинг (11)   [ добре ]  [ зле ]

Printer Friendly Вариант за отпечатване

От доста време ме изнервя факта, че лаптоп-а ми грее прекалено много. Преди доста време Делян Делчев ми даде идеята за понижаване на напрежението което използва процесора с цел по-дълга работа на батерия и по-ниска температура на процесора по време на работа.

След малко търсене в интернет намерих този patch към ядрото.

След като го добавите трябва да си прекомпилирате ядрото с тази опция:

   Power management options (ACPI, APM) -->
     CPU Frequency scalling --> 
       [M] Intel Enchenced SpeedStep
         [*} Userspace control of CPU frequency/voltage table
         [*] Use ACPI tables to decode valid frewuqncy/voltage pairs
 
или директно в конфигурационния файл:

   CONFIG_X86_SPEEDSTEP_CENTRINO=m
   CONFIG_X86_SPEEDSTEP_CENTRINO_SYSFS=y
   CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI=y
 

След рестартиране с новия модул в /sys/devices/system/cpu/cpu0 се появява една нова директори cpufreq. В нея се намират файловете, чрез които вие можете да командвате speedsteping-а на вашият процесор.

Преди да продължа нататък искам да наблегна на това, че понижаването на напрежението на процесора ви може сериозно да го увреди! Никой не може да гарантира, че след използването на тази техника компютърът ви ще продължи да работи нормално!


Ето и малко разяснения за някой от файловете в тази директория:

scaling_available_governors: в този файл се съдържат имената на всички governor-и които в момента сте заредили. Governor-ите които може да имате са userspace(cpufreq_userspace), powersave(cpufreq_powersave), ondeman(cpufreq_ondemand), conservative(cpufreq_conservative) и performance(cpufreq_performance). При компилирането на ядрото задължително се избира поне един governor който ще бъде избран по подразбиране и ще бъде статично компилиран в ядрото. Повече информация за governor-ите можете да намерите в /usr/src/linux/Documentation/cpu-freq/governors.txt

scaling_available_frequencies: В този файл, ще видите честотите които можете да сменяте. В зависимост с какъв Pentium M процесор сте, тук ще видите различни стойности.

scaling_cur_freq: текущата честота на която работи процесора

scaling_governor: избраният в момента governor. Използвайки echo "governor" > scaling_governor можете да промените избраният в момента governor с който и да е друг от scaling_avalable_governors

scaling_setspeed: Този файл съществува само когато избраният governor е userspace. В него се вижда текущата честота на която работи процесора, но за разлика от scaling_cur_freq тук вие можете да я променяте. Използвайки echo freq > scaling_setspeed вие можете да смените работната честота на процесоа но само с честота която е вписана в scaling_available_frequencies. По документация би следвало да можете да променяте работната честота на всяка една в границите от scaling_min_freq и scaling_max_freq но аз за момента не съм успял да постигна този ефект.

voltage_table: тук са показани волтажите на които превключва процесора при различните честоти. Използвайки echo "voltage" > voltage_table можете да променяте тези стойности.

op_points_table: тук сумарно се показват двойките честота/напрежение за всяка честота от scaling_available_frequencies

за да намеря най-ниският волтаж при който лаптоп-а ми може да работи използвах този скрипт(заимстван от HOWTO във Wiki-то на Gentoo):
 #!/bin/bash
 
 # Min voltage value
 # Voltages will not be set below than this value
 Vmin=700
 
 # Frequence settings
 Fall=`cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies`
 
 # run the CPU this many seconds at the given MHz to check if OK
 Period=3
 
 echo "Avail. Frequencies: $Fall"
 
 while [ 0 ]; do
 
 	# Get current votages
 	CurVoltages=`cat /sys/devices/system/cpu/cpu0/cpufreq/voltage_table | cut --delimiter="," --output-delimiter=" " --fields=1-`
 	NewVoltages=""
 
 	# Compute new voltages as current - 16 mV
 	for V in $CurVoltages; do
 		V=$(($V - 16))
 
                 # Ensure that voltage is not below min value
                 if [ $V -lt $Vmin ]; then
 			V=$Vmin
 		fi
 
 		if [ $NewVoltages ]; then
 			NewVoltages="$NewVoltages,$V"
 		else
 			NewVoltages="$V"
 		fi
 	done
 
 	# Display current settings from the sysfs file
         echo " "
         echo "Current settings:   "`cat /sys/devices/system/cpu/cpu0/cpufreq/voltage_table`
 
         # Display the new settings that we are going to write to the sysfs file
         echo "Requested settings: $NewVoltages"
 
         # Force the kernel to write its buffers to the hard disk
         # to reduce the risks of file system corruption in case of CPU freeze
         sync
 
         # Apply new settings
         echo "$NewVoltages" > /sys/devices/system/cpu/cpu0/cpufreq/voltage_table
 
         # now check if all voltages are OK and loop over all frequencies
 	for vv in $Fall; do
 		# set CPU speed
 		#echo "Setting $Fcur"
 		echo $vv > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
 
 		# sleep to see if cpu groks
 		sleep $Period
 
 		# load
 		i=0
 		while true; do
 			i=$((i+1))
 			if [ $i -gt 5000 ]; then
 				break
 			fi
 		done
 
 		echo "OK " `cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq`
         done
 done
 

Този скрипт 100% ще забие компютъра ви затова по-добре го стартирайте от конзола със възможно най-малко други процеси стартирани на машината.

След като стартирате скрипта, той автоматично ще започне да понижава напрежението на вашия процесор през 16 mV като ще тества дали компютърът ви ще работи на всяка честота от scaling_available_frequencies.
За да работи нормално скрипта трябва да сте избрали userspace като governor.
Когато машината ви замръзне запишете си предпоследният волтаж на който е работила нормално рестартирайте и тествайте дали машината ви ще работи нормално на това напрежение.



<< Блокиране на автоматизирани атаки под Линукс и *BSD | *buntu файлови хранилища >>