vine-users ML アーカイブ



[vine-users:065507] Re: CPUタ イプを後から変更

  • From: IKEDA Katsumi <ikedak@xxxxxxxxxxxxxxxx>
  • Subject: [vine-users:065507] Re: CPUタ イプを後から変更
  • Date: Sun, 02 May 2004 23:48:53 +0900 (JST)
池田@福山市です。

長文で失礼します 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