Я прочитал много тем с похожими вопросами, но, прочитав ответы, я очень смущен. Я нашел в них много url с репозиториями, но люди обсуждают, какие репозитории созданы для одной или двух версий ubuntu, но я ничего не нашел о версии 11.10. Слишком рано просить об этом? Должен ли я понизить мою ubuntu, чтобы иметь ядро реального времени?
Если вы зависите от использования двоичного драйвера nvidia, вы можете исправить исходный драйвер с помощью этого патча (для ядер 3.4+ только с rt-patches). Этот патч не содержит гарантии или гарантии! Используйте его на свой страх и риск .->
Index: kernel/conftest.sh
===================================================================
--- kernel/conftest.sh.orig
+++ kernel/conftest.sh
@@ -95,7 +95,7 @@
fi
fi
- CFLAGS="$CFLAGS $OUTPUT_CFLAGS -I$HEADERS $AUTOCONF_CFLAGS"
+ CFLAGS="$CFLAGS $OUTPUT_CFLAGS -I$HEADERS -I$OUTPUT/arch/x86/include/generated $AUTOCONF_CFLAGS"
test_xen
@@ -126,7 +126,7 @@
CFLAGS="$BASE_CFLAGS $MACH_CFLAGS $OUTPUT_CFLAGS -I$HEADERS $AUTOCONF_CFLAGS"
if [ "$ARCH" = "i386" -o "$ARCH" = "x86_64" ]; then
- CFLAGS="$CFLAGS -I$SOURCES/arch/x86/include -I$SOURCES/arch/x86/include/generated"
+ CFLAGS="$CFLAGS -I$SOURCES/arch/x86/include -I$OUTPUT/arch/x86/include/generated"
elif [ "$ARCH" = "ARMv7" ]; then
CFLAGS="$CFLAGS -I$SOURCES/arch/arm/include -I$SOURCES/arch/arm/include/generated"
fi
@@ -512,7 +512,12 @@
# and if it as an 'event' member.
#
echo "$CONFTEST_PREAMBLE
- #include <asm/system.h>
+ #include <linux/version.h>
+ #if LINUX_VERSION_CODE > KERNEL_VERSION(3, 3, 0)
+ #include <asm/switch_to.h>
+ #else
+ #include <asm/system.h>
+ #endif
#include <linux/pm.h>
void conftest_pm_message_t(pm_message_t state) {
pm_message_t *p = &state;
@@ -965,11 +970,12 @@
#
echo "$CONFTEST_PREAMBLE
#include <linux/acpi.h>
+ #include <acpi/acpixf.h>
void conftest_acpi_walk_namespace(void) {
acpi_walk_namespace();
}" > conftest$$.c
- $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
+ #CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
rm -f conftest$$.c
if [ -f conftest$$.o ]; then
@@ -980,6 +986,7 @@
echo "$CONFTEST_PREAMBLE
#include <linux/acpi.h>
+ #include <acpi/acpixf.h>
void conftest_acpi_walk_namespace(void) {
acpi_walk_namespace(0, NULL, 0, NULL, NULL, NULL, NULL);
}" > conftest$$.c
@@ -996,6 +1003,7 @@
echo "$CONFTEST_PREAMBLE
#include <linux/acpi.h>
+ #include <acpi/acpixf.h>
void conftest_acpi_walk_namespace(void) {
acpi_walk_namespace(0, NULL, 0, NULL, NULL, NULL);
}" > conftest$$.c
@@ -1603,6 +1611,9 @@
fi
fi
fi
+
+ RET=0
+ SELECTED_MAKEFILE=Makefile.kbuild
if [ "$RET" = "0" ]; then
ln -s $SELECTED_MAKEFILE Makefile
Index: kernel/nv-linux.h
===================================================================
--- kernel/nv-linux.h.orig
+++ kernel/nv-linux.h
@@ -111,7 +111,11 @@
#include <linux/timer.h>
#include <asm/div64.h> /* do_div() */
+#if LINUX_VERSION_CODE > KERNEL_VERSION(3, 3, 0)
+#include <asm/switch_to.h>
+#else
#include <asm/system.h> /* cli, sli, save_flags */
+#endif
#include <asm/io.h> /* ioremap, virt_to_phys */
#include <asm/uaccess.h> /* access_ok */
#include <asm/page.h> /* PAGE_OFFSET */
@@ -291,17 +295,17 @@
#endif
#endif
-#if defined(CONFIG_PREEMPT_RT)
-typedef atomic_spinlock_t nv_spinlock_t;
-#define NV_SPIN_LOCK_INIT(lock) atomic_spin_lock_init(lock)
-#define NV_SPIN_LOCK_IRQ(lock) atomic_spin_lock_irq(lock)
-#define NV_SPIN_UNLOCK_IRQ(lock) atomic_spin_unlock_irq(lock)
-#define NV_SPIN_LOCK_IRQSAVE(lock,flags) atomic_spin_lock_irqsave(lock,flags)
+#if defined(CONFIG_PREEMPT_RT_FULL)
+typedef raw_spinlock_t nv_spinlock_t;
+#define NV_SPIN_LOCK_INIT(lock) raw_spin_lock_init(lock)
+#define NV_SPIN_LOCK_IRQ(lock) raw_spin_lock_irq(lock)
+#define NV_SPIN_UNLOCK_IRQ(lock) raw_spin_unlock_irq(lock)
+#define NV_SPIN_LOCK_IRQSAVE(lock,flags) raw_spin_lock_irqsave(lock,flags)
#define NV_SPIN_UNLOCK_IRQRESTORE(lock,flags) \
- atomic_spin_unlock_irqrestore(lock,flags)
-#define NV_SPIN_LOCK(lock) atomic_spin_lock(lock)
-#define NV_SPIN_UNLOCK(lock) atomic_spin_unlock(lock)
-#define NV_SPIN_UNLOCK_WAIT(lock) atomic_spin_unlock_wait(lock)
+ raw_spin_unlock_irqrestore(lock,flags)
+#define NV_SPIN_LOCK(lock) raw_spin_lock(lock)
+#define NV_SPIN_UNLOCK(lock) raw_spin_unlock(lock)
+#define NV_SPIN_UNLOCK_WAIT(lock) raw_spin_unlock_wait(lock)
#else
typedef spinlock_t nv_spinlock_t;
#define NV_SPIN_LOCK_INIT(lock) spin_lock_init(lock)
@@ -956,8 +960,8 @@
return ret;
}
-#if defined(CONFIG_PREEMPT_RT)
-#define NV_INIT_MUTEX(mutex) semaphore_init(mutex)
+#if defined(CONFIG_PREEMPT_RT_FULL)
+#define NV_INIT_MUTEX(mutex) sema_init(mutex,1)
#else
#if !defined(__SEMAPHORE_INITIALIZER) && defined(__COMPAT_SEMAPHORE_INITIALIZER)
#define __SEMAPHORE_INITIALIZER __COMPAT_SEMAPHORE_INITIALIZER
Сохраните патч как «nv295.33_for 3.3 + _rt.patch». Примените патч ->
sh NVIDIA-Linux-x86_64-295.33.run --apply-patch nv295.33_for 3.3+_rt.patch
Это создаст новый двоичный установщик nvidia под названием «NVIDIA-Linux-x86_64-295.33-custom.run».
Запустите установщик с помощью
sh NVIDIA-Linux-x86_64-295.33-custom.run
Этот патч не содержит никаких гарантий или гарантий! Используйте его на свой страх и риск.
Перезагрузитесь и получайте удовольствие.
Вы найдете дополнительную информацию на форуме nv. Там вы также можете найти решение для серии 295.40.
Насколько я знаю, развитие ядра реального времени не ускоряется с циклом выпуска Ubuntu. Если вы должны запустить ядро реального времени, вам, вероятно, придется запускать более старую версию.
Для получения дополнительной информации см. https://help.ubuntu.com/community/UbuntuStudio/RealTimeKernel .
Обратите внимание, что в ядре с низкой задержкой существует, по крайней мере, некоторая текущая работа: https://launchpad.net/~abogani/+archive/ppa?field.series_filter=oneiric .
Долгосрочная цель проекта ядра RT состоит в том, чтобы в конечном итоге иметь все функциональные возможности RT в стандартном ядре, а это хорошо развивается . Патч RT имел нерегулярные релизы в прошлом, а взлом kernel.org в августе 2011 года сделал версию 3.0 недоступной в течение нескольких месяцев, но теперь все выглядит хорошо: есть патч для 3.0, другой для 3.2 (совпадающий с ядром версии в Ubuntu 11.10 и 12.04), а другой для 3.4, см. здесь .
Если вы используете Precise, вы можете использовать Realtime PPA Alessio Bogani , который любезно упаковал ядро ванили с применяемым патчем RT и синхронизирует его с номерами версий в Precise.
Если вы предпочитаете вручную создавать ядро RT, сначала установите необходимые пакеты программного обеспечения :
sudo apt-get install kernel-package fakeroot build-essential libncurses5-dev
Затем выберите галочку vanilla kernel и RT patch (номера версий несколько старые, по мере необходимости настройте):
mkdir -p ~/tmp/linux-rt
cd ~/tmp/linux-rt
wget http://www.kernel.org/pub/linux/kernel/v3.x/linux-3.4.tar.bz2
# Alternatively, try http://mirror.be.gbxs.net/pub/linux/kernel/projects/rt/3.4/patch-3.4-rt7.patch.bz2
# if the following is not available:
wget http://www.kernel.org/pub/linux/kernel/projects/rt/3.4/patch-3.4-rt7.patch.bz2
tar xjvf linux-3.4.tar.bz2
cd linux-3.4
patch -p1 < <(bunzip2 -c ../patch-3.4-rt7.patch.bz2)
Затем сконфигурируйте ядро, используя:
cp /boot/config-$(uname -r) .config && make oldconfig
, где вы должны выбрать «полное преемствование» (вариант 5), когда будет предложено, и оставьте все остальное по умолчанию, нажав enter на каждом незамедлительный. Конфигурация из ядра -lowlatency может стать лучшей отправной точкой, чем исходное ядро.
Затем создайте ядро с помощью:
sed -rie 's/echo "\+"/#echo "\+"/' scripts/setlocalversion
make-kpkg clean
CONCURRENCY_LEVEL=$(getconf _NPROCESSORS_ONLN) fakeroot make-kpkg --initrd --revision=0 kernel_image kernel_headers
И, наконец, установите новое ядро с:
sudo dpkg -i ../linux-{headers,image}-3.4.0-rt7_0_*.deb
На этом этапе вы должны перезагрузиться в ядро RT. Если ваше ядро не загружается, убедитесь, что вы дважды проверяете параметры загрузки и соответствующим образом изменяете их в своем загрузчике. Например, функции ACPI могут повлиять на вашу систему реального времени (как указано на rt.wiki.kernel.org). Добавление acpi = off может быть решением в таком случае.
Обратите внимание, что патч RT несовместим с двоичным драйвером Nvidia (но см. сообщение пользователем «rt-kernel» ниже и этот вопрос для обходного пути) и что исправления ядра Ubuntu не будут присутствовать, поэтому у вас могут быть проблемы с оборудованием, которые у вас не были раньше. Это справедливо как для пакетов PPA, так и для скомпилированного ядра. Конечно, вы всегда можете загрузиться в свое ядерное ядро и удалить пакеты ядра в реальном времени, если они вам неприятны.
Другой вариант - установить RTKernel из репозиториев KXStudio. Он хранит набор пакетов, предназначенных для аудио- и музыкальных произведений, и у него есть пакеты в режиме реального времени и с низкой задержкой.
http://kxstudio.sourceforge.net/Main_Page https : //launchpad.net/~kxstudio-team/+archive/kernel
Другой вариант - установить RTKernel из репозиториев KXStudio. Он хранит набор пакетов, предназначенных для аудио- и музыкальных произведений, и у него есть пакеты в режиме реального времени и с низкой задержкой.
http://kxstudio.sourceforge.net/Main_Page https : //launchpad.net/~kxstudio-team/+archive/kernel
Если вы зависите от использования двоичного драйвера nvidia, вы можете исправить исходный драйвер с помощью этого патча (для ядер 3.4+ только с rt-patches). Этот патч не содержит гарантии или гарантии! Используйте его на свой страх и риск .->
Index: kernel/conftest.sh
===================================================================
--- kernel/conftest.sh.orig
+++ kernel/conftest.sh
@@ -95,7 +95,7 @@
fi
fi
- CFLAGS="$CFLAGS $OUTPUT_CFLAGS -I$HEADERS $AUTOCONF_CFLAGS"
+ CFLAGS="$CFLAGS $OUTPUT_CFLAGS -I$HEADERS -I$OUTPUT/arch/x86/include/generated $AUTOCONF_CFLAGS"
test_xen
@@ -126,7 +126,7 @@
CFLAGS="$BASE_CFLAGS $MACH_CFLAGS $OUTPUT_CFLAGS -I$HEADERS $AUTOCONF_CFLAGS"
if [ "$ARCH" = "i386" -o "$ARCH" = "x86_64" ]; then
- CFLAGS="$CFLAGS -I$SOURCES/arch/x86/include -I$SOURCES/arch/x86/include/generated"
+ CFLAGS="$CFLAGS -I$SOURCES/arch/x86/include -I$OUTPUT/arch/x86/include/generated"
elif [ "$ARCH" = "ARMv7" ]; then
CFLAGS="$CFLAGS -I$SOURCES/arch/arm/include -I$SOURCES/arch/arm/include/generated"
fi
@@ -512,7 +512,12 @@
# and if it as an 'event' member.
#
echo "$CONFTEST_PREAMBLE
- #include <asm/system.h>
+ #include <linux/version.h>
+ #if LINUX_VERSION_CODE > KERNEL_VERSION(3, 3, 0)
+ #include <asm/switch_to.h>
+ #else
+ #include <asm/system.h>
+ #endif
#include <linux/pm.h>
void conftest_pm_message_t(pm_message_t state) {
pm_message_t *p = &state;
@@ -965,11 +970,12 @@
#
echo "$CONFTEST_PREAMBLE
#include <linux/acpi.h>
+ #include <acpi/acpixf.h>
void conftest_acpi_walk_namespace(void) {
acpi_walk_namespace();
}" > conftest$$.c
- $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
+ #CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
rm -f conftest$$.c
if [ -f conftest$$.o ]; then
@@ -980,6 +986,7 @@
echo "$CONFTEST_PREAMBLE
#include <linux/acpi.h>
+ #include <acpi/acpixf.h>
void conftest_acpi_walk_namespace(void) {
acpi_walk_namespace(0, NULL, 0, NULL, NULL, NULL, NULL);
}" > conftest$$.c
@@ -996,6 +1003,7 @@
echo "$CONFTEST_PREAMBLE
#include <linux/acpi.h>
+ #include <acpi/acpixf.h>
void conftest_acpi_walk_namespace(void) {
acpi_walk_namespace(0, NULL, 0, NULL, NULL, NULL);
}" > conftest$$.c
@@ -1603,6 +1611,9 @@
fi
fi
fi
+
+ RET=0
+ SELECTED_MAKEFILE=Makefile.kbuild
if [ "$RET" = "0" ]; then
ln -s $SELECTED_MAKEFILE Makefile
Index: kernel/nv-linux.h
===================================================================
--- kernel/nv-linux.h.orig
+++ kernel/nv-linux.h
@@ -111,7 +111,11 @@
#include <linux/timer.h>
#include <asm/div64.h> /* do_div() */
+#if LINUX_VERSION_CODE > KERNEL_VERSION(3, 3, 0)
+#include <asm/switch_to.h>
+#else
#include <asm/system.h> /* cli, sli, save_flags */
+#endif
#include <asm/io.h> /* ioremap, virt_to_phys */
#include <asm/uaccess.h> /* access_ok */
#include <asm/page.h> /* PAGE_OFFSET */
@@ -291,17 +295,17 @@
#endif
#endif
-#if defined(CONFIG_PREEMPT_RT)
-typedef atomic_spinlock_t nv_spinlock_t;
-#define NV_SPIN_LOCK_INIT(lock) atomic_spin_lock_init(lock)
-#define NV_SPIN_LOCK_IRQ(lock) atomic_spin_lock_irq(lock)
-#define NV_SPIN_UNLOCK_IRQ(lock) atomic_spin_unlock_irq(lock)
-#define NV_SPIN_LOCK_IRQSAVE(lock,flags) atomic_spin_lock_irqsave(lock,flags)
+#if defined(CONFIG_PREEMPT_RT_FULL)
+typedef raw_spinlock_t nv_spinlock_t;
+#define NV_SPIN_LOCK_INIT(lock) raw_spin_lock_init(lock)
+#define NV_SPIN_LOCK_IRQ(lock) raw_spin_lock_irq(lock)
+#define NV_SPIN_UNLOCK_IRQ(lock) raw_spin_unlock_irq(lock)
+#define NV_SPIN_LOCK_IRQSAVE(lock,flags) raw_spin_lock_irqsave(lock,flags)
#define NV_SPIN_UNLOCK_IRQRESTORE(lock,flags) \
- atomic_spin_unlock_irqrestore(lock,flags)
-#define NV_SPIN_LOCK(lock) atomic_spin_lock(lock)
-#define NV_SPIN_UNLOCK(lock) atomic_spin_unlock(lock)
-#define NV_SPIN_UNLOCK_WAIT(lock) atomic_spin_unlock_wait(lock)
+ raw_spin_unlock_irqrestore(lock,flags)
+#define NV_SPIN_LOCK(lock) raw_spin_lock(lock)
+#define NV_SPIN_UNLOCK(lock) raw_spin_unlock(lock)
+#define NV_SPIN_UNLOCK_WAIT(lock) raw_spin_unlock_wait(lock)
#else
typedef spinlock_t nv_spinlock_t;
#define NV_SPIN_LOCK_INIT(lock) spin_lock_init(lock)
@@ -956,8 +960,8 @@
return ret;
}
-#if defined(CONFIG_PREEMPT_RT)
-#define NV_INIT_MUTEX(mutex) semaphore_init(mutex)
+#if defined(CONFIG_PREEMPT_RT_FULL)
+#define NV_INIT_MUTEX(mutex) sema_init(mutex,1)
#else
#if !defined(__SEMAPHORE_INITIALIZER) && defined(__COMPAT_SEMAPHORE_INITIALIZER)
#define __SEMAPHORE_INITIALIZER __COMPAT_SEMAPHORE_INITIALIZER
Сохраните патч как «nv295.33_for 3.3 + _rt.patch». Примените патч ->
sh NVIDIA-Linux-x86_64-295.33.run --apply-patch nv295.33_for 3.3+_rt.patch
Это создаст новый двоичный установщик nvidia под названием «NVIDIA-Linux-x86_64-295.33-custom.run».
Запустите установщик с помощью
sh NVIDIA-Linux-x86_64-295.33-custom.run
Этот патч не содержит никаких гарантий или гарантий! Используйте его на свой страх и риск.
Перезагрузитесь и получайте удовольствие.
Вы найдете дополнительную информацию на форуме nv. Там вы также можете найти решение для серии 295.40.
Насколько я знаю, развитие ядра реального времени не ускоряется с циклом выпуска Ubuntu. Если вы должны запустить ядро реального времени, вам, вероятно, придется запускать более старую версию.
Для получения дополнительной информации см. https://help.ubuntu.com/community/UbuntuStudio/RealTimeKernel .
Обратите внимание, что в ядре с низкой задержкой существует, по крайней мере, некоторая текущая работа: https://launchpad.net/~abogani/+archive/ppa?field.series_filter=oneiric .
Долгосрочная цель проекта ядра RT состоит в том, чтобы в конечном итоге иметь все функциональные возможности RT в стандартном ядре, а это хорошо развивается . Патч RT имел нерегулярные релизы в прошлом, а взлом kernel.org в августе 2011 года сделал версию 3.0 недоступной в течение нескольких месяцев, но теперь все выглядит хорошо: есть патч для 3.0, другой для 3.2 (совпадающий с ядром версии в Ubuntu 11.10 и 12.04), а другой для 3.4, см. здесь .
Если вы используете Precise, вы можете использовать Realtime PPA Alessio Bogani , который любезно упаковал ядро ванили с применяемым патчем RT и синхронизирует его с номерами версий в Precise.
Если вы предпочитаете вручную создавать ядро RT, сначала установите необходимые пакеты программного обеспечения :
sudo apt-get install kernel-package fakeroot build-essential libncurses5-dev
Затем выберите галочку vanilla kernel и RT patch (номера версий несколько старые, по мере необходимости настройте):
mkdir -p ~/tmp/linux-rt
cd ~/tmp/linux-rt
wget http://www.kernel.org/pub/linux/kernel/v3.x/linux-3.4.tar.bz2
# Alternatively, try http://mirror.be.gbxs.net/pub/linux/kernel/projects/rt/3.4/patch-3.4-rt7.patch.bz2
# if the following is not available:
wget http://www.kernel.org/pub/linux/kernel/projects/rt/3.4/patch-3.4-rt7.patch.bz2
tar xjvf linux-3.4.tar.bz2
cd linux-3.4
patch -p1 < <(bunzip2 -c ../patch-3.4-rt7.patch.bz2)
Затем сконфигурируйте ядро, используя:
cp /boot/config-$(uname -r) .config && make oldconfig
, где вы должны выбрать «полное преемствование» (вариант 5), когда будет предложено, и оставьте все остальное по умолчанию, нажав enter на каждом незамедлительный. Конфигурация из ядра -lowlatency может стать лучшей отправной точкой, чем исходное ядро.
Затем создайте ядро с помощью:
sed -rie 's/echo "\+"/#echo "\+"/' scripts/setlocalversion
make-kpkg clean
CONCURRENCY_LEVEL=$(getconf _NPROCESSORS_ONLN) fakeroot make-kpkg --initrd --revision=0 kernel_image kernel_headers
И, наконец, установите новое ядро с:
sudo dpkg -i ../linux-{headers,image}-3.4.0-rt7_0_*.deb
На этом этапе вы должны перезагрузиться в ядро RT. Если ваше ядро не загружается, убедитесь, что вы дважды проверяете параметры загрузки и соответствующим образом изменяете их в своем загрузчике. Например, функции ACPI могут повлиять на вашу систему реального времени (как указано на rt.wiki.kernel.org). Добавление acpi = off может быть решением в таком случае.
Обратите внимание, что патч RT несовместим с двоичным драйвером Nvidia (но см. сообщение пользователем «rt-kernel» ниже и этот вопрос для обходного пути) и что исправления ядра Ubuntu не будут присутствовать, поэтому у вас могут быть проблемы с оборудованием, которые у вас не были раньше. Это справедливо как для пакетов PPA, так и для скомпилированного ядра. Конечно, вы всегда можете загрузиться в свое ядерное ядро и удалить пакеты ядра в реальном времени, если они вам неприятны.
Если вы зависите от использования двоичного драйвера nvidia, вы можете исправить исходный драйвер с помощью этого патча (для ядер 3.4+ только с rt-patches). Этот патч не содержит гарантии или гарантии! Используйте его на свой страх и риск .->
Index: kernel/conftest.sh
===================================================================
--- kernel/conftest.sh.orig
+++ kernel/conftest.sh
@@ -95,7 +95,7 @@
fi
fi
- CFLAGS="$CFLAGS $OUTPUT_CFLAGS -I$HEADERS $AUTOCONF_CFLAGS"
+ CFLAGS="$CFLAGS $OUTPUT_CFLAGS -I$HEADERS -I$OUTPUT/arch/x86/include/generated $AUTOCONF_CFLAGS"
test_xen
@@ -126,7 +126,7 @@
CFLAGS="$BASE_CFLAGS $MACH_CFLAGS $OUTPUT_CFLAGS -I$HEADERS $AUTOCONF_CFLAGS"
if [ "$ARCH" = "i386" -o "$ARCH" = "x86_64" ]; then
- CFLAGS="$CFLAGS -I$SOURCES/arch/x86/include -I$SOURCES/arch/x86/include/generated"
+ CFLAGS="$CFLAGS -I$SOURCES/arch/x86/include -I$OUTPUT/arch/x86/include/generated"
elif [ "$ARCH" = "ARMv7" ]; then
CFLAGS="$CFLAGS -I$SOURCES/arch/arm/include -I$SOURCES/arch/arm/include/generated"
fi
@@ -512,7 +512,12 @@
# and if it as an 'event' member.
#
echo "$CONFTEST_PREAMBLE
- #include <asm/system.h>
+ #include <linux/version.h>
+ #if LINUX_VERSION_CODE > KERNEL_VERSION(3, 3, 0)
+ #include <asm/switch_to.h>
+ #else
+ #include <asm/system.h>
+ #endif
#include <linux/pm.h>
void conftest_pm_message_t(pm_message_t state) {
pm_message_t *p = &state;
@@ -965,11 +970,12 @@
#
echo "$CONFTEST_PREAMBLE
#include <linux/acpi.h>
+ #include <acpi/acpixf.h>
void conftest_acpi_walk_namespace(void) {
acpi_walk_namespace();
}" > conftest$$.c
- $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
+ #CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
rm -f conftest$$.c
if [ -f conftest$$.o ]; then
@@ -980,6 +986,7 @@
echo "$CONFTEST_PREAMBLE
#include <linux/acpi.h>
+ #include <acpi/acpixf.h>
void conftest_acpi_walk_namespace(void) {
acpi_walk_namespace(0, NULL, 0, NULL, NULL, NULL, NULL);
}" > conftest$$.c
@@ -996,6 +1003,7 @@
echo "$CONFTEST_PREAMBLE
#include <linux/acpi.h>
+ #include <acpi/acpixf.h>
void conftest_acpi_walk_namespace(void) {
acpi_walk_namespace(0, NULL, 0, NULL, NULL, NULL);
}" > conftest$$.c
@@ -1603,6 +1611,9 @@
fi
fi
fi
+
+ RET=0
+ SELECTED_MAKEFILE=Makefile.kbuild
if [ "$RET" = "0" ]; then
ln -s $SELECTED_MAKEFILE Makefile
Index: kernel/nv-linux.h
===================================================================
--- kernel/nv-linux.h.orig
+++ kernel/nv-linux.h
@@ -111,7 +111,11 @@
#include <linux/timer.h>
#include <asm/div64.h> /* do_div() */
+#if LINUX_VERSION_CODE > KERNEL_VERSION(3, 3, 0)
+#include <asm/switch_to.h>
+#else
#include <asm/system.h> /* cli, sli, save_flags */
+#endif
#include <asm/io.h> /* ioremap, virt_to_phys */
#include <asm/uaccess.h> /* access_ok */
#include <asm/page.h> /* PAGE_OFFSET */
@@ -291,17 +295,17 @@
#endif
#endif
-#if defined(CONFIG_PREEMPT_RT)
-typedef atomic_spinlock_t nv_spinlock_t;
-#define NV_SPIN_LOCK_INIT(lock) atomic_spin_lock_init(lock)
-#define NV_SPIN_LOCK_IRQ(lock) atomic_spin_lock_irq(lock)
-#define NV_SPIN_UNLOCK_IRQ(lock) atomic_spin_unlock_irq(lock)
-#define NV_SPIN_LOCK_IRQSAVE(lock,flags) atomic_spin_lock_irqsave(lock,flags)
+#if defined(CONFIG_PREEMPT_RT_FULL)
+typedef raw_spinlock_t nv_spinlock_t;
+#define NV_SPIN_LOCK_INIT(lock) raw_spin_lock_init(lock)
+#define NV_SPIN_LOCK_IRQ(lock) raw_spin_lock_irq(lock)
+#define NV_SPIN_UNLOCK_IRQ(lock) raw_spin_unlock_irq(lock)
+#define NV_SPIN_LOCK_IRQSAVE(lock,flags) raw_spin_lock_irqsave(lock,flags)
#define NV_SPIN_UNLOCK_IRQRESTORE(lock,flags) \
- atomic_spin_unlock_irqrestore(lock,flags)
-#define NV_SPIN_LOCK(lock) atomic_spin_lock(lock)
-#define NV_SPIN_UNLOCK(lock) atomic_spin_unlock(lock)
-#define NV_SPIN_UNLOCK_WAIT(lock) atomic_spin_unlock_wait(lock)
+ raw_spin_unlock_irqrestore(lock,flags)
+#define NV_SPIN_LOCK(lock) raw_spin_lock(lock)
+#define NV_SPIN_UNLOCK(lock) raw_spin_unlock(lock)
+#define NV_SPIN_UNLOCK_WAIT(lock) raw_spin_unlock_wait(lock)
#else
typedef spinlock_t nv_spinlock_t;
#define NV_SPIN_LOCK_INIT(lock) spin_lock_init(lock)
@@ -956,8 +960,8 @@
return ret;
}
-#if defined(CONFIG_PREEMPT_RT)
-#define NV_INIT_MUTEX(mutex) semaphore_init(mutex)
+#if defined(CONFIG_PREEMPT_RT_FULL)
+#define NV_INIT_MUTEX(mutex) sema_init(mutex,1)
#else
#if !defined(__SEMAPHORE_INITIALIZER) && defined(__COMPAT_SEMAPHORE_INITIALIZER)
#define __SEMAPHORE_INITIALIZER __COMPAT_SEMAPHORE_INITIALIZER
Сохраните патч как «nv295.33_for 3.3 + _rt.patch». Примените патч ->
sh NVIDIA-Linux-x86_64-295.33.run --apply-patch nv295.33_for 3.3+_rt.patch
Это создаст новый двоичный установщик nvidia под названием «NVIDIA-Linux-x86_64-295.33-custom.run».
Запустите установщик с помощью
sh NVIDIA-Linux-x86_64-295.33-custom.run
Этот патч не содержит никаких гарантий или гарантий! Используйте его на свой страх и риск.
Перезагрузитесь и получайте удовольствие.
Вы найдете дополнительную информацию на форуме nv. Там вы также можете найти решение для серии 295.40.
Насколько я знаю, развитие ядра реального времени не ускоряется с циклом выпуска Ubuntu. Если вы должны запустить ядро реального времени, вам, вероятно, придется запускать более старую версию.
Для получения дополнительной информации см. https://help.ubuntu.com/community/UbuntuStudio/RealTimeKernel .
Обратите внимание, что в ядре с низкой задержкой существует, по крайней мере, некоторая текущая работа: https://launchpad.net/~abogani/+archive/ppa?field.series_filter=oneiric .
Долгосрочная цель проекта ядра RT состоит в том, чтобы в конечном итоге иметь все функциональные возможности RT в стандартном ядре, а это хорошо развивается . Патч RT имел нерегулярные релизы в прошлом, а взлом kernel.org в августе 2011 года сделал версию 3.0 недоступной в течение нескольких месяцев, но теперь все выглядит хорошо: есть патч для 3.0, другой для 3.2 (совпадающий с ядром версии в Ubuntu 11.10 и 12.04), а другой для 3.4, см. здесь .
Если вы используете Precise, вы можете использовать Realtime PPA Alessio Bogani , который любезно упаковал ядро ванили с применяемым патчем RT и синхронизирует его с номерами версий в Precise.
Если вы предпочитаете вручную создавать ядро RT, сначала установите необходимые пакеты программного обеспечения :
sudo apt-get install kernel-package fakeroot build-essential libncurses5-dev
Затем выберите галочку vanilla kernel и RT patch (номера версий несколько старые, по мере необходимости настройте):
mkdir -p ~/tmp/linux-rt
cd ~/tmp/linux-rt
wget http://www.kernel.org/pub/linux/kernel/v3.x/linux-3.4.tar.bz2
# Alternatively, try http://mirror.be.gbxs.net/pub/linux/kernel/projects/rt/3.4/patch-3.4-rt7.patch.bz2
# if the following is not available:
wget http://www.kernel.org/pub/linux/kernel/projects/rt/3.4/patch-3.4-rt7.patch.bz2
tar xjvf linux-3.4.tar.bz2
cd linux-3.4
patch -p1 < <(bunzip2 -c ../patch-3.4-rt7.patch.bz2)
Затем сконфигурируйте ядро, используя:
cp /boot/config-$(uname -r) .config && make oldconfig
, где вы должны выбрать «полное преемствование» (вариант 5), когда будет предложено, и оставьте все остальное по умолчанию, нажав enter на каждом незамедлительный. Конфигурация из ядра -lowlatency может стать лучшей отправной точкой, чем исходное ядро.
Затем создайте ядро с помощью:
sed -rie 's/echo "\+"/#echo "\+"/' scripts/setlocalversion
make-kpkg clean
CONCURRENCY_LEVEL=$(getconf _NPROCESSORS_ONLN) fakeroot make-kpkg --initrd --revision=0 kernel_image kernel_headers
И, наконец, установите новое ядро с:
sudo dpkg -i ../linux-{headers,image}-3.4.0-rt7_0_*.deb
На этом этапе вы должны перезагрузиться в ядро RT. Если ваше ядро не загружается, убедитесь, что вы дважды проверяете параметры загрузки и соответствующим образом изменяете их в своем загрузчике. Например, функции ACPI могут повлиять на вашу систему реального времени (как указано на rt.wiki.kernel.org). Добавление acpi = off может быть решением в таком случае.
Обратите внимание, что патч RT несовместим с двоичным драйвером Nvidia (но см. сообщение пользователем «rt-kernel» ниже и этот вопрос для обходного пути) и что исправления ядра Ubuntu не будут присутствовать, поэтому у вас могут быть проблемы с оборудованием, которые у вас не были раньше. Это справедливо как для пакетов PPA, так и для скомпилированного ядра. Конечно, вы всегда можете загрузиться в свое ядерное ядро и удалить пакеты ядра в реальном времени, если они вам неприятны.
Другой вариант - установить RTKernel из репозиториев KXStudio. Он хранит набор пакетов, предназначенных для аудио- и музыкальных произведений, и у него есть пакеты в режиме реального времени и с низкой задержкой.
http://kxstudio.sourceforge.net/Main_Page https : //launchpad.net/~kxstudio-team/+archive/kernel
Другой вариант - установить RTKernel из репозиториев KXStudio. Он хранит набор пакетов, предназначенных для аудио- и музыкальных произведений, и у него есть пакеты в режиме реального времени и с низкой задержкой.
http://kxstudio.sourceforge.net/Main_Page https : //launchpad.net/~kxstudio-team/+archive/kernel
Насколько я знаю, развитие ядра реального времени не ускоряется с циклом выпуска Ubuntu. Если вы должны запустить ядро реального времени, вам, вероятно, придется запускать более старую версию.
Для получения дополнительной информации см. https://help.ubuntu.com/community/UbuntuStudio/RealTimeKernel .
Обратите внимание, что в ядре с низкой задержкой существует, по крайней мере, некоторая текущая работа: https://launchpad.net/~abogani/+archive/ppa?field.series_filter=oneiric .
Если вы зависите от использования двоичного драйвера nvidia, вы можете исправить исходный драйвер с помощью этого патча (для ядер 3.4+ только с rt-patches). Этот патч не содержит гарантии или гарантии! Используйте его на свой страх и риск .->
Index: kernel/conftest.sh
===================================================================
--- kernel/conftest.sh.orig
+++ kernel/conftest.sh
@@ -95,7 +95,7 @@
fi
fi
- CFLAGS="$CFLAGS $OUTPUT_CFLAGS -I$HEADERS $AUTOCONF_CFLAGS"
+ CFLAGS="$CFLAGS $OUTPUT_CFLAGS -I$HEADERS -I$OUTPUT/arch/x86/include/generated $AUTOCONF_CFLAGS"
test_xen
@@ -126,7 +126,7 @@
CFLAGS="$BASE_CFLAGS $MACH_CFLAGS $OUTPUT_CFLAGS -I$HEADERS $AUTOCONF_CFLAGS"
if [ "$ARCH" = "i386" -o "$ARCH" = "x86_64" ]; then
- CFLAGS="$CFLAGS -I$SOURCES/arch/x86/include -I$SOURCES/arch/x86/include/generated"
+ CFLAGS="$CFLAGS -I$SOURCES/arch/x86/include -I$OUTPUT/arch/x86/include/generated"
elif [ "$ARCH" = "ARMv7" ]; then
CFLAGS="$CFLAGS -I$SOURCES/arch/arm/include -I$SOURCES/arch/arm/include/generated"
fi
@@ -512,7 +512,12 @@
# and if it as an 'event' member.
#
echo "$CONFTEST_PREAMBLE
- #include <asm/system.h>
+ #include <linux/version.h>
+ #if LINUX_VERSION_CODE > KERNEL_VERSION(3, 3, 0)
+ #include <asm/switch_to.h>
+ #else
+ #include <asm/system.h>
+ #endif
#include <linux/pm.h>
void conftest_pm_message_t(pm_message_t state) {
pm_message_t *p = &state;
@@ -965,11 +970,12 @@
#
echo "$CONFTEST_PREAMBLE
#include <linux/acpi.h>
+ #include <acpi/acpixf.h>
void conftest_acpi_walk_namespace(void) {
acpi_walk_namespace();
}" > conftest$$.c
- $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
+ #CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
rm -f conftest$$.c
if [ -f conftest$$.o ]; then
@@ -980,6 +986,7 @@
echo "$CONFTEST_PREAMBLE
#include <linux/acpi.h>
+ #include <acpi/acpixf.h>
void conftest_acpi_walk_namespace(void) {
acpi_walk_namespace(0, NULL, 0, NULL, NULL, NULL, NULL);
}" > conftest$$.c
@@ -996,6 +1003,7 @@
echo "$CONFTEST_PREAMBLE
#include <linux/acpi.h>
+ #include <acpi/acpixf.h>
void conftest_acpi_walk_namespace(void) {
acpi_walk_namespace(0, NULL, 0, NULL, NULL, NULL);
}" > conftest$$.c
@@ -1603,6 +1611,9 @@
fi
fi
fi
+
+ RET=0
+ SELECTED_MAKEFILE=Makefile.kbuild
if [ "$RET" = "0" ]; then
ln -s $SELECTED_MAKEFILE Makefile
Index: kernel/nv-linux.h
===================================================================
--- kernel/nv-linux.h.orig
+++ kernel/nv-linux.h
@@ -111,7 +111,11 @@
#include <linux/timer.h>
#include <asm/div64.h> /* do_div() */
+#if LINUX_VERSION_CODE > KERNEL_VERSION(3, 3, 0)
+#include <asm/switch_to.h>
+#else
#include <asm/system.h> /* cli, sli, save_flags */
+#endif
#include <asm/io.h> /* ioremap, virt_to_phys */
#include <asm/uaccess.h> /* access_ok */
#include <asm/page.h> /* PAGE_OFFSET */
@@ -291,17 +295,17 @@
#endif
#endif
-#if defined(CONFIG_PREEMPT_RT)
-typedef atomic_spinlock_t nv_spinlock_t;
-#define NV_SPIN_LOCK_INIT(lock) atomic_spin_lock_init(lock)
-#define NV_SPIN_LOCK_IRQ(lock) atomic_spin_lock_irq(lock)
-#define NV_SPIN_UNLOCK_IRQ(lock) atomic_spin_unlock_irq(lock)
-#define NV_SPIN_LOCK_IRQSAVE(lock,flags) atomic_spin_lock_irqsave(lock,flags)
+#if defined(CONFIG_PREEMPT_RT_FULL)
+typedef raw_spinlock_t nv_spinlock_t;
+#define NV_SPIN_LOCK_INIT(lock) raw_spin_lock_init(lock)
+#define NV_SPIN_LOCK_IRQ(lock) raw_spin_lock_irq(lock)
+#define NV_SPIN_UNLOCK_IRQ(lock) raw_spin_unlock_irq(lock)
+#define NV_SPIN_LOCK_IRQSAVE(lock,flags) raw_spin_lock_irqsave(lock,flags)
#define NV_SPIN_UNLOCK_IRQRESTORE(lock,flags) \
- atomic_spin_unlock_irqrestore(lock,flags)
-#define NV_SPIN_LOCK(lock) atomic_spin_lock(lock)
-#define NV_SPIN_UNLOCK(lock) atomic_spin_unlock(lock)
-#define NV_SPIN_UNLOCK_WAIT(lock) atomic_spin_unlock_wait(lock)
+ raw_spin_unlock_irqrestore(lock,flags)
+#define NV_SPIN_LOCK(lock) raw_spin_lock(lock)
+#define NV_SPIN_UNLOCK(lock) raw_spin_unlock(lock)
+#define NV_SPIN_UNLOCK_WAIT(lock) raw_spin_unlock_wait(lock)
#else
typedef spinlock_t nv_spinlock_t;
#define NV_SPIN_LOCK_INIT(lock) spin_lock_init(lock)
@@ -956,8 +960,8 @@
return ret;
}
-#if defined(CONFIG_PREEMPT_RT)
-#define NV_INIT_MUTEX(mutex) semaphore_init(mutex)
+#if defined(CONFIG_PREEMPT_RT_FULL)
+#define NV_INIT_MUTEX(mutex) sema_init(mutex,1)
#else
#if !defined(__SEMAPHORE_INITIALIZER) && defined(__COMPAT_SEMAPHORE_INITIALIZER)
#define __SEMAPHORE_INITIALIZER __COMPAT_SEMAPHORE_INITIALIZER
Сохраните патч как «nv295.33_for 3.3 + _rt.patch». Примените патч ->
sh NVIDIA-Linux-x86_64-295.33.run --apply-patch nv295.33_for 3.3+_rt.patch
Это создаст новый двоичный установщик nvidia под названием «NVIDIA-Linux-x86_64-295.33-custom.run».
Запустите установщик с помощью
sh NVIDIA-Linux-x86_64-295.33-custom.run
Этот патч не содержит никаких гарантий или гарантий! Используйте его на свой страх и риск.
Перезагрузитесь и получайте удовольствие.
Вы найдете дополнительную информацию на форуме nv. Там вы также можете найти решение для серии 295.40.
Долгосрочная цель проекта ядра RT состоит в том, чтобы в конечном итоге иметь все функциональные возможности RT в стандартном ядре, а это хорошо развивается . Патч RT имел нерегулярные релизы в прошлом, а взлом kernel.org в августе 2011 года сделал версию 3.0 недоступной в течение нескольких месяцев, но теперь все выглядит хорошо: есть патч для 3.0, другой для 3.2 (совпадающий с ядром версии в Ubuntu 11.10 и 12.04), а другой для 3.4, см. здесь .
Если вы используете Precise, вы можете использовать Realtime PPA Alessio Bogani , который любезно упаковал ядро ванили с применяемым патчем RT и синхронизирует его с номерами версий в Precise.
Если вы предпочитаете вручную создавать ядро RT, сначала установите необходимые пакеты программного обеспечения :
sudo apt-get install kernel-package fakeroot build-essential libncurses5-dev
Затем выберите галочку vanilla kernel и RT patch (номера версий несколько старые, по мере необходимости настройте):
mkdir -p ~/tmp/linux-rt
cd ~/tmp/linux-rt
wget http://www.kernel.org/pub/linux/kernel/v3.x/linux-3.4.tar.bz2
# Alternatively, try http://mirror.be.gbxs.net/pub/linux/kernel/projects/rt/3.4/patch-3.4-rt7.patch.bz2
# if the following is not available:
wget http://www.kernel.org/pub/linux/kernel/projects/rt/3.4/patch-3.4-rt7.patch.bz2
tar xjvf linux-3.4.tar.bz2
cd linux-3.4
patch -p1 < <(bunzip2 -c ../patch-3.4-rt7.patch.bz2)
Затем сконфигурируйте ядро, используя:
cp /boot/config-$(uname -r) .config && make oldconfig
, где вы должны выбрать «полное преемствование» (вариант 5), когда будет предложено, и оставьте все остальное по умолчанию, нажав enter на каждом незамедлительный. Конфигурация из ядра -lowlatency может стать лучшей отправной точкой, чем исходное ядро.
Затем создайте ядро с помощью:
sed -rie 's/echo "\+"/#echo "\+"/' scripts/setlocalversion
make-kpkg clean
CONCURRENCY_LEVEL=$(getconf _NPROCESSORS_ONLN) fakeroot make-kpkg --initrd --revision=0 kernel_image kernel_headers
И, наконец, установите новое ядро с:
sudo dpkg -i ../linux-{headers,image}-3.4.0-rt7_0_*.deb
На этом этапе вы должны перезагрузиться в ядро RT. Если ваше ядро не загружается, убедитесь, что вы дважды проверяете параметры загрузки и соответствующим образом изменяете их в своем загрузчике. Например, функции ACPI могут повлиять на вашу систему реального времени (как указано на rt.wiki.kernel.org). Добавление acpi = off может быть решением в таком случае.
Обратите внимание, что патч RT несовместим с двоичным драйвером Nvidia (но см. сообщение пользователем «rt-kernel» ниже и этот вопрос для обходного пути) и что исправления ядра Ubuntu не будут присутствовать, поэтому у вас могут быть проблемы с оборудованием, которые у вас не были раньше. Это справедливо как для пакетов PPA, так и для скомпилированного ядра. Конечно, вы всегда можете загрузиться в свое ядерное ядро и удалить пакеты ядра в реальном времени, если они вам неприятны.
Другой вариант - установить RTKernel из репозиториев KXStudio. Он хранит набор пакетов, предназначенных для аудио- и музыкальных произведений, и у него есть пакеты в режиме реального времени и с низкой задержкой.
http://kxstudio.sourceforge.net/Main_Page https : //launchpad.net/~kxstudio-team/+archive/kernel
Если вы зависите от использования двоичного драйвера nvidia, вы можете исправить исходный драйвер с помощью этого патча (для ядер 3.4+ только с rt-patches). Этот патч не содержит гарантии или гарантии! Используйте его на свой страх и риск .->
Index: kernel/conftest.sh
===================================================================
--- kernel/conftest.sh.orig
+++ kernel/conftest.sh
@@ -95,7 +95,7 @@
fi
fi
- CFLAGS="$CFLAGS $OUTPUT_CFLAGS -I$HEADERS $AUTOCONF_CFLAGS"
+ CFLAGS="$CFLAGS $OUTPUT_CFLAGS -I$HEADERS -I$OUTPUT/arch/x86/include/generated $AUTOCONF_CFLAGS"
test_xen
@@ -126,7 +126,7 @@
CFLAGS="$BASE_CFLAGS $MACH_CFLAGS $OUTPUT_CFLAGS -I$HEADERS $AUTOCONF_CFLAGS"
if [ "$ARCH" = "i386" -o "$ARCH" = "x86_64" ]; then
- CFLAGS="$CFLAGS -I$SOURCES/arch/x86/include -I$SOURCES/arch/x86/include/generated"
+ CFLAGS="$CFLAGS -I$SOURCES/arch/x86/include -I$OUTPUT/arch/x86/include/generated"
elif [ "$ARCH" = "ARMv7" ]; then
CFLAGS="$CFLAGS -I$SOURCES/arch/arm/include -I$SOURCES/arch/arm/include/generated"
fi
@@ -512,7 +512,12 @@
# and if it as an 'event' member.
#
echo "$CONFTEST_PREAMBLE
- #include <asm/system.h>
+ #include <linux/version.h>
+ #if LINUX_VERSION_CODE > KERNEL_VERSION(3, 3, 0)
+ #include <asm/switch_to.h>
+ #else
+ #include <asm/system.h>
+ #endif
#include <linux/pm.h>
void conftest_pm_message_t(pm_message_t state) {
pm_message_t *p = &state;
@@ -965,11 +970,12 @@
#
echo "$CONFTEST_PREAMBLE
#include <linux/acpi.h>
+ #include <acpi/acpixf.h>
void conftest_acpi_walk_namespace(void) {
acpi_walk_namespace();
}" > conftest$$.c
- $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
+ #CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
rm -f conftest$$.c
if [ -f conftest$$.o ]; then
@@ -980,6 +986,7 @@
echo "$CONFTEST_PREAMBLE
#include <linux/acpi.h>
+ #include <acpi/acpixf.h>
void conftest_acpi_walk_namespace(void) {
acpi_walk_namespace(0, NULL, 0, NULL, NULL, NULL, NULL);
}" > conftest$$.c
@@ -996,6 +1003,7 @@
echo "$CONFTEST_PREAMBLE
#include <linux/acpi.h>
+ #include <acpi/acpixf.h>
void conftest_acpi_walk_namespace(void) {
acpi_walk_namespace(0, NULL, 0, NULL, NULL, NULL);
}" > conftest$$.c
@@ -1603,6 +1611,9 @@
fi
fi
fi
+
+ RET=0
+ SELECTED_MAKEFILE=Makefile.kbuild
if [ "$RET" = "0" ]; then
ln -s $SELECTED_MAKEFILE Makefile
Index: kernel/nv-linux.h
===================================================================
--- kernel/nv-linux.h.orig
+++ kernel/nv-linux.h
@@ -111,7 +111,11 @@
#include <linux/timer.h>
#include <asm/div64.h> /* do_div() */
+#if LINUX_VERSION_CODE > KERNEL_VERSION(3, 3, 0)
+#include <asm/switch_to.h>
+#else
#include <asm/system.h> /* cli, sli, save_flags */
+#endif
#include <asm/io.h> /* ioremap, virt_to_phys */
#include <asm/uaccess.h> /* access_ok */
#include <asm/page.h> /* PAGE_OFFSET */
@@ -291,17 +295,17 @@
#endif
#endif
-#if defined(CONFIG_PREEMPT_RT)
-typedef atomic_spinlock_t nv_spinlock_t;
-#define NV_SPIN_LOCK_INIT(lock) atomic_spin_lock_init(lock)
-#define NV_SPIN_LOCK_IRQ(lock) atomic_spin_lock_irq(lock)
-#define NV_SPIN_UNLOCK_IRQ(lock) atomic_spin_unlock_irq(lock)
-#define NV_SPIN_LOCK_IRQSAVE(lock,flags) atomic_spin_lock_irqsave(lock,flags)
+#if defined(CONFIG_PREEMPT_RT_FULL)
+typedef raw_spinlock_t nv_spinlock_t;
+#define NV_SPIN_LOCK_INIT(lock) raw_spin_lock_init(lock)
+#define NV_SPIN_LOCK_IRQ(lock) raw_spin_lock_irq(lock)
+#define NV_SPIN_UNLOCK_IRQ(lock) raw_spin_unlock_irq(lock)
+#define NV_SPIN_LOCK_IRQSAVE(lock,flags) raw_spin_lock_irqsave(lock,flags)
#define NV_SPIN_UNLOCK_IRQRESTORE(lock,flags) \
- atomic_spin_unlock_irqrestore(lock,flags)
-#define NV_SPIN_LOCK(lock) atomic_spin_lock(lock)
-#define NV_SPIN_UNLOCK(lock) atomic_spin_unlock(lock)
-#define NV_SPIN_UNLOCK_WAIT(lock) atomic_spin_unlock_wait(lock)
+ raw_spin_unlock_irqrestore(lock,flags)
+#define NV_SPIN_LOCK(lock) raw_spin_lock(lock)
+#define NV_SPIN_UNLOCK(lock) raw_spin_unlock(lock)
+#define NV_SPIN_UNLOCK_WAIT(lock) raw_spin_unlock_wait(lock)
#else
typedef spinlock_t nv_spinlock_t;
#define NV_SPIN_LOCK_INIT(lock) spin_lock_init(lock)
@@ -956,8 +960,8 @@
return ret;
}
-#if defined(CONFIG_PREEMPT_RT)
-#define NV_INIT_MUTEX(mutex) semaphore_init(mutex)
+#if defined(CONFIG_PREEMPT_RT_FULL)
+#define NV_INIT_MUTEX(mutex) sema_init(mutex,1)
#else
#if !defined(__SEMAPHORE_INITIALIZER) && defined(__COMPAT_SEMAPHORE_INITIALIZER)
#define __SEMAPHORE_INITIALIZER __COMPAT_SEMAPHORE_INITIALIZER
Сохраните патч как «nv295.33_for 3.3 + _rt.patch». Примените патч ->
sh NVIDIA-Linux-x86_64-295.33.run --apply-patch nv295.33_for 3.3+_rt.patch
Это создаст новый двоичный установщик nvidia под названием «NVIDIA-Linux-x86_64-295.33-custom.run».
Запустите установщик с помощью
sh NVIDIA-Linux-x86_64-295.33-custom.run
Этот патч не содержит никаких гарантий или гарантий! Используйте его на свой страх и риск.
Перезагрузитесь и получайте удовольствие.
Вы найдете дополнительную информацию на форуме nv. Там вы также можете найти решение для серии 295.40.
Насколько я знаю, развитие ядра реального времени не ускоряется с циклом выпуска Ubuntu. Если вы должны запустить ядро реального времени, вам, вероятно, придется запускать более старую версию.
Для получения дополнительной информации см. https://help.ubuntu.com/community/UbuntuStudio/RealTimeKernel .
Обратите внимание, что в ядре с низкой задержкой существует, по крайней мере, некоторая текущая работа: https://launchpad.net/~abogani/+archive/ppa?field.series_filter=oneiric .
Долгосрочная цель проекта ядра RT состоит в том, чтобы в конечном итоге иметь все функциональные возможности RT в стандартном ядре, а это хорошо развивается . Патч RT имел нерегулярные релизы в прошлом, а взлом kernel.org в августе 2011 года сделал версию 3.0 недоступной в течение нескольких месяцев, но теперь все выглядит хорошо: есть патч для 3.0, другой для 3.2 (совпадающий с ядром версии в Ubuntu 11.10 и 12.04), а другой для 3.4, см. здесь .
Если вы используете Precise, вы можете использовать Realtime PPA Alessio Bogani , который любезно упаковал ядро ванили с применяемым патчем RT и синхронизирует его с номерами версий в Precise.
Если вы предпочитаете вручную создавать ядро RT, сначала установите необходимые пакеты программного обеспечения :
sudo apt-get install kernel-package fakeroot build-essential libncurses5-dev
Затем выберите галочку vanilla kernel и RT patch (номера версий несколько старые, по мере необходимости настройте):
mkdir -p ~/tmp/linux-rt
cd ~/tmp/linux-rt
wget http://www.kernel.org/pub/linux/kernel/v3.x/linux-3.4.tar.bz2
# Alternatively, try http://mirror.be.gbxs.net/pub/linux/kernel/projects/rt/3.4/patch-3.4-rt7.patch.bz2
# if the following is not available:
wget http://www.kernel.org/pub/linux/kernel/projects/rt/3.4/patch-3.4-rt7.patch.bz2
tar xjvf linux-3.4.tar.bz2
cd linux-3.4
patch -p1 < <(bunzip2 -c ../patch-3.4-rt7.patch.bz2)
Затем сконфигурируйте ядро, используя:
cp /boot/config-$(uname -r) .config && make oldconfig
, где вы должны выбрать «полное преемствование» (вариант 5), когда будет предложено, и оставьте все остальное по умолчанию, нажав enter на каждом незамедлительный. Конфигурация из ядра -lowlatency может стать лучшей отправной точкой, чем исходное ядро.
Затем создайте ядро с помощью:
sed -rie 's/echo "\+"/#echo "\+"/' scripts/setlocalversion
make-kpkg clean
CONCURRENCY_LEVEL=$(getconf _NPROCESSORS_ONLN) fakeroot make-kpkg --initrd --revision=0 kernel_image kernel_headers
И, наконец, установите новое ядро с:
sudo dpkg -i ../linux-{headers,image}-3.4.0-rt7_0_*.deb
На этом этапе вы должны перезагрузиться в ядро RT. Если ваше ядро не загружается, убедитесь, что вы дважды проверяете параметры загрузки и соответствующим образом изменяете их в своем загрузчике. Например, функции ACPI могут повлиять на вашу систему реального времени (как указано на rt.wiki.kernel.org). Добавление acpi = off может быть решением в таком случае.
Обратите внимание, что патч RT несовместим с двоичным драйвером Nvidia (но см. сообщение пользователем «rt-kernel» ниже и этот вопрос для обходного пути) и что исправления ядра Ubuntu не будут присутствовать, поэтому у вас могут быть проблемы с оборудованием, которые у вас не были раньше. Это справедливо как для пакетов PPA, так и для скомпилированного ядра. Конечно, вы всегда можете загрузиться в свое ядерное ядро и удалить пакеты ядра в реальном времени, если они вам неприятны.
Другой вариант - установить RTKernel из репозиториев KXStudio. Он хранит набор пакетов, предназначенных для аудио- и музыкальных произведений, и у него есть пакеты в режиме реального времени и с низкой задержкой.
http://kxstudio.sourceforge.net/Main_Page https : //launchpad.net/~kxstudio-team/+archive/kernel
Если вы зависите от использования двоичного драйвера nvidia, вы можете исправить исходный драйвер с помощью этого патча (для ядер 3.4+ только с rt-patches). Этот патч не содержит гарантии или гарантии! Используйте его на свой страх и риск .->
Index: kernel/conftest.sh
===================================================================
--- kernel/conftest.sh.orig
+++ kernel/conftest.sh
@@ -95,7 +95,7 @@
fi
fi
- CFLAGS="$CFLAGS $OUTPUT_CFLAGS -I$HEADERS $AUTOCONF_CFLAGS"
+ CFLAGS="$CFLAGS $OUTPUT_CFLAGS -I$HEADERS -I$OUTPUT/arch/x86/include/generated $AUTOCONF_CFLAGS"
test_xen
@@ -126,7 +126,7 @@
CFLAGS="$BASE_CFLAGS $MACH_CFLAGS $OUTPUT_CFLAGS -I$HEADERS $AUTOCONF_CFLAGS"
if [ "$ARCH" = "i386" -o "$ARCH" = "x86_64" ]; then
- CFLAGS="$CFLAGS -I$SOURCES/arch/x86/include -I$SOURCES/arch/x86/include/generated"
+ CFLAGS="$CFLAGS -I$SOURCES/arch/x86/include -I$OUTPUT/arch/x86/include/generated"
elif [ "$ARCH" = "ARMv7" ]; then
CFLAGS="$CFLAGS -I$SOURCES/arch/arm/include -I$SOURCES/arch/arm/include/generated"
fi
@@ -512,7 +512,12 @@
# and if it as an 'event' member.
#
echo "$CONFTEST_PREAMBLE
- #include <asm/system.h>
+ #include <linux/version.h>
+ #if LINUX_VERSION_CODE > KERNEL_VERSION(3, 3, 0)
+ #include <asm/switch_to.h>
+ #else
+ #include <asm/system.h>
+ #endif
#include <linux/pm.h>
void conftest_pm_message_t(pm_message_t state) {
pm_message_t *p = &state;
@@ -965,11 +970,12 @@
#
echo "$CONFTEST_PREAMBLE
#include <linux/acpi.h>
+ #include <acpi/acpixf.h>
void conftest_acpi_walk_namespace(void) {
acpi_walk_namespace();
}" > conftest$$.c
- $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
+ #CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
rm -f conftest$$.c
if [ -f conftest$$.o ]; then
@@ -980,6 +986,7 @@
echo "$CONFTEST_PREAMBLE
#include <linux/acpi.h>
+ #include <acpi/acpixf.h>
void conftest_acpi_walk_namespace(void) {
acpi_walk_namespace(0, NULL, 0, NULL, NULL, NULL, NULL);
}" > conftest$$.c
@@ -996,6 +1003,7 @@
echo "$CONFTEST_PREAMBLE
#include <linux/acpi.h>
+ #include <acpi/acpixf.h>
void conftest_acpi_walk_namespace(void) {
acpi_walk_namespace(0, NULL, 0, NULL, NULL, NULL);
}" > conftest$$.c
@@ -1603,6 +1611,9 @@
fi
fi
fi
+
+ RET=0
+ SELECTED_MAKEFILE=Makefile.kbuild
if [ "$RET" = "0" ]; then
ln -s $SELECTED_MAKEFILE Makefile
Index: kernel/nv-linux.h
===================================================================
--- kernel/nv-linux.h.orig
+++ kernel/nv-linux.h
@@ -111,7 +111,11 @@
#include <linux/timer.h>
#include <asm/div64.h> /* do_div() */
+#if LINUX_VERSION_CODE > KERNEL_VERSION(3, 3, 0)
+#include <asm/switch_to.h>
+#else
#include <asm/system.h> /* cli, sli, save_flags */
+#endif
#include <asm/io.h> /* ioremap, virt_to_phys */
#include <asm/uaccess.h> /* access_ok */
#include <asm/page.h> /* PAGE_OFFSET */
@@ -291,17 +295,17 @@
#endif
#endif
-#if defined(CONFIG_PREEMPT_RT)
-typedef atomic_spinlock_t nv_spinlock_t;
-#define NV_SPIN_LOCK_INIT(lock) atomic_spin_lock_init(lock)
-#define NV_SPIN_LOCK_IRQ(lock) atomic_spin_lock_irq(lock)
-#define NV_SPIN_UNLOCK_IRQ(lock) atomic_spin_unlock_irq(lock)
-#define NV_SPIN_LOCK_IRQSAVE(lock,flags) atomic_spin_lock_irqsave(lock,flags)
+#if defined(CONFIG_PREEMPT_RT_FULL)
+typedef raw_spinlock_t nv_spinlock_t;
+#define NV_SPIN_LOCK_INIT(lock) raw_spin_lock_init(lock)
+#define NV_SPIN_LOCK_IRQ(lock) raw_spin_lock_irq(lock)
+#define NV_SPIN_UNLOCK_IRQ(lock) raw_spin_unlock_irq(lock)
+#define NV_SPIN_LOCK_IRQSAVE(lock,flags) raw_spin_lock_irqsave(lock,flags)
#define NV_SPIN_UNLOCK_IRQRESTORE(lock,flags) \
- atomic_spin_unlock_irqrestore(lock,flags)
-#define NV_SPIN_LOCK(lock) atomic_spin_lock(lock)
-#define NV_SPIN_UNLOCK(lock) atomic_spin_unlock(lock)
-#define NV_SPIN_UNLOCK_WAIT(lock) atomic_spin_unlock_wait(lock)
+ raw_spin_unlock_irqrestore(lock,flags)
+#define NV_SPIN_LOCK(lock) raw_spin_lock(lock)
+#define NV_SPIN_UNLOCK(lock) raw_spin_unlock(lock)
+#define NV_SPIN_UNLOCK_WAIT(lock) raw_spin_unlock_wait(lock)
#else
typedef spinlock_t nv_spinlock_t;
#define NV_SPIN_LOCK_INIT(lock) spin_lock_init(lock)
@@ -956,8 +960,8 @@
return ret;
}
-#if defined(CONFIG_PREEMPT_RT)
-#define NV_INIT_MUTEX(mutex) semaphore_init(mutex)
+#if defined(CONFIG_PREEMPT_RT_FULL)
+#define NV_INIT_MUTEX(mutex) sema_init(mutex,1)
#else
#if !defined(__SEMAPHORE_INITIALIZER) && defined(__COMPAT_SEMAPHORE_INITIALIZER)
#define __SEMAPHORE_INITIALIZER __COMPAT_SEMAPHORE_INITIALIZER
Сохраните патч как «nv295.33_for 3.3 + _rt.patch». Примените патч ->
sh NVIDIA-Linux-x86_64-295.33.run --apply-patch nv295.33_for 3.3+_rt.patch
Это создаст новый двоичный установщик nvidia под названием «NVIDIA-Linux-x86_64-295.33-custom.run».
Запустите установщик с помощью
sh NVIDIA-Linux-x86_64-295.33-custom.run
Этот патч не содержит никаких гарантий или гарантий! Используйте его на свой страх и риск.
Перезагрузитесь и получайте удовольствие.
Вы найдете дополнительную информацию на форуме nv. Там вы также можете найти решение для серии 295.40.
Насколько я знаю, развитие ядра реального времени не ускоряется с циклом выпуска Ubuntu. Если вы должны запустить ядро реального времени, вам, вероятно, придется запускать более старую версию.
Для получения дополнительной информации см. https://help.ubuntu.com/community/UbuntuStudio/RealTimeKernel .
Обратите внимание, что в ядре с низкой задержкой существует, по крайней мере, некоторая текущая работа: https://launchpad.net/~abogani/+archive/ppa?field.series_filter=oneiric .
Долгосрочная цель проекта ядра RT состоит в том, чтобы в конечном итоге иметь все функциональные возможности RT в стандартном ядре, а это хорошо развивается . Патч RT имел нерегулярные релизы в прошлом, а взлом kernel.org в августе 2011 года сделал версию 3.0 недоступной в течение нескольких месяцев, но теперь все выглядит хорошо: есть патч для 3.0, другой для 3.2 (совпадающий с ядром версии в Ubuntu 11.10 и 12.04), а другой для 3.4, см. здесь .
Если вы используете Precise, вы можете использовать Realtime PPA Alessio Bogani , который любезно упаковал ядро ванили с применяемым патчем RT и синхронизирует его с номерами версий в Precise.
Если вы предпочитаете вручную создавать ядро RT, сначала установите необходимые пакеты программного обеспечения :
sudo apt-get install kernel-package fakeroot build-essential libncurses5-dev
Затем выберите галочку vanilla kernel и RT patch (номера версий несколько старые, по мере необходимости настройте):
mkdir -p ~/tmp/linux-rt
cd ~/tmp/linux-rt
wget http://www.kernel.org/pub/linux/kernel/v3.x/linux-3.4.tar.bz2
# Alternatively, try http://mirror.be.gbxs.net/pub/linux/kernel/projects/rt/3.4/patch-3.4-rt7.patch.bz2
# if the following is not available:
wget http://www.kernel.org/pub/linux/kernel/projects/rt/3.4/patch-3.4-rt7.patch.bz2
tar xjvf linux-3.4.tar.bz2
cd linux-3.4
patch -p1 < <(bunzip2 -c ../patch-3.4-rt7.patch.bz2)
Затем сконфигурируйте ядро, используя:
cp /boot/config-$(uname -r) .config && make oldconfig
, где вы должны выбрать «полное преемствование» (вариант 5), когда будет предложено, и оставьте все остальное по умолчанию, нажав enter на каждом незамедлительный. Конфигурация из ядра -lowlatency может стать лучшей отправной точкой, чем исходное ядро.
Затем создайте ядро с помощью:
sed -rie 's/echo "\+"/#echo "\+"/' scripts/setlocalversion
make-kpkg clean
CONCURRENCY_LEVEL=$(getconf _NPROCESSORS_ONLN) fakeroot make-kpkg --initrd --revision=0 kernel_image kernel_headers
И, наконец, установите новое ядро с:
sudo dpkg -i ../linux-{headers,image}-3.4.0-rt7_0_*.deb
На этом этапе вы должны перезагрузиться в ядро RT. Если ваше ядро не загружается, убедитесь, что вы дважды проверяете параметры загрузки и соответствующим образом изменяете их в своем загрузчике. Например, функции ACPI могут повлиять на вашу систему реального времени (как указано на rt.wiki.kernel.org). Добавление acpi = off может быть решением в таком случае.
Обратите внимание, что патч RT несовместим с двоичным драйвером Nvidia (но см. сообщение пользователем «rt-kernel» ниже и этот вопрос для обходного пути) и что исправления ядра Ubuntu не будут присутствовать, поэтому у вас могут быть проблемы с оборудованием, которые у вас не были раньше. Это справедливо как для пакетов PPA, так и для скомпилированного ядра. Конечно, вы всегда можете загрузиться в свое ядерное ядро и удалить пакеты ядра в реальном времени, если они вам неприятны.
Другой вариант - установить RTKernel из репозиториев KXStudio. Он хранит набор пакетов, предназначенных для аудио- и музыкальных произведений, и у него есть пакеты в режиме реального времени и с низкой задержкой.
http://kxstudio.sourceforge.net/Main_Page https : //launchpad.net/~kxstudio-team/+archive/kernel
Насколько я знаю, развитие ядра реального времени не ускоряется с циклом выпуска Ubuntu. Если вы должны запустить ядро реального времени, вам, вероятно, придется запускать более старую версию.
Для получения дополнительной информации см. https://help.ubuntu.com/community/UbuntuStudio/RealTimeKernel .
Обратите внимание, что в ядре с низкой задержкой существует, по крайней мере, некоторая текущая работа: https://launchpad.net/~abogani/+archive/ppa?field.series_filter=oneiric .
Если вы зависите от использования двоичного драйвера nvidia, вы можете исправить исходный драйвер с помощью этого патча (для ядер 3.4+ только с rt-patches). Этот патч не содержит гарантии или гарантии! Используйте его на свой страх и риск .->
Index: kernel/conftest.sh
===================================================================
--- kernel/conftest.sh.orig
+++ kernel/conftest.sh
@@ -95,7 +95,7 @@
fi
fi
- CFLAGS="$CFLAGS $OUTPUT_CFLAGS -I$HEADERS $AUTOCONF_CFLAGS"
+ CFLAGS="$CFLAGS $OUTPUT_CFLAGS -I$HEADERS -I$OUTPUT/arch/x86/include/generated $AUTOCONF_CFLAGS"
test_xen
@@ -126,7 +126,7 @@
CFLAGS="$BASE_CFLAGS $MACH_CFLAGS $OUTPUT_CFLAGS -I$HEADERS $AUTOCONF_CFLAGS"
if [ "$ARCH" = "i386" -o "$ARCH" = "x86_64" ]; then
- CFLAGS="$CFLAGS -I$SOURCES/arch/x86/include -I$SOURCES/arch/x86/include/generated"
+ CFLAGS="$CFLAGS -I$SOURCES/arch/x86/include -I$OUTPUT/arch/x86/include/generated"
elif [ "$ARCH" = "ARMv7" ]; then
CFLAGS="$CFLAGS -I$SOURCES/arch/arm/include -I$SOURCES/arch/arm/include/generated"
fi
@@ -512,7 +512,12 @@
# and if it as an 'event' member.
#
echo "$CONFTEST_PREAMBLE
- #include <asm/system.h>
+ #include <linux/version.h>
+ #if LINUX_VERSION_CODE > KERNEL_VERSION(3, 3, 0)
+ #include <asm/switch_to.h>
+ #else
+ #include <asm/system.h>
+ #endif
#include <linux/pm.h>
void conftest_pm_message_t(pm_message_t state) {
pm_message_t *p = &state;
@@ -965,11 +970,12 @@
#
echo "$CONFTEST_PREAMBLE
#include <linux/acpi.h>
+ #include <acpi/acpixf.h>
void conftest_acpi_walk_namespace(void) {
acpi_walk_namespace();
}" > conftest$$.c
- $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
+ #CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
rm -f conftest$$.c
if [ -f conftest$$.o ]; then
@@ -980,6 +986,7 @@
echo "$CONFTEST_PREAMBLE
#include <linux/acpi.h>
+ #include <acpi/acpixf.h>
void conftest_acpi_walk_namespace(void) {
acpi_walk_namespace(0, NULL, 0, NULL, NULL, NULL, NULL);
}" > conftest$$.c
@@ -996,6 +1003,7 @@
echo "$CONFTEST_PREAMBLE
#include <linux/acpi.h>
+ #include <acpi/acpixf.h>
void conftest_acpi_walk_namespace(void) {
acpi_walk_namespace(0, NULL, 0, NULL, NULL, NULL);
}" > conftest$$.c
@@ -1603,6 +1611,9 @@
fi
fi
fi
+
+ RET=0
+ SELECTED_MAKEFILE=Makefile.kbuild
if [ "$RET" = "0" ]; then
ln -s $SELECTED_MAKEFILE Makefile
Index: kernel/nv-linux.h
===================================================================
--- kernel/nv-linux.h.orig
+++ kernel/nv-linux.h
@@ -111,7 +111,11 @@
#include <linux/timer.h>
#include <asm/div64.h> /* do_div() */
+#if LINUX_VERSION_CODE > KERNEL_VERSION(3, 3, 0)
+#include <asm/switch_to.h>
+#else
#include <asm/system.h> /* cli, sli, save_flags */
+#endif
#include <asm/io.h> /* ioremap, virt_to_phys */
#include <asm/uaccess.h> /* access_ok */
#include <asm/page.h> /* PAGE_OFFSET */
@@ -291,17 +295,17 @@
#endif
#endif
-#if defined(CONFIG_PREEMPT_RT)
-typedef atomic_spinlock_t nv_spinlock_t;
-#define NV_SPIN_LOCK_INIT(lock) atomic_spin_lock_init(lock)
-#define NV_SPIN_LOCK_IRQ(lock) atomic_spin_lock_irq(lock)
-#define NV_SPIN_UNLOCK_IRQ(lock) atomic_spin_unlock_irq(lock)
-#define NV_SPIN_LOCK_IRQSAVE(lock,flags) atomic_spin_lock_irqsave(lock,flags)
+#if defined(CONFIG_PREEMPT_RT_FULL)
+typedef raw_spinlock_t nv_spinlock_t;
+#define NV_SPIN_LOCK_INIT(lock) raw_spin_lock_init(lock)
+#define NV_SPIN_LOCK_IRQ(lock) raw_spin_lock_irq(lock)
+#define NV_SPIN_UNLOCK_IRQ(lock) raw_spin_unlock_irq(lock)
+#define NV_SPIN_LOCK_IRQSAVE(lock,flags) raw_spin_lock_irqsave(lock,flags)
#define NV_SPIN_UNLOCK_IRQRESTORE(lock,flags) \
- atomic_spin_unlock_irqrestore(lock,flags)
-#define NV_SPIN_LOCK(lock) atomic_spin_lock(lock)
-#define NV_SPIN_UNLOCK(lock) atomic_spin_unlock(lock)
-#define NV_SPIN_UNLOCK_WAIT(lock) atomic_spin_unlock_wait(lock)
+ raw_spin_unlock_irqrestore(lock,flags)
+#define NV_SPIN_LOCK(lock) raw_spin_lock(lock)
+#define NV_SPIN_UNLOCK(lock) raw_spin_unlock(lock)
+#define NV_SPIN_UNLOCK_WAIT(lock) raw_spin_unlock_wait(lock)
#else
typedef spinlock_t nv_spinlock_t;
#define NV_SPIN_LOCK_INIT(lock) spin_lock_init(lock)
@@ -956,8 +960,8 @@
return ret;
}
-#if defined(CONFIG_PREEMPT_RT)
-#define NV_INIT_MUTEX(mutex) semaphore_init(mutex)
+#if defined(CONFIG_PREEMPT_RT_FULL)
+#define NV_INIT_MUTEX(mutex) sema_init(mutex,1)
#else
#if !defined(__SEMAPHORE_INITIALIZER) && defined(__COMPAT_SEMAPHORE_INITIALIZER)
#define __SEMAPHORE_INITIALIZER __COMPAT_SEMAPHORE_INITIALIZER
Сохраните патч как «nv295.33_for 3.3 + _rt.patch». Примените патч ->
sh NVIDIA-Linux-x86_64-295.33.run --apply-patch nv295.33_for 3.3+_rt.patch
Это создаст новый двоичный установщик nvidia под названием «NVIDIA-Linux-x86_64-295.33-custom.run».
Запустите установщик с помощью
sh NVIDIA-Linux-x86_64-295.33-custom.run
Этот патч не содержит никаких гарантий или гарантий! Используйте его на свой страх и риск.
Перезагрузитесь и получайте удовольствие.
Вы найдете дополнительную информацию на форуме nv. Там вы также можете найти решение для серии 295.40.
Долгосрочная цель проекта ядра RT состоит в том, чтобы в конечном итоге иметь все функциональные возможности RT в стандартном ядре, а это хорошо развивается . Патч RT имел нерегулярные релизы в прошлом, а взлом kernel.org в августе 2011 года сделал версию 3.0 недоступной в течение нескольких месяцев, но теперь все выглядит хорошо: есть патч для 3.0, другой для 3.2 (совпадающий с ядром версии в Ubuntu 11.10 и 12.04), а другой для 3.4, см. здесь .
Если вы используете Precise, вы можете использовать Realtime PPA Alessio Bogani , который любезно упаковал ядро ванили с применяемым патчем RT и синхронизирует его с номерами версий в Precise.
Если вы предпочитаете вручную создавать ядро RT, сначала установите необходимые пакеты программного обеспечения :
sudo apt-get install kernel-package fakeroot build-essential libncurses5-dev
Затем выберите галочку vanilla kernel и RT patch (номера версий несколько старые, по мере необходимости настройте):
mkdir -p ~/tmp/linux-rt
cd ~/tmp/linux-rt
wget http://www.kernel.org/pub/linux/kernel/v3.x/linux-3.4.tar.bz2
# Alternatively, try http://mirror.be.gbxs.net/pub/linux/kernel/projects/rt/3.4/patch-3.4-rt7.patch.bz2
# if the following is not available:
wget http://www.kernel.org/pub/linux/kernel/projects/rt/3.4/patch-3.4-rt7.patch.bz2
tar xjvf linux-3.4.tar.bz2
cd linux-3.4
patch -p1 < <(bunzip2 -c ../patch-3.4-rt7.patch.bz2)
Затем сконфигурируйте ядро, используя:
cp /boot/config-$(uname -r) .config && make oldconfig
, где вы должны выбрать «полное преемствование» (вариант 5), когда будет предложено, и оставьте все остальное по умолчанию, нажав enter на каждом незамедлительный. Конфигурация из ядра -lowlatency может стать лучшей отправной точкой, чем исходное ядро.
Затем создайте ядро с помощью:
sed -rie 's/echo "\+"/#echo "\+"/' scripts/setlocalversion
make-kpkg clean
CONCURRENCY_LEVEL=$(getconf _NPROCESSORS_ONLN) fakeroot make-kpkg --initrd --revision=0 kernel_image kernel_headers
И, наконец, установите новое ядро с:
sudo dpkg -i ../linux-{headers,image}-3.4.0-rt7_0_*.deb
На этом этапе вы должны перезагрузиться в ядро RT. Если ваше ядро не загружается, убедитесь, что вы дважды проверяете параметры загрузки и соответствующим образом изменяете их в своем загрузчике. Например, функции ACPI могут повлиять на вашу систему реального времени (как указано на rt.wiki.kernel.org). Добавление acpi = off может быть решением в таком случае.
Обратите внимание, что патч RT несовместим с двоичным драйвером Nvidia (но см. сообщение пользователем «rt-kernel» ниже и этот вопрос для обходного пути) и что исправления ядра Ubuntu не будут присутствовать, поэтому у вас могут быть проблемы с оборудованием, которые у вас не были раньше. Это справедливо как для пакетов PPA, так и для скомпилированного ядра. Конечно, вы всегда можете загрузиться в свое ядерное ядро и удалить пакеты ядра в реальном времени, если они вам неприятны.
Другой вариант - установить RTKernel из репозиториев KXStudio. Он хранит набор пакетов, предназначенных для аудио- и музыкальных произведений, и у него есть пакеты в режиме реального времени и с низкой задержкой.
http://kxstudio.sourceforge.net/Main_Page https : //launchpad.net/~kxstudio-team/+archive/kernel
Если вы зависите от использования двоичного драйвера nvidia, вы можете исправить исходный драйвер с помощью этого патча (для ядер 3.4+ только с rt-patches). Этот патч не содержит гарантии или гарантии! Используйте его на свой страх и риск .->
Index: kernel/conftest.sh
===================================================================
--- kernel/conftest.sh.orig
+++ kernel/conftest.sh
@@ -95,7 +95,7 @@
fi
fi
- CFLAGS="$CFLAGS $OUTPUT_CFLAGS -I$HEADERS $AUTOCONF_CFLAGS"
+ CFLAGS="$CFLAGS $OUTPUT_CFLAGS -I$HEADERS -I$OUTPUT/arch/x86/include/generated $AUTOCONF_CFLAGS"
test_xen
@@ -126,7 +126,7 @@
CFLAGS="$BASE_CFLAGS $MACH_CFLAGS $OUTPUT_CFLAGS -I$HEADERS $AUTOCONF_CFLAGS"
if [ "$ARCH" = "i386" -o "$ARCH" = "x86_64" ]; then
- CFLAGS="$CFLAGS -I$SOURCES/arch/x86/include -I$SOURCES/arch/x86/include/generated"
+ CFLAGS="$CFLAGS -I$SOURCES/arch/x86/include -I$OUTPUT/arch/x86/include/generated"
elif [ "$ARCH" = "ARMv7" ]; then
CFLAGS="$CFLAGS -I$SOURCES/arch/arm/include -I$SOURCES/arch/arm/include/generated"
fi
@@ -512,7 +512,12 @@
# and if it as an 'event' member.
#
echo "$CONFTEST_PREAMBLE
- #include <asm/system.h>
+ #include <linux/version.h>
+ #if LINUX_VERSION_CODE > KERNEL_VERSION(3, 3, 0)
+ #include <asm/switch_to.h>
+ #else
+ #include <asm/system.h>
+ #endif
#include <linux/pm.h>
void conftest_pm_message_t(pm_message_t state) {
pm_message_t *p = &state;
@@ -965,11 +970,12 @@
#
echo "$CONFTEST_PREAMBLE
#include <linux/acpi.h>
+ #include <acpi/acpixf.h>
void conftest_acpi_walk_namespace(void) {
acpi_walk_namespace();
}" > conftest$$.c
- $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
+ #CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
rm -f conftest$$.c
if [ -f conftest$$.o ]; then
@@ -980,6 +986,7 @@
echo "$CONFTEST_PREAMBLE
#include <linux/acpi.h>
+ #include <acpi/acpixf.h>
void conftest_acpi_walk_namespace(void) {
acpi_walk_namespace(0, NULL, 0, NULL, NULL, NULL, NULL);
}" > conftest$$.c
@@ -996,6 +1003,7 @@
echo "$CONFTEST_PREAMBLE
#include <linux/acpi.h>
+ #include <acpi/acpixf.h>
void conftest_acpi_walk_namespace(void) {
acpi_walk_namespace(0, NULL, 0, NULL, NULL, NULL);
}" > conftest$$.c
@@ -1603,6 +1611,9 @@
fi
fi
fi
+
+ RET=0
+ SELECTED_MAKEFILE=Makefile.kbuild
if [ "$RET" = "0" ]; then
ln -s $SELECTED_MAKEFILE Makefile
Index: kernel/nv-linux.h
===================================================================
--- kernel/nv-linux.h.orig
+++ kernel/nv-linux.h
@@ -111,7 +111,11 @@
#include <linux/timer.h>
#include <asm/div64.h> /* do_div() */
+#if LINUX_VERSION_CODE > KERNEL_VERSION(3, 3, 0)
+#include <asm/switch_to.h>
+#else
#include <asm/system.h> /* cli, sli, save_flags */
+#endif
#include <asm/io.h> /* ioremap, virt_to_phys */
#include <asm/uaccess.h> /* access_ok */
#include <asm/page.h> /* PAGE_OFFSET */
@@ -291,17 +295,17 @@
#endif
#endif
-#if defined(CONFIG_PREEMPT_RT)
-typedef atomic_spinlock_t nv_spinlock_t;
-#define NV_SPIN_LOCK_INIT(lock) atomic_spin_lock_init(lock)
-#define NV_SPIN_LOCK_IRQ(lock) atomic_spin_lock_irq(lock)
-#define NV_SPIN_UNLOCK_IRQ(lock) atomic_spin_unlock_irq(lock)
-#define NV_SPIN_LOCK_IRQSAVE(lock,flags) atomic_spin_lock_irqsave(lock,flags)
+#if defined(CONFIG_PREEMPT_RT_FULL)
+typedef raw_spinlock_t nv_spinlock_t;
+#define NV_SPIN_LOCK_INIT(lock) raw_spin_lock_init(lock)
+#define NV_SPIN_LOCK_IRQ(lock) raw_spin_lock_irq(lock)
+#define NV_SPIN_UNLOCK_IRQ(lock) raw_spin_unlock_irq(lock)
+#define NV_SPIN_LOCK_IRQSAVE(lock,flags) raw_spin_lock_irqsave(lock,flags)
#define NV_SPIN_UNLOCK_IRQRESTORE(lock,flags) \
- atomic_spin_unlock_irqrestore(lock,flags)
-#define NV_SPIN_LOCK(lock) atomic_spin_lock(lock)
-#define NV_SPIN_UNLOCK(lock) atomic_spin_unlock(lock)
-#define NV_SPIN_UNLOCK_WAIT(lock) atomic_spin_unlock_wait(lock)
+ raw_spin_unlock_irqrestore(lock,flags)
+#define NV_SPIN_LOCK(lock) raw_spin_lock(lock)
+#define NV_SPIN_UNLOCK(lock) raw_spin_unlock(lock)
+#define NV_SPIN_UNLOCK_WAIT(lock) raw_spin_unlock_wait(lock)
#else
typedef spinlock_t nv_spinlock_t;
#define NV_SPIN_LOCK_INIT(lock) spin_lock_init(lock)
@@ -956,8 +960,8 @@
return ret;
}
-#if defined(CONFIG_PREEMPT_RT)
-#define NV_INIT_MUTEX(mutex) semaphore_init(mutex)
+#if defined(CONFIG_PREEMPT_RT_FULL)
+#define NV_INIT_MUTEX(mutex) sema_init(mutex,1)
#else
#if !defined(__SEMAPHORE_INITIALIZER) && defined(__COMPAT_SEMAPHORE_INITIALIZER)
#define __SEMAPHORE_INITIALIZER __COMPAT_SEMAPHORE_INITIALIZER
Сохраните патч как «nv295.33_for 3.3 + _rt.patch». Примените патч ->
sh NVIDIA-Linux-x86_64-295.33.run --apply-patch nv295.33_for 3.3+_rt.patch
Это создаст новый двоичный установщик nvidia под названием «NVIDIA-Linux-x86_64-295.33-custom.run».
Запустите установщик с помощью
sh NVIDIA-Linux-x86_64-295.33-custom.run
Этот патч не содержит никаких гарантий или гарантий! Используйте его на свой страх и риск.
Перезагрузитесь и получайте удовольствие.
Вы найдете дополнительную информацию на форуме nv. Там вы также можете найти решение для серии 295.40.