2008年10月21日

[linux-users:108135] Re: linux-2.2.26/arch/i386/boot/setup.S にある jmpi とは?

> 一発で出てくるのであなたの求める答えとは違うかも知れません。
>
> http://www.linux.or.jp/JF/JFdocs/readkernel.html#ss3.3
> 辺りからの記述は参考になりませんか?
> http://www.e-net.or.jp/user/missing-link/Assembler/asmlog36.html
> に カトさん という方の解説がありますけれど

ありがとうございます。


> 一発で出てくるのであなたの求める答えとは違うかも知れません。

「アセンブラには GAS が使われている」という思い込みのために、
検索ワードに、必ず、"GAS" を含ませていたために、検索結果に違いが出たようです。
Linux 2.2 までは、16-bit boot code に対して、GAS ではなく、as86 というアセンブラが使われていたんですね。
Linux 2.4 から、16-bit boot code に対してのアセンブラが、as86 から GAS に変更されたと、

linux-2.4.34/Documentation/Changes
Binutils
--------

Linux on IA-32 has recently switched from using as86 to using gas for
assembling the 16-bit boot code, removing the need for as86 to compile
your kernel. This change does, however, mean that you need a recent
release of binutils.

linux-2.4.34/arch/i386/boot/bootsect.S
* modified by Chris Noe (May 1999) (as86 -> gas)

linux-2.4.34/arch/i386/boot/setup.S
* Transcribed from Intel (as86) -> AT&T (gas) by Chris Noe, May 1999.
* <stiker@xxxxx>

に書かれていたことを見つけました。

linux-2.2.26/arch/i386/boot/bootsect.S <-- Intel (as86)
linux-2.2.26/arch/i386/boot/setup.S <-- Intel (as86)
----------*------------*---------
linux-2.2.26/arch/i386/boot/compressed/head.S <-- AT&T (gas)
linux-2.2.26/arch/i386/kernel/head.S <-- AT&T (gas)
linux-2.2.26/arch/i386/kernel/entry.S <-- AT&T (gas)

linux-2.2.x では、上記のように、Intel (as86) と AT&T (gas) は使い分けが行われていました。
(自分で調べた結果なので、間違っていたら、訂正してください。)
カーネル内のある動きを調べている過程で、
linux-2.4.34/arch/i386/boot/setup.S <-- AT&T (gas)
のコードに移ってきて、AT&T (gas) のコードの中に、

# jmpi 0x100000,__KERNEL_CS

という Intel (as86) のコードがコメントの中に現れたので、
"jmpi" を AT&T (gas) のコード と思ってしまって、迷路に入りました。

2.6 系列より、2.4系列 や 2.2系列の方が、流れが掴みやすかったり、解説の文章も多いので、
2.4系列と2.2系列のカーネルソースを最初に読むケースというのは多いと思います。
その場合、今回と同じ疑問にぶつかる事もあると思いますので、分かったことを書きました。

> http://www.linux.or.jp/JF/JFdocs/readkernel.html#ss3.3

上記は読んでいましたが、「アセンブラには GAS が使われている」と思い込んでいたので.......。

> http://www.e-net.or.jp/user/missing-link/Assembler/asmlog36.html
> に カトさん という方の解説がありますけれど

「as86ってマイナーなのか、ドキュメントもあまり整備されていないようで、」
この "as86" という単語から、迷路を抜けることができました。

ありがとうございました。

> 門間です。
>
> http://mirror.oss.lzu.edu.cn/software/linux.old/Linux-0.95/docs/FAQ-0.95a
>
> によりますと、昔のカーネルブートコードはminixアセンブラ記法らしいですね。
> jmpiは、特定のCPUアーキテクチャによらず一般的に "jump immediate"を表す表
> 記としてよく使われると思いますが、要は定数番地へのジャンプ、命令中に直接
> 飛び先アドレスが記述されているジャンプ命令ということになると思います。

ありがとうございます。
as86 の文法については、これから具体的に確認するのですが、
教えていただいたページの

The Linux boot codes are written in Bruce Evans' minix
assembler, which has the same opcodes as the original minix assembler
ported to linux get as86.tar.Z

の英文の "get as86.tar.Z" の部分が(英語が苦手で)訳せませんでした。
(has....get.... のような構文?)(意味を想像して、構文を推測しても、?)

dev86-0.16.17/bin86/README-0.4
This is the as86 and ld86 distribution written by Bruce Evans. It's
copyright Bruce Evans, all rights reserved although you may use and copy
it for your personal use. It's a complete 8086 assembler and loader
which can make 32-bit code for the 386+ processors (under linux it's
used only to create the 16-bit bootsector and setup binaries). The
syntax is not compatible with the GNU assembler, but closer to intel
syntax ("wrong" order of operands etc).

dev86-0.16.17/bin86/README
Thu Mar 3 15:12:23 1994 H.J. Lu (hlu@xxxxx)

* version 0.1 is released.

* Makefile: new.

* a.out.h/bsd-a.out.h (struct exec): use short form if
__linux__ is defined.

* as/Makefile: minor changes.
(CLFAGS): add -I../a.out.h.

* ld/Makefile: minor changes.
(CLFAGS): add -I../a.out.h.

* ld/io.c (MY_STAT_H): don't define it if __linux__ is
defined.

* ld/ld.c (flag['z']): initialized to 0 if __linux__ is
defined.

* ld/obj.h (roundup):
* ld/writebin.c (roundup):
ld/readobj.c (roundup): change that to ld_roundup to avoid the
conflict with the system's roundup.

* ld/writebin.c: cleanup for the latest Linux C library.
(FILEHEADERLENGTH): change to sizeof (struct exec).
don't write a_trsize and its friends.

上記の文書から、その syntax が intel syntax に近いという事と、実際に、Linux 2.2.x
に利用された as86 は、Bruce Evans さんが書かれたものとは異なる部分がありそうな事が分かりました。

とにかく、迷路からは抜け出せました。
ありがとうございました。

投稿者 xml-rpc : 2008年10月21日 06:38
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/78228
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。