Path: sramha!katsu From: katsu@sra.co.jp (WATANABE Katsuhiro) Message-ID: Date: 25 Jul 90 12:41:31 Organization: Software Research Associates, Inc.,Japan In-reply-to: yabuki@sra.co.jp's message of 24 Jul 90 08:36:50 GMT Newsgroups: sra.unix Subject: Re: error-of-making-dir(by testprogram) Distribution: sra References: <347@sran51.sra.co.JP> <204@sran84.sra.co.jp> 記事 で yabuki@sra.co.jp (Youichi Yabuki [sttd]) さんいはく > In article katsu@sra.co.jp (WATANABE Katsuhiro) writes: > > >sran14# adb -w -k /vmunix /dev/mem > >sbr 6000 slr 400 <- adb 出力 > >p0br b000 p0lr 27 p1br c000 p1lr fffc <- 出力 > >0x800aa05c+0x56/x <- 入力 (1) > >800aa0b2: 3 <- 出力 (2) > >0x800aa0b2/w 2 <- 入力 (3) > >800aa0b2: 3 = 2 <- 出力 > >^D <- 入力終り > > adb のない RISC NEWS ではどうするんですか? dbx? 「dbx -k /vmunix /dev/mem」って、どういうわけか /dev/mem をうまく 読んでくれないみたいですね。 gdb とかはどうなんでしょう? adb がないのは困りますが、今回の話のように、わかりきった少ない箇所に きまった値を書き込むのならべつに adb を必要としません。 /dev/kmem は、カーネルの仮想記憶の空間そのものを提供しているので、 これを open して、目的のアドレス(上でいえば 0x800aa0b2)に seek して 1語書き込んで close するだけで話は済むと思います。c でも3分ぐらいで 書けるのではないでしょうか。 perl -e 'open(KMEM, "/dev/kmem"); seek(KMEM, 0x800aa05c+0x56, 0); ¥ printf KMEM "%c%c", 0, 2; close KMEM' なんてするのはどうかなと思ったら、RISC NEWS では perl も完全に動いていない そうで。 でもここに到達する以前に、そもそも RISC NEWS では pstat -i も正しく 動かないので、変更するアドレスがわからないことになるとは思います。 記事 <204@sran84.sra.co.jp> で utashiro@sran84.sra.co.jp (Kazumasa Utashiro) さんいはく > In article > katsu@sra.co.jp (WATANABE Katsuhiro) writes: > >> 「adb -k /vmunix /dev/mem ならば adb が自分で mapping をする。 > >> adb /vmunix /dev/kmem ならば /dev/kmem が mapping した後の memory image を > >> adb に提供してくれる。だから両者は同じ」 > >> らしいです。$e もどちらも同じように出ますし。 > > -k を付けないと $p が使えないでしょ。この辺が違うんじゃない > だろうか。P2 の領域は固定のシステムページテーブルを使うので > いいのですが、コンテキストを切替えて P0 や P1 のアドレスを参 > 照したい時には -k が必要でしょう。$e で出てくるのは全部 P2 > のデータなのでどちらでも関係ない (と思う)。$r は違うな。 (paging の話はわからない (;_;) ので避けて通ってしまいます) core では先頭に u 領域があってこの中に pcb が含まれているようですが、 adb /vmunix /dev/kmem とすると、/dev/kmem が普通の core とみなされて、 これの先頭、すなわち仮想記憶の 0 番地からが u 領域ということになって、 $p や $r の出力におかしな影響を与えるのではないでしょうか。 それなら、/dev/kmem の先頭が u 領域として読み込まれたのだから、 u 領域の終り(man 5 core でいう UPAGES)が adb での 0 番地に対応して しまって、仮想記憶と adb でのアドレスがずれてしまうはずではないかというと そうはならなくて、/vmunix の magic が a.out の magic とは違うために adb は /vmunix, /dev/kmem を a.out, core の組とみなすのをやめてしまって 番地の mapping をしないことにしてしまいます。このおかげで adb /vmunix /dev/kmem でもまあまあ動くのだと思います。 これとは別に adb -k /vmunix /dev/mem とやると、-k スイッチで カーネルだということがわかっているので、カーネル専用のやりかたで pcb を捜しにいってくれるのではないでしょうか。 > ちなみに Sun OS 4.0.3 だと "adb /vmunix /dev/kmem" は 「core > file じゃない」と怒られます。 このことや、core の構造や $p などのことを考えると、やはり両方同じ ではなくて、「adb -k /vmunix /dev/mem」の方が正しいようですね。 -- ----____----____ 渡邊克宏 ソフトウェア工学研究所(四谷) 今月の標語:「あけみちゃんはかわいい」