池田@福山市です。
長文で失礼します m(__)m
次の 3 つの部分からなります。
1. apt のソース (マシンタイプ判別方法調査結果 -- 未保証 --)
2. カーネルのソース (末尾に参考 URL つき -- 遊べるかも --)
3. その他 (言い訳 -- 結局なにも成果なし --)
From: "K.Iwamoto" <burns@xxxxxxxxxxxxxxxx>
Date: Sun, 02 May 2004 17:11:11 +0900
Message-ID: <20040502170414.01CC.BURNS@xxxxxxxxxxxxxxxx>
>
> On Sun, 02 May 2004 12:59:42 +0900
> shinonon <shinonon@xxxxxxxxxxxxxxx> wrote:
>
> > uname -m の結果が i686 なのが原因だと思っているのですが、apt-get だけで
> > カーネルアップグレードができるように、後から uname -m の結果を i586 に変
> > 更することは出来るんでしょうか?
>
> uname -mを参照することが確かならaptでアップグレードするとき一時的
> にでもunemeをリネームするなどして新たに自作のunameスクリプトに置
> き換えればいいんじゃないでしょうか?
1. apt のソース
とりあえず apt のソースをとってきました。
$ rpm -qf `which apt-get`
apt-0.3.19.cnc.55-11vl7
$ apt-get source apt
それでざざっとソースを調べてみると、次のような部分を発見しました。
[ apt-0.3.19cnc55/apt-pkg/rpm/rpmfactory.cc ]
| if (uname(&un) < 0) {
| thisArch = baseArch;
| } else {
| thisArch = un.machine;
| }
システムコール uname で thisArch を決定しているようです。
ここを書き換えれば、とりあえず i586 と思い込んでいる apt とか
一応できそうな気がしますが、あまりしない方が良いでしょうね。
そもそもこの解釈が正しいという自信もありません m(__)m
同じような感じでコマンド uname のソースも見てみました。
やはりシステムコール uname を呼んでいました。
2. カーネルのソース
それではとシステムコール uname の方を見てみると、ざっと
次のような感じでした。
[ linux-2.4.22/kernel/sys.c ]
| asmlinkage long sys_newuname(struct new_utsname * name)
| {
| int errno = 0;
|
| down_read(&uts_sem);
| if (copy_to_user(name,&system_utsname,sizeof *name))
| errno = -EFAULT;
| up_read(&uts_sem);
| return errno;
| }
[ linux-2.4.22/include/linux/utsname.h ]
| struct new_utsname {
| char sysname[65];
| char nodename[65];
| char release[65];
| char version[65];
| char machine[65];
| char domainname[65];
| };
|
| extern struct new_utsname system_utsname;
[ linux-2.4.22/init/version.c ]
| struct new_utsname system_utsname = {
| UTS_SYSNAME, UTS_NODENAME, UTS_RELEASE, UTS_VERSION,
| UTS_MACHINE, UTS_DOMAINNAME
| };
[ linux-2.4.22/include/linux/uts.h ]
| /*
| * Defines for what uname() should return
| */
(中略)
| #ifndef UTS_MACHINE
| #define UTS_MACHINE "unknown"
| #endif
[ linux-2.4.22/kernel/ksyms.c ]
| EXPORT_SYMBOL(system_utsname); /* UTS data */
| EXPORT_SYMBOL(uts_sem); /* UTS semaphore */
UTS のデータとセマフォがエクスポートされているので、
一応コマンドラインで確認しました。
$ /sbin/ksyms -a | egrep '(uts_sem|system_utsname)'
c02f4f80 system_utsname
c02f7264 uts_sem
デバイスドライバを作成して、i586 と i686 を切替えるコマンドを
用意するという方法もありそうな感じです。
そういうわけで system_utsname で見当をつけて調べてみたところ、
デバイスドライバで system_utsname をいじるとコードとして
linux-kernel に投稿されたものがあるようです。
http://marc.theaimsgroup.com/?l=linux-kernel&m=107601008715631&w=2
3. その他
そもそも何で i686 に認識されるのだろうという部分は、一応
bootsect.S から始めてソースは追ってみたのですが、時間切れ
のためおあずけです。
# 時間があってもダメだったと思います。
パッケージの方も見てみようということで kernel-2.4.spec を
ながめたところで時間切れとなりました。
# これも時間があってもダメだったと思います。
以上、何かのきっかけ、あるいはポインタにでもなれば幸いです。
# 優先順位の高い別の作業から逃避しているような気がする……。
--
池田 克巳 <ikedak@xxxxxxxxxxxxxxxx>
<http://www013.upp.so-net.ne.jp/ikeda/index.html>
GnuPG Fingerprint = 69BC 8241 0485 389E AA50 E795 7A32 D184 75CE EB0F