답변:
역전사 커널 프로젝트의 장기적인 목표는 모든에게 표준 커널의 RT 기능을 가진 결국, 그리고 이 잘 진행되고있다 . RT 패치는 과거에 불규칙적으로 릴리스되었으며 2011 년 8 월에 kernel.org를 해킹하면 몇 달 동안 3.0 버전에 액세스 할 수 없었지만 이제는 좋아 보입니다. 3.0 패치, 3.2 패치 (커널 포함) Ubuntu 11.10 및 12.04의 버전) 및 3.4의 다른 버전은 여기를 참조 하십시오 .
Precise를 사용 하는 경우 RT 패치가 적용된 바닐라 커널을 친절하게 패키지하고 Precise의 버전 번호와 동기화 상태를 유지 하는 Alessio Bogani의 실시간 PPA를 사용할 수 있습니다 .
수동으로 RT 커널을 빌드하려면 먼저 필요한 소프트웨어 패키지를 설치하십시오.
sudo apt-get install kernel-package fakeroot build-essential libncurses5-dev
그런 다음 바닐라 커널 과 RT 패치를 가져옵니다 (버전 번호는 다소 오래되었습니다. 필요에 따라 조정하십시오).
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 커널의 구성이 -geneeric 커널의 구성보다 나은 시작점이 될 수 있습니다.
그런 다음 커널을 빌드하십시오 :
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"사용자의 게시물 및 해결 방법에 대한 이 질문 참조 ) 우분투 커널 패치가 존재하지 않을 수 있습니다. 이전에는 없었던 하드웨어 문제. 이것은 PPA 패키지와 컴파일 된 커널 모두에 해당됩니다. 물론 일반적인 커널로 부팅하여 실시간 커널 패키지를 제거 할 수 있습니다.
kernel.org
우분투 linux-source
패키지를 사용하여 다운로드 apt
했으며 성공적으로 작동했습니다.
다른 옵션은 KXStudio의 저장소에서 RTKernel을 설치하는 것입니다. 그는 오디오 및 음악 제작을 목적으로하는 일련의 패키지를 유지하며 실시간 및 낮은 대기 시간 패키지를 가지고 있습니다.
http://kxstudio.sourceforge.net/Main_Page https://launchpad.net/~kxstudio-team/+archive/kernel
내가 아는 한 실시간 커널 개발은 우분투 릴리스주기와 보조를 맞추지 못했습니다. 실시간 커널을 실행해야하는 경우 이전 버전을 실행해야합니다.
자세한 내용은 https://help.ubuntu.com/community/UbuntuStudio/RealTimeKernel을 참조 하십시오 .
지연 시간이 짧은 커널에 대해서는 적어도 현재 일부 작업이있는 것 같습니다 : https://launchpad.net/~abogani/+archive/ppa?field.series_filter=oneiric .
nvidia 바이너리 드라이버를 사용하는 경우이 패치로 원래 드라이버를 패치 할 수 있습니다 (rt-patches가있는 3.4+ 커널에만 해당)이 패치는 보증 또는 보증이 제공되지 않습니다! 위험 부담으로 사용하십시오 .->
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-Linux-x86_64-295.33-custom.run"이라는 새로운 nvidia 바이너리 설치 프로그램을 빌드합니다.
로 설치 프로그램을 실행하십시오.
sh NVIDIA-Linux-x86_64-295.33-custom.run
이 패치에는 보증 또는 보증이 제공되지 않습니다! 자신의 위험에 따라 사용하십시오.
재부팅하고 재미있게 보내십시오.
nv 포럼에서 자세한 정보를 찾을 수 있습니다. 여기에서도 295.40 시리즈에 대한 솔루션을 찾을 수 있습니다.
elif [ "$ARCH" = "ARMv7" ]; then
과 그 이후 의 공간에 패치에 4 개의 공백 이 없습니다. 이것이 수정되지 않은 경우에는 적용되지 않습니다. 또한 nvidia 드라이버 버전 295.33은 nvidia.com/object/linux-display-amd64-295.33-driver.html 에서 다운로드 할 수 있습니다 (최신이 아니지만 phoronix의 보고서에 의해 판단 됨). 오늘 초부터는 당분간 295.40을 사용하지 않는 것이 좋습니다.
sudo
VT로 전환 sudo killall Xorg && sudo stop lightdm
하고 X를 실행하지 않아야하므로 VT로 전환하고 실행하기 전에 수행 해야 함을 나타냅니다 . 그 외에는 모든 것이 잘 작동합니다. 이제 버그 bugs.launchpad.net/bugs/920120을 피하고 듀얼 스크린 Ardor \ o /를 실행할 수 있습니다 . 패치 주셔서 감사합니다!