Gentoo Linux 下跑 2.4 Kernel + NPTL



贊助商連結


dou0228
2004-04-01, 06:08 PM
先下載: http://ccrma-www.stanford.edu/planetccrma/mirror/all/linux/SRPMS/kernel-2.4.22-1.2140.nptl.caps.src.rpm

再來就是把 rpm 轉成 tgz..
rpm2targz kernel-2.4.22-1.2140.nptl.caps.src.rpm

會產生一個 kernel-2.4.22-1.2140.nptl.caps.src.tar.gz

tar -zxf kernel-2.4.22-1.2140.nptl.caps.src.tar.gz -C nptl

進到 nptl 目錄.. 準備 把 Linux Kernel 2.4.22 & NPTL ... 解開 & patch..

存成 runme.sh, 並 chmod +x runme.sh


#!/bin/sh

S_PWD=`pwd`
K_DIR="/usr/src/linux-2.4.22"

rm -rf $K_DIR /usr/src/linux

echo "Uncompress linux-2.4.22"

tar -jxf linux-2.4.22.tar.bz2 -C /usr/src/

cat kernel-2.4.22-1.2140.nptl.caps.spec | egrep "^Patch" | cut -d " " -f 2 > patch_cmd

#
## remove patch `FAILED` patch
#
echo "1,$ s/linux-2.4.2-changeloop.patch//g | wq" | ex patch_cmd
echo "1,$ s/linux-2.4.18-loopfixes.patch//g | wq" | ex patch_cmd
echo "1,$ s/linux-2.4.18-dmi-hall-of-shame.patch//g | wq" | ex patch_cmd
echo "1,$ s/linux-2.4.9-fstat.patch//g | wq" | ex patch_cmd
echo "1,$ s/acpi-20030321-2.4.21-pre5.diff.gz//g | wq" | ex patch_cmd
echo "1,$ s/memstick.patch//g | wq" | ex patch_cmd
echo "1,$ s/008_vh_021217_ck_2.4.20.patch.bz2//g | wq" | ex patch_cmd
echo "1,$ s/rtc-2.4.20-13.1.caps.patch//g | wq" | ex patch_cmd

for i in `cat patch_cmd`; do

echo $i | egrep -q ".gz$"

if [ "$?" == "0" ]; then
cd $K_DIR && gzip -cd $S_PWD/$i | patch -p1

else
echo $i | egrep -q ".bz2$"
if [ "$?" == "0" ]; then
cd $K_DIR && bzip2 -cd $S_PWD/$i | patch -p1
else
cd $K_DIR && patch -p1 < $S_PWD/$i
fi
fi

echo "Processed of $i"

done

echo "Finished :)"

echo "replace for Alan Cox NPTL Patch"

#
# Patch for s/recalc_sigpending(current)/recalc_sigpending()/g
# s/p_opptr/real_parent/g
# s/sigmask_lock/sighand->siglock/g
#

cd $K_DIR

list=$(find . -name '*.c' -type f -exec egrep -q "recalc_sigpending\(current\)" {} \; -print); for i in $list; do echo "1,$ s/recalc_sigpending(current)/recalc_sigpending()/g | wq" | ex $i && echo "patched $i" ; done
list=$(find . -name '*.c' -type f -exec egrep -q "p_opptr" {} \; -print); for i in $list; do echo "1,$ s/p_opptr/real_parent/g | wq" | ex $i && echo "patched $i" ; done
list=$(find . -name '*.c' -type f -exec egrep -q "sigmask_lock" {} \; -print); for i in $list; do echo "1,$ s/sigmask_lock/sighand->siglock/g | wq" | ex $i && echo "patched $i" ; done

ln -sf /usr/src/linux-2.4.22 /usr/src/linux

cd /usr/src/linux
echo "1,$ s/gcc32/gcc/g | wq" | ex Makefile



這樣就可以準備 make 一份 NPTL 的 Kernel 了..

... make 好之後, 重開機..

cd /usr/portage/sys-libs/glibc

編輯 glibc-2.3.3_pre20040207.ebuild
把 export MIN_NPTL_KV = "xxx" 改成 export MIN_NPTL_KV="2.4.22"

再 USE="nptl" emerge glibc-2.3.3_pre20040207.ebuild

成功之後, /lib/libc.so.6 就會看到類似這樣的畫面..



Compiled by GNU CC version 3.3.3 20040217 (Gentoo Linux 3.3.3, propolice-3.3-7).
Compiled on a Linux 2.4.22-ac1-nptl system on 2004-04-01.
Available extensions:
GNU libio by Per Bothner
crypt add-on version 2.1 by Michael Glad and others
NPTL 0.60 by Ulrich Drepper <-- NPTL support 了 ;)
BIND-8.2.3-T5B
NIS(YP)/NIS+ NSS modules 0.19 by Thorsten Kukuk
Thread-local storage support included.
Report bugs using the `glibcbug' script to <[email protected]>.


沒想到我竟然在 4/1 弄 NPTL 到 AM 4:00 :(

贊助商連結


repsol
2004-04-07, 03:37 PM
NPTL = Native POSIX Threading Library ??
看了一點點文件,不知 dou0228 兄用了這個,對Java來說,果真有相當程度的提升 ?

dou0228
2004-04-07, 04:32 PM
是的, 正是 Native POSIX Threading Library..

我試了一下, thread 的 create & join 速度皆有提升..

pthread_create(), pthread_join()..

特別的一點是, pthread_create() 之後, 不再像以前一樣, 有一大堆 pid 在那了..

Java 的話, 那要看是 Native Thread 或是 Green Thread 了..
不過基本上我還是使用 Thread Pool 在跑..

雖然 Java 本來就慢的可以, 但是 Thread Pool 或多或少可以提升一點效率 :p

repsol
2004-04-07, 06:19 PM
之前曾在 FreeBSD 上使用 Linuxthreads,程式一 run 下去,它的確會產生一堆的 PID 在那邊
,搞的好像是 multi processes 的東西那樣,也曾把 Mysql 利用 LinuxThreads 來運作, 也是
一樣的情形,今天聽你一講,才知道原來它在 Linux下面也會這樣。
(我對 Linux不熟,但是總是拿 Linux 的東西在 FreeBSD 上惡搞 :p )。

至於 Java .....

dou0228
2004-04-08, 12:00 AM
會有一大堆 PID 是因為 LinuxThread 是 "Lightweight" *Process*
是使用 clone() 這一個 system call 去完成的..

會看到一大堆 PID, 說是好處也是, 說是壞處也是..
好處是, 你可以看到那些 Threads 的 status: sleep, running, ...
壞處是, 有多少 Threads 就吃掉 Threads + 1 個 pid.. ( 算是一種浪費 )

repsol
2004-04-09, 12:04 PM
原來是用了clone(),但是一直感覺很像 fork(),原來之間有密切的關係。

但是 Thread 的確還是 Thread,只是感覺好像應用了 parent process 來控制
一些生出來的 child processes的資源利用。

這就非常符合你所說的 Lightweight" *Process*

child process 所需要的系統資源並不是自己生出來的,而是取於 parent process 所用的(共用的觀念) , 這正是 thread 的重要觀念之一。
不同於一般 unix 所用的 mutli process,是自己獨占系統資源。

dou0228兄,多講一些吧。糾正糾正我的觀念吧