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

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

■ このスレッドは過去ログ倉庫に格納されています
0001login:Penguin01/10/02 17:44ID:38KkZsUQ
メモリ管理、プロセス、ファイルシステム色々ありますが
カーネル全般について語り合うスレッドです。
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の引数とかで.
0803login:Penguin03/11/26 22:35ID:OO1sXefq
>>802
shared libのロード位置はmm_struct追えばとれると思うけど、
やったことがないので、今一つ自信ない。

ld-linux.soから情報を渡してもらうのが一番確実だろうねえ。
0804login:Penguin03/12/02 02:21ID:Bf62dDgd
>>803
ありがとうございます.
current->mm->mmap->vm_start,vm_endを使えば,検査したリターンアドレスが動的にリンクされたライブラリのテキストセグメントに収まっているかどうか確認できそうです.
mmapで確保されるメモリリージョンが共有ライブラリのテキストセグメントかどうかはvm_flagsメンバが読みとり・実行可能かつ書き込み不可・プライベートなマッピングであるかどうかで識別するつもりです.
0805login:Penguin03/12/05 23:56ID:JanVmuB0
質問させてください。
休眠状態のプロセスの.textや.dataを読み出そうとしています。
実行中のプロセスであればts->mm->start_dataをget_user()でいけるのですが、
休眠中なのでうまくいかないのです。(tsはプロセスディスクリプタへのポインタのつもり)
adr=ts->mm->start_data;
として
ladr=pte_offset(pmd_offset(pgd_offset(ts->mm,adr),adr),adr);
で得られたladrからget_user()すればいいと思ったのですが0読み出す値は0ばかりです。
何が悪いのでしょうか?
0806login:Penguin03/12/07 13:04ID:8ZucmNpS
>>805
get_user()ってカレントプロセスを前提にしてなかったっけ?
手抜きな回答ですまぬが、
kernel/ptrace.cのaccess_process_vm()を参考にするよろし。
もっと言えば、デバッガがptrace経由でどうやって他のプロセスの
メモリをアクセスしているか見てください。
0807login:Penguin03/12/09 00:36ID:S+QZ9CO5
>>808
ありがとうございます。

とりあえず、ptrace_readdata()の動作を見てみようと思い、モジュールをでっち上げてみました。
しかしinsmod時にptrace_readdataのシンボル解決が出来ないと怒られます。
ちなみにptrace_readdataの行のみをコメントアウトするとinsmod/rmmodが成功します。
includeしてるのはlinux/sched.hとlinux/mm.hです。カーネルを作るときのオプションか何でしょうか?

ところで皆さんはモジュールをいじるような時は何を参考にしています?
やっぱりオライリーの2冊(詳解カーネルとデバドラ)?
ひたすらgrep?
0808login:Penguin03/12/09 00:47ID:KPHKA0Ux
>>807
EXPORT_SYMBOLされてないsymbolはモジュールからは見えないですよ
0809login:Penguin03/12/09 01:20ID:S+QZ9CO5
>>808
ぐぐってみました。
ビンゴのようです。
kernel/ptrace.hにEXPORT_SYMBOL(ptrace_readdata);という記述を加えてカーネルを再構築してみます。
0810103/12/17 15:08ID:krVj3++U
3
0811login:Penguin03/12/18 00:07ID:oQuTHDGh
カーネルの話なのでこちらにも書きます。

どうしても、コンパイルがうまく行きません。
どなたか、ご教授よろしくお願い致します。
TargetはSH4、Hostは、Linux7.2に組み込Linuxをインストールしてあります。
クロスコンパイル等の環境構築は終わっており、組み込みLinuxのカーネルコンパイルも
コンパイルも無事通ります。それなのに、ドライバをコンパイルすると次の
ようなエラーが出てしまいます。
{standard input}: Assembler messages:
{standard input}:4144: Error: unknown opcode
{standard input}:4235: Error: unknown opcode
{standard input}:5719: Error: unknown opcode
{standard input}:6018: Error: unknown opcode
{standard input}:6295: Error: unknown opcode
{standard input}:6693: Error: unknown opcode
{standard input}:6780: Error: unknown opcode
{standard input}:7053: Error: unknown opcode
{standard input}:7085: Error: unknown opcode
{standard input}:7103: Error: unknown opcode
{standard input}:7239: Error: unknown opcode
{standard input}:7725: Error: unknown opcode
{standard input}:8404: Error: unknown opcode
make: *** [linux_ud/sylx.o] Error 1
もちろん、ネットで検索はしました。
gcc,nm,ar,as,g++,gdb,ld,objcopy,objdump等に問題があるのでしょうか?
よろしくお願い致します。
0812login:Penguin03/12/18 00:09ID:MBnnQKSz
マルチは氏ね
0813login:Penguin03/12/18 00:13ID:3f1SJdSQ
>>811
sylxがナニモノかしらんが、インラインアセンブラでも使ってるんでねーの?
ソース見せれ。
0814login:Penguin03/12/18 00:19ID:hosf0Cpd
>>811
http://pc.2ch.net/test/read.cgi/linux/1063594836/130
0815login:Penguin03/12/18 00:57ID:wHzkPy4D
>>811
Linux7.2てのはRedHatLinux7.2って事?
この手の問題だったらホストとターゲットのカーネルのバージョンを明らかにすべき。
あとはgcc,binutils,newlib,glibcあたりも。

ドライバを作るってのは
make modules
ってやった時?それともどっかから落としてきたソースをコンパイルしてるの?

MakefileのCCをbfdnameにした?

情報不足で状況が掴めないです。
0816login:Penguin03/12/18 01:02ID:lp9NfDxY
>>815
マルチにレスすんな
0817login:Penguin03/12/18 01:11ID:wHzkPy4D
>>816
組み込みスレにもマルチしてますね。
ただ、このスレにはお世話になった(なってる)ので、ついレスしてしまいました。
大局的に見るとやっぱりスルーすべきなんでしょうか・・・
0818login:Penguin03/12/20 23:51ID:p8OBVrj+
ネットワーク関連のコードを読むのに良い解説サイトって無いですか?
カーネル詳説では全然解説してないし。
例えば Netfilter を読むとっかかりになるようなサイトとか。
NIC ドライバは作った事あるんですが、ドライバより上位の層について
知りたいです。
0819login:Penguin03/12/21 16:07ID:1QwJVAKL
>>818
冗談抜きでソースじゃないか?
0820login:Penguin03/12/21 16:12ID:u/cH/qKM
「ソース」は「解説サイト」じゃない、とか屁理屈を言ってみる。
両方の条件を満たしそうなのは http;//lxr.linux.no/source/ とか?
0821login:Penguin03/12/21 18:51ID:1QwJVAKL
>>820
http://lxr.linux.no/source/ か!
ナイス屁理屈
082281803/12/21 20:42ID:R8FN9n5S
やっぱ無いですかね。プロトコル毎に全然違うから一々説明できないって事かも
しれないですが・・・(あるいはいまさら TCP/IP の解説でもないだろって事かも)

がんばって読んでみます

0823login:Penguin03/12/21 21:11ID:1QwJVAKL
それならまずネットワークの本でしょ。
リチャードさんの本を読破しよう
0824login:Penguin03/12/22 18:23ID:jTZcEXDh
>>818
>>823の言うように"Guru of the Unix gurus"であるStevens先生の本を読むべき。
0825login:Penguin03/12/23 00:32ID:J48VmNLA
/procにオリジナルのエントリを作ってカーネルパラメータを読み出そうとしています.
出力するデータがもし4kBを越える場合,どのようにコーディングすればいいのでしょうか?
本を読んだり,ソースコードを眺めたりしたんですが,いまいちよく分かりませんでした.
proc_file_readを読むと,越えていても最後まで出力してくれそうな感じですが・・
どうかよろしくお願いします.
082682503/12/23 00:39ID:J48VmNLA
えーと,すいません.
「コーディング」というのはread_procの所です.
というか,proc_file_readでwhileループしているので,read_procではcount以下の読み込みを実装するだけでいいのでしょうか?
0827login:Penguin03/12/23 20:48ID:k2EKtndj
>>823-824
どっちかってゆーと、各プロトコルの実装の説明でなく、sk_buff の
各フィールドの使われ方とか Netfilter とかみたいな割とジェネリックな部分の
説明があればな、と。贅沢いってスンマソン


>>826
proc_file_read を読んだんだったら、それを信じて書けば動くよ。変な挙動だけど。

うろ覚えなので間違ってるかもだけど、普通に off を見て返す内容を決めても
いいっぽいんだけど、proc だとサイズベースで考えるのは面倒だから、
「何回目の呼び出しか」 を off で判断できるようにしてるっぽい。

*start に 1 を入れとくと、次は off が +1 されて呼ばれる (実際に返したバイト数
増えるのではなく) ので、こっちは off を見て返す内容を決めれば良い、と。
一回に返すサイズは count 以内にしておく事、と。
(実際には多少溢れても OK だけど、将来どうなるかわからんし)

多分そんな感じ。色々試せばわかると思う。 というか俺も proc_file_read() を見て
そう思ったから、正式な手順ではないかもしれないけど。
0828login:Penguin03/12/23 22:40ID:uwJyCcqD
>>825
kcoreあたりをパクるとか。

>>827
オライリーのカーネル本は?
skbのあたりは書いてあったはず。netfilterは無かったかも。
0829login:Penguin03/12/23 23:15ID:k2EKtndj
>>828
カーネル本はほとんどネット周りは書いてなくて、
ドライバ本は skb については 「ドライバ作者が見るべき所」 だけだから・・・
skb のフィールドって意外と増えたり減ったりしてるみたいだから
やっぱ自分で読むしかないんだろうとは思ってるんですけど。

ちなみに kcore は普通の read_proc の作り方とはちょっと違いますよ。
とはいえ、単にメモリのある領域をダンプしたいだけならあっちの方が楽そうです。
でもそれならキャラデバ書いたほうが楽かも?
0830login:Penguin03/12/24 03:43ID:CT6SNhsX
>>827,828
ありがとうございました.色々試してみます.
■ このスレッドは過去ログ倉庫に格納されています