トップページ⇒linux
986コメント359KB

☆Linux カーネルの仕組みを勉強するスレ☆

■ このスレッドは過去ログ倉庫に格納されています
0001login:Penguin01/10/02 17:44ID:38KkZsUQ
メモリ管理、プロセス、ファイルシステム色々ありますが
カーネル全般について語り合うスレッドです。
070274303/06/26 23:58ID:Ryip/f5b
すいません、kernel.orgから落として来た linux-2.5.73.tar.bz2を
コンパイルしようとすると、make modules のところで、

CC [M] drivers/net/defxx.o
drivers/net/defxx.c:202:2: #error Please convert me to Documentation/DMA-mapping.txt
make[2]: *** [drivers/net/defxx.o] エラー 1
make[1]: *** [drivers/net] エラー 2
make: *** [drivers] エラー 2

といったエラーを出して止まってしまいます。
ググッてみても解決につながる情報が見つからなくて・・・
そもそもこの#error Please convert me というのは
何なのでしょう? どうすればエラーを回避できますか?
0703login:Penguin03/06/27 07:48ID:47Hwz5yO
kernel 2.5.73 を 入れてみた。
$ dmesg | head -1
Linux version 2.5.73 (root@=======) (gcc version 3.3 (Debian)) #1 Fri Jun 27 06:46:45 JST 2003

"module-init-tools" の0.9.9以上が入っていないとカーネルをコンパイルしたあとで最後にdepmodするところでこける。
その他 Documentation/Changes の"Minimal Requirement"に記載されている、特定のバージョンのパッケージが必要。

最初 "Preemptible Kernel" を試したが、bashをexitするときなどに
ときどきカーネルがOopsとかナイスなメッセージを出すので、外した。

カーネルモジュールの名前がFreeBSD式の"なんとか.ko"になっている。

bdflushがどうので/sbin/updateがobsoleteだからinitscriptを直せ、とか警告される。

サウンドモジュールがなにやら"unsafe"とかで。
lsmod すると
> cs4281 49152 1 [unsafe]
のような間抜けなステータスが出る。rmmodできない。

i810のdrm/agpgartカーネルモジュールがまずいらしく、Xのdriを有効にできない。
> (II) I810(0): [agp] GART: no dcache memory found
> (II) I810(0): [dri] Unable to allocate backbuffer memory. Disabling DRI.
~~
> (WW) I810(0): xf86AllocateGARTMemory: allocation of 1024 pages failed
> (Cannot allocate memory)
---
とりあえずvtを切替えても落ちることはない(以前はよく落ちた)。
dri.sourceforge.netにあるカーネルdriモジュールは kernel2.5では使えないようだ。

これ以外は、今のところちゃんと動いているが、ちょっとだけ不安。
070470203/06/27 21:05ID:z7RNnbMR
ひょっとしてカーネルコンパイルの設定とかはクダ質にすべきでしょうか?
0705login:Penguin03/06/28 00:51ID:V5nJnO59
>>704
親切に
Please convert me to Documentation/DMA-mapping.txt
と言ってくれているので、まずはドキュメントを読んで見ればいいのでは?
0706login:Penguin03/06/28 13:49ID:Vom+2tH9
>>697 >初代Linuxから、1プロセスがディスクI/O待ちしている間、他のプロセスが停止したり...
もちろん。そして、そのもとの文も、そうはいってないと思う。
それは、プロセスaのdiskI/Oまちの間プロセスbが止まると読むのではなく、
(おそらくだれか(a)の要求に関連する)disk I/Oの処理がプロセスbのスケジュー
リングを遅延させることを言ってるのだとおもう。プリエンプティブカーネル
(と、プライオリティつきスケジューラ)はそれを改善するものだから。

0707login:Penguin03/06/29 13:50ID:S956rOO5
>>706
>それは、プロセスaのdiskI/Oまちの間プロセスbが止まると読むのではなく、
>(おそらくだれか(a)の要求に関連する)disk I/Oの処理がプロセスbのスケジュー
>リングを遅延させることを言ってるのだとおもう。

うーむ。
何度読んでも、そうは読めないなぁ。それと、そもそも

>エンプティブカーネル (と、プライオリティつきスケジューラ)はそれを改善するものだから。

という理解も間違ってませんか?
2.4だって、I/O処理自体が、スケジューリングを遅延させているわけではないですよね?
自主的 sleep が入らないような類いのシステムコールが、再スケジューリングの遅れ
を発生させるのではありませんか?

http://www.atmarkit.co.jp/flinux/special/kernel26/kernel26_04a.html
上のURLでは、I/O処理完了にともなうハードウェア割り込み用ルーチンが起動した
場合にも、再スケジュールするようになりました、といっている感じですよね。
0708login:Penguin03/06/29 23:08ID:/oTz8bWl
>>707
漏れの理解でもそうだと思う
2.4では、自分でsleepするか、システムコールの終わりの
ユーザランドに戻る直前でしか、コンテクストスイッチは起きない。
カーネル内でいくら割り込みが起きても、割り込まれたプロセス
の実行に戻る。

プリエンプティブカーネルならば、割り込みがおきたところが
クリティカルセクションでない時には、割り込みハンドラの実行が
終わった所で再スケジューリングされる。
0709login:Penguin03/06/29 23:53ID:mQ4EYUec
>>708
割り込みから抜けるときも、ユーザーモード実行中でneed_resched立っていれば
schedule呼びます。

でないとcpu握ったままのプロセスがつくれてしまう。
0710login:Penguin03/07/02 01:58ID:VujfXoME
(・∀・)renice!
0711login:Penguin03/07/02 02:11ID:kUFisWUN
./arch/i386/kernel/smpboot.c, do_boot_cpu() の
エイヤと、5秒待ち合わせ!みたいな良い加減さは
Linux らしくて涙チョチョ切れるね。
2 - 4 SMP くらいだと、問題にならないのだろうけど。
0712login:Penguin03/07/06 21:37ID:VzJQlVRa
task_struct構造体に
int did_exec:1;
というメンバがあるんですが,これはどういう意味でしょうか?
0713直リン03/07/06 21:42ID:wYFJkOTE
http://homepage.mac.com/maki170001/
0714login:Penguin03/07/06 21:54ID:/k97neyg
>>712 C言語講座受けてくるか?
0715login:Penguin03/07/06 22:50ID:wK3uN9NX
>>712
bit fieldだね。
"int did_exec:1"と書くと
did_exec変数の下位1bitのみだけが有効になり、
0か1しか設定されないのさ。
0716login:Penguin03/07/07 00:12ID:WcWZ6n6e
>>715
0か-1ではないのか?

0717login:Penguin03/07/07 00:18ID:XJtR7Wyv
>>716
普通は1に解釈しない?
どーせ1bitしかないからnot 0であればいいんだが。
071871203/07/07 00:51ID:CYZ75cVf
自分では使ったことがないので完璧忘れてました.
アホな質問してすいません.
今度からはもう少し調べてから質問します.
0719login:Penguin03/07/07 22:00ID:kPsRFwM6
>>717
うん。0,1でいきたいので struct { int a:1; } s = {1};とか初期化しちゃう
けど、結局のところ解釈はコンパイラがやるので、例えば s.a >0 ? は偽です。
てか s.a==-1? が真になる。上位1bitが符号だから、それで正しいんだと思う。
0,1にしたければ unsigned int ですね。初期化とも矛盾しちゃって気持悪いし。
072071703/07/07 22:07ID:XJtR7Wyv
>>718
そうか、単純に符号拡張すれば-1か。
実装依存なのかな。

0721login:Penguin03/07/08 00:16ID:wvWko+bE
>>712, >>714-720
っていうか、task_struct構造体の
did_exec変数は、名前の通りフラグに使うわけだから
0か0以外の値で判定するだけいいわけです。
実際にsys.cファイルには
>if (p->did_exec)
> goto out;
ってなってるし。

ちなみにsys.cファイルのコメントには以下のメッセージが。(w
* Auch. Had to add the 'did_exec' flag to conform completely to POSIX.
0722login:Penguin03/07/08 01:23ID:a4iER9hA
(・∀・)renice!
0723login:Penguin03/07/12 12:47ID:Q71PnbZR
(・∀・)renice!
0724login:Penguin03/07/13 22:08ID:UrPfG9sV
2.4.22-pre5を使ってみたけど、2.4.21よりもdisk I/O処理時に
おいての応答性が上がったけど、コストパフォーマンスが落ちた
ような気がする。
やはり、応答性とコストパフォーマンスはトレードオフなのかな。


以下は自作プログラムによるテスト結果

【1分間のファイル読み書き回数】
   |2.4.22-pre5|2.4.21
―――|――――――|―――――
1回 |2588771  |2808551
2回 |2573318  |2865419
3回 |2569311  |2878404
4回 |2576775  |2870706
5回 |2578199  |2868286
6回 |2571464  |2865638
7回 |2588162  |2868531
8回 |2595950  |2863878
9回 |2606366  |2878016
10回|2604069  |2869487
平均 |2585238.5 |2863691.6

2.4.22-pre5の方が1分間のファイル読み書き回数が減少している。
0725login:Penguin03/07/13 22:14ID:TbuOUgH9
コストパフォーマンスの評価式は? それともパフォーマンスのことなのかな。

アレ(Xとかの応答性向上パッチ)がはいったんだっけ? もしあれなら、あれは
いままで相対的にI/OにCPUが渡りすぎてたのを、そっちを減らしてかわりにX
に割り当てる量を増やす"改善"をするパッチだから、当然I/O性能はおちます。
0726login:Penguin03/07/13 22:28ID:UrPfG9sV
>>725
>コストパフォーマンスの評価式は? それともパフォーマンスのことなのかな。
自分が言いたかったのは、多重プロセスがI/O処理中におけるCPU応答性のことです。

>アレ(Xとかの応答性向上パッチ)がはいったんだっけ? もしあれなら、あれは
>いままで相対的にI/OにCPUが渡りすぎてたのを、そっちを減らしてかわりにX
>に割り当てる量を増やす"改善"をするパッチだから、当然I/O性能はおちます。
それは、agp関連の事ですか?

ちなみ、GUI環境ではなくCUI環境でテストしました。
0727login:Penguin03/07/13 23:14ID:ujCbFKxO
>>725
ChangeLogを見る限りは入ってないなぁ。
io schedulerの修正入ってるから、そっちの影響かも。
関係あると思えないBUG fixなんだけど。
072872403/07/13 23:29ID:UrPfG9sV
しくりました。わけわかんないこと言ってました。
>>726で言ってる、
>>コストパフォーマンスの評価式は? それともパフォーマンスのことなのかな。
>自分が言いたかったのは、多重プロセスがI/O処理中におけるCPU応答性のことです。
ではなくて、プロセスがdisk I/O処理が終了するまでの合計処理時間です。
0729login:Penguin03/07/14 02:53ID:YDflspfA
age
0730login:Penguin03/07/15 03:41ID:kOKraebZ
カーネルが非SMPでもプリエンティブになったんだっけ?
ヤバくない?
0731login:Penguin03/07/15 03:57ID:v95prNRE
もちろんやばい作りのものデバドラとかはヤバいですよ。
カーネルがサポートしたなら、それは今やデバドラのバグです。
でもSMP対応しているものなら大丈夫な"ハズ"ですよ。そーゆートリックですから。
0732山崎 渉03/07/15 11:16ID:doz396Fq

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄
0733login:Penguin03/07/15 11:57ID:Fo16Kpwc
(・∀・)renice!
0734login:Penguin03/07/16 01:23ID:g/ls7vVV
>>730
>カーネルが非SMPでもプリエンティブになったんだっけ?
>ヤバくない?
SMP、非SMPのどちらであろうがカーネルはプリエンティブになっている。
何でやばくなるの?

>>731
>もちろんやばい作りのものデバドラとかはヤバいですよ。
>カーネルがサポートしたなら、それは今やデバドラのバグです。
もし、それでヤバくなるデバドラならそのデバドラの設計ミスでしょ。

>でもSMP対応しているものなら大丈夫な"ハズ"ですよ。そーゆートリックですから。
もしかしてテキトーに言ってますか?
0735login:Penguin03/07/17 03:08ID:X2zI67Ch
>>734
> もし、それでヤバくなるデバドラならそのデバドラの設計ミスでしょ。
もち。そういう意図の発言です。

> もしかしてテキトーに言ってますか?
spinlockがプリエンプションのポイントになっていることを指して言っています。

0736login:Penguin03/07/18 01:34ID:Ad3cqyqT
要するにカーネルのソースにクリティカルセクションを
守るためのロックプリミティブがちゃんと書いてあれば
いいということだろ。
SMPならばtest and setとかの本当のlockをすればいいし、
プリエンプティブのときにはプリエンプション可能かを見る。
従って、CONFIG_SMPとCONFIG_PREEMPT(?)は独立に
できるはず。
と、テキトーに思ってみるわけだが。
0737login:Penguin03/07/18 21:26ID:7TXfJdj/
>>736
SMPとPreemption-kernelは初めから独立して設定できる。
Preemption-kernelのコードはSMPとそれ以外で場合分けされてる。

Preemption-kernelのコードは2.4向けのパッチを見ると良いかも。
0738login:Penguin03/07/22 11:26ID:6WQ9WMDa
(・∀・)renice!
0739login:Penguin03/07/25 12:51ID:NH3LXVfX
(・∀・)renice!
0740login:Penguin03/07/28 12:56ID:YIr5Dzm4
(・∀・)renice!
0741ぼるじょあ ◆yBEncckFOU 03/08/02 05:08ID:GfRe8vK7
     ∧_∧  ∧_∧
ピュ.ー (  ・3・) (  ^^ ) <これからも僕たちを応援して下さいね(^^)。
  =〔~∪ ̄ ̄ ̄∪ ̄ ̄〕
  = ◎――――――◎                      山崎渉&ぼるじょあ
0742login:Penguin03/08/02 10:31ID:0p3phC6s
(・∀・)renice!
0743login:Penguin03/08/10 11:15ID:t5VAEY5s
(・∀・)renice!
0744login:Penguin03/08/11 11:53ID:5aoknCTf
今のkernelて、何stepくらいあるの?
0745login:Penguin03/08/15 17:22ID:aL8WrViO
(・∀・)renice!
0746abc03/08/15 18:53ID:D/wj3em9
画像集!
http://www.sexpixbox.com/pleasant/dx/index.html
0747山崎 渉03/08/15 22:11ID:ep0zwfOh
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン
0748山崎 渉03/08/15 22:35ID:ep0zwfOh
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン
0749login:Penguin03/08/16 00:02ID:+8Yy95I5
(・∀・)renice!
0750login:Penguin03/08/16 00:25ID:CSEwRIa6
>>744
linux-2.6.0-test3+αで
find -name '*.[ch]'|xargs cat|wc -l
の結果。
5,254,674行
全部把握できたらまちがいなく神。

ちなみに、
find drivers -name '*.[ch]'|xargs cat|wc -l
が、2,516,767行なので、半分ぐらいはドライバだな。
0751login:Penguin03/08/16 14:38ID:oSWJJuxF
USAGIカーネル(ver2.4.21)を入れたのですが、USBマウスを認識できません。

Initializing USB Keyboard: modprobe: Can't locate module keybdev
というNGが出ていたので、
make xconfig で
Input core support を m
Mouse support を m

 USB support の USB HIDBP Mouse (basic) support を m
としたところ、エラーは消えました。

ですが、マウスを動かしても反応してくれませんでした。
m ではまずいのかと思い、上記のところを y にしてみると今度はNGが
出てしまいました。


もう一つ質問です。
IPv6対応にしたいのですが、Networking options の
The IPv6 protocol(EXPERIMENTAL) を m とし
それによって増えた項目全部を y としたところ
make module_install 実行時

depmod: *** Unresolved symbols in /lib/modules/2.4.21/kernel/net/ipv6/ipv6.o
depmod: find_transform_by_name_R027c72c5

と言われました。
これはどのように対処すればいいのでしょうか?
ifconfigをやってもIPv6のIPがまったく出てこなくて・・・・・・・

長い文章で申し訳ございませんが、ご指導よろしくお願いいたします。
0752login:Penguin03/08/25 09:44ID:ZYMvu5IH
(・∀・)renice!
0753login:Penguin03/08/28 07:10ID:ssaojeEB
しつもーん。

NFS経由の多段リンクとかしてたらスタックオーバーフロー
とか言ってハングするのだが・・・スタック領域って拡張できるの?
0754login:Penguin03/08/28 10:48ID:GLbP7FQB
>>753
カーネルスタック?
カーネル作りなおせば増やせるけど、どこに影響が出るかわからんぞ。
0755login:Penguin03/08/29 13:31ID:UPtCxfjb
>>753
多段リンクの意味がよくわからない。
symlink -> symlink -> realfile ってこと?
0756login:Penguin03/09/01 11:50ID:MpWyDbPw
(・∀・)renice!
0757eiji03/09/02 13:56ID:DWK7xXkc
linuxとwindowsのカーネルの仕組みの違いについて教えていただけませんでしょうか。
お願いします。
0758login:Penguin03/09/02 14:53ID:BTzOKWIc
>>757
そんな漠然とした質問に答えられる香具師は居ないと思われ。
カーネルといったって規模が大きいからな。
カーネルとは何ぞや、ということを先ず本か何か読んで調べるのが吉。
0759login:Penguin03/09/02 15:08ID:pHfbPm/9
>>757
宿題は自分でやれ。
0760login:Penguin03/09/03 16:28ID:iWz7WMbL
windowsといってもWindows/386の流れとNTの流れで別物だし。
0761login:Penguin03/09/04 22:39ID:fsrmdR87
>>754
>>755
ありがとー。実は客にきかれててさー。
カーネルスタックかぁー。触らない方がよさだよなぁ。
でも説明せんといけないし。なんか参考になるサイトないすか?

あ、あと多段リンクはこれであってる。
説明がなかったな。スマソ
一応、制限が5段までで怪しいパッチをあてると8段まで
いけるらしいんだけど、スタックオーバーフローになる。

0762login:Penguin03/09/05 02:29ID:sR5Y928W
>>761

スタックオーバーフローって、カーネルじゃなくて、
アプリケーションがタコなだけな気も。

カーネル的には、symlink は 20段程度やそこらは大丈夫だったと思ったけど。
(つーか、symlink の循環を検出するために、一応、限度を設定してるだけで、
 カーネルでのスタック消費がどんどん増えていく、とかはないはず)

いずれにしても、カーネルで他段symlink限界を超えたときは、ELOOP でしょ。
単に、アプリケーションが自前で lstat() や readlink() を使った挙げ句、
爆死してるとかじゃない?
死んでるのは、なんてソフト/コマンドなの?
0763login:Penguin03/09/05 06:48ID:NvZ0a9K7
杖はどっちの手に持ってるんですか?
0764login:Penguin03/09/06 02:38ID:6wacLc6H
>>751
IPv6対応にしたいのですが、Networking options の
The IPv6 protocol(EXPERIMENTAL) を m とし
それによって増えた項目全部を y としたところ

usagi/doc/CONFIG.linux24
あたりを読め。意味がわからんやつをyにするな。
0765login:Penguin03/09/08 22:57ID:hx2KIDDj
>>762
ありがとう!そんな答えが欲しかった。

実は客が何やってるのか今一つかめてないから
判ったらまた書くよ。またよろしく。
0766login:Penguin03/09/15 10:49ID:I+VNLCRD
(・∀・)renice!
0767login:Penguin03/10/11 22:31ID:seR0x92U
アックス・・・やばいよ・・・
0768login:Penguin03/10/18 22:04ID:cV4cEMzM
>>767
アックスってやばいの? 死期神を作っている会社だよね?
0769login:Penguin03/10/18 23:05ID:iEnCwFBH
お金関係は問題ないのでは?
広報は…昔からなのであきらめて下さい。
0770login:Penguin03/10/19 04:24ID:vsa+A4dY
いや、なんつーか
セミナーがあまりにアホ過ぎて
笑いを通り越した
0771login:Penguin03/10/19 15:14ID:P4K7wAI7
それは提携している所の問題じゃないかと。
0772login:Penguin03/10/24 01:06ID:8mSLFw8A
ヘッダファイルでexternではなくstatic inlineで記述してある関数には何か理由があるのでしょうか?
0773login:Penguin03/10/24 01:44ID:IA1XAa8m
inlineの意味を調べればわかる。
0774login:Penguin03/11/01 18:25ID:BY3sdtX9
task_struct構造体の最初の初期化はlinux/include/sched.hのINIT_TASKマクロっすか?
それとメモリ領域の確保にはget_free_page、kmalloc、vmallocのどれがベターなんすかね?
調べた限りでは

get_free_page ページフレーム単位での割り当て(4kB)
kmalloc 連続したメモリ領域の確保
vmalloc 非連続メモリ領域の確保

たぶん割り当てるデータの種類・頻度によって使う方法が違うと思うんですが、
いまいちこういうデータにはこれがいい、という判断ができないもので。
0775login:Penguin03/11/01 18:44ID:UJpXfS4u
おまいら、qemuのお話はしないのか。
0776login:Penguin03/11/01 19:13ID:VqBAcchD
> いまいちこういうデータにはこれがいい、という判断ができないもので。 というのがわかっているなら、 > それとメモリ領域の確保にはget_free_page、kmalloc、vmallocのどれがベターなんすかね? この質問では答えがないことがわかるだろう。
0777login:Penguin03/11/01 21:56ID:GycfD/6p
>776
だから、こういうときはkmallocとかいうような場合分けの判断の仕方を教えて欲しいわけです。
初期化の方は?
0778login:Penguin03/11/01 23:26ID:yJPpr0Et
このスレの立った当時のkernelバージョンは何だったんだろう・・・
0779login:Penguin03/11/01 23:57ID:X+/ZvCjk
普通の構造体ならkmallocやkmem_cache_allocでいいんじゃないでしょうか?
get_free_pagesとvmallocは意味がわからないのなら使う用途はなさそう。
0780login:Penguin03/11/02 02:01ID:c8ANRrTL
>779
char *とかはどうです?なまじページフレーム以下のバイト数割り当ててページフレーム内でのメモリ断片化を起こすより、ページフレーム単位で割り当てた方がいいんですかね?
でも4kBはでかいものなあ・・・

0781login:Penguin03/11/02 04:02ID:mdTuavMg
オレも4kbはデカイなと思ってたけど
結局malloc系はみんな4kbずつ取られちゃうし
そもそもPCならメモリはたくさんだから
1000枚とったって4メガじゃん とか思って
もうめんどくさいしと考えて kmalloc
0782login:Penguin03/11/02 13:27ID:3SVrF8XB
>>777
初期化はその通り

一時的に使うか大体1ページ埋まっちゃう時はget_free_pages
それ以外はkmalloc
かな。

細かいことを気にしたくないなら、kmallocでいいんじゃない?
0783login:Penguin03/11/02 14:11ID:aAzlTdEE
>>781,782
そうっすね。kmallocを使うようにします。
ありがとうございました。
0784login:Penguin03/11/12 19:11ID:j+kuNkZG
デバイスのインストールをしようとしたときに、デバイスのソースコンパイルで
sizeof(struct rs_table[])
でエラーがでます。
rs_table[]の定義が見つからないようです。

kernelのrs_table[]を参照しているのですが、
これはどこに書いてあるでしょうか?

また、これはどのような意味でしょうか?

わかる方がいましたら教えていただきたいです。

シリアルttyS??やリソースに関係しているっぽいらしいことはなんとなくわかったのですが。。。
078578403/11/12 19:14ID:j+kuNkZG
sizeof(struct rs_table[])ではなくsizeof(rs_table)でした。
0786login:Penguin03/11/12 19:56ID:QJ3+g/Cf
カーネルといえば三ダースおじさん
0787login:Penguin03/11/13 04:48ID:9Axt2Fw5
linux/serialP.h をincludeしといて、かわりに sizeof(struct serial_state) を使う。
0788login:Penguin03/11/13 04:53ID:9Axt2Fw5
ぐはぁ、sizeof(rs_table[])ではないのね。ごめんなさい。
sizeof(struct serial_state)*RS_TABLE_SIZE
あたりで手をうったらだめ?
0789login:Penguin03/11/16 03:56ID:rakWerCm
カーネル内からカレントプロセスがデーモンかどうかを識別する方法ってありますか?
0790login:Penguin03/11/16 13:56ID:mtRdwIbi
>>789
current->ttyがNULLか見ればいけるかな?
0791login:Penguin03/11/20 21:17ID:F3gDXEit
現在のカーネル実行パスがカーネルスレッドによるものかどうかはどうやって分かりますか?
それとカーネルスレッドはcurrent->*でpidなどを取得したりはできないのでしょうか?
0792login:Penguin03/11/20 21:55ID:5PKfc9lP
current->mmがNULLかどうかで、kernel threadか判断できるはずです。
割り込みかどうかの判断であるin_interrput()関数と
合わせて御利用ください。

pidの取得も問題ないはずですが、current->tgidとcurrent->pidが
紛らわしいので注意してください。
0793login:Penguin03/11/20 23:46ID:F3gDXEit
>>792
swapperのmm==NULLでcloneのflags | CLONE_VMだからですね.ありがとうございます.
それとin_interruptは自分が注目しているコードの部分は例外や割り込みハンドラの部分ではないのですが,
それでも必要でしょうか?
tgidとpidが紛らわしいというのはどういう意味でしょうか?
>>790
789僕です.遅れましたが,ありがとうございました.
0794790,79203/11/21 00:46ID:uTRJrHVo
>>793
それなら、in_interrput()は使わなくてよいです。

2.6のgetpid()で取れるはtgidなのでtgidを使えば無難です。
今までのlinuxthreadsを使うとpid==tgidなんですが、
NPTLでは、何故かねじれてしまってpidがスレッドIDに
なっています。
0795login:Penguin03/11/22 05:27ID:Ra8noU1x
現在カーネル実行パスを実行しているプロセスの
ユーザ空間におけるスタックフレームをカーネル空間からバックトレースして,
それぞれのフレームにおけるリターンアドレスを調べていくことは可能ですか?
またcurrent->mm->start_stack以外にスタックに関する情報はないのでしょうか?
0796login:Penguin03/11/22 11:56ID:vL0kggqG
詳解Linuxカーネルってトップダウンで書いてあるので、
流れを理解するにはうってつけだけど、長々と文章で説明するより
図とかソースの方が分かりやすかったりする。好みだけど。

たしか、この本が出たときにいろいろ批判をしたスレがあったと
思うけどどこですか?
0797login:Penguin03/11/22 17:33ID:wN3p4lwg
>>795
それなら、ユーザー側のspを読んで追っかけたほうが簡単じゃないかと。
CPUに依存するけど。
0798login:Penguin03/11/23 04:45ID:eeQbYtxk
>>797
ユーザ側のspの値はcpuの制御回路によってカーネルスタックに退避されるんですよね?
みようとしている部分がシステムコールハンドラのret_from_sys_callのところからなんですが,arch/i386/kernel/entry.S(自分のマシンのアーキテクチャはx86です)によるとそのときのカーネルスタックのレイアウトは,
0(%esp) - %ebx
4(%esp) - %ecx
8(%esp) - %edx
C(%esp) - %esi
10(%esp) - %edi
14(%esp) - %ebp
18(%esp) - %eax
1C(%esp) - %ds
20(%esp) - %es
24(%esp) - orig_eax
28(%esp) - %eip
2C(%esp) - %cs
30(%esp) - %eflags
34(%esp) - %oldesp
38(%esp) - %oldss
となっていて,このoldespがユーザ側のspの値でしょうか?

ところで,スタックに格納されているデータがリターンアドレスかどうかを判別するにはどうすればいいのでしょうか?
スタックフレームごとの区別の仕方もよく分かりません.gccのソースコードとかを読んでみれば分かりますか?
0799login:Penguin03/11/23 04:48ID:eeQbYtxk
すいません.gcc->× gdb->○
080079503/11/23 20:21ID:DFb2kUzt
x86の場合はebp+4のアドレスにリターンアドレスがあるのでebpを元にして辿っていけばできそうです.
というかlinuxカーネルの話題とずれた質問してすいませんでした.
0801login:Penguin03/11/23 22:36ID:SyBc4qQv
>>798
どこに入るかもCPUによって違うので、必ずカーネルスタックに入っている保証はない。
ただ、コンテキストスイッチした時の値はthreadに入っているはず。

x86でret_from_syscallでみるならoldespでOK。
csも確認してring3に戻ることを確認したほうが良いかもしれない。

判別法は、アドレスが.textの領域に収まっているかどうか確認するのが一番簡単だと思う。
まじめに解析するならデバッグ情報をなめるしかないだろうね。

>>800
ebpは-fomit-frame-pointerされると使えないので注意。
0802login:Penguin03/11/24 01:42ID:zlJqppRI
>>801
ありがとうございます.
.textに収まっているかどうかというのは,
実行ファイルのコード+共有ライブラリのコード領域に収まっているかどうか
ということですよね?
実行ファイル中のコードはcurrent->mm->start_code,end_codeで参照できると思うのですが,
共有ライブラリの領域もまとめて収まっているかどうか確認する方法はあるのでしょうか?
それとも共有ライブラリのコード領域は別の方法で考慮する必要がありますか?
mmapの引数とかで.
■ このスレッドは過去ログ倉庫に格納されています