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

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

■ このスレッドは過去ログ倉庫に格納されています
0001login:Penguin01/10/02 17:44ID:38KkZsUQ
メモリ管理、プロセス、ファイルシステム色々ありますが
カーネル全般について語り合うスレッドです。
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
ありがとうございました.色々試してみます.
0831login:Penguin03/12/30 00:01ID:j3HEXdDL
内部とかじゃなくカーネル設定で取捨選択ができる程度の知識を勉強できるとこってない?
0832ヽ(´ー`)ノ03/12/30 22:27ID:w1ByrpYn
>>831
付属のドキュメントじゃダメなん?
Documentation/* とか、{menu,x,g}config の時み見れるヘルプとか。
0833login:Penguin03/12/31 00:05ID:4ZezigAR
>>831
本であれば以下はどうか
Linuxカーネル設定ガイド
ttp://www.amazon.co.jp/exec/obidos/ASIN/4798100889
0834login:Penguin03/12/31 09:04ID:CE2m/NA+
>>833
ヨゴシの本なんか誰が買うか
0835login:Penguin04/01/07 01:47ID:EmIK8cJs
仮想メモリ(プロセス空間)の見積方法を調べています。

そもそも、仮想メモリ空間にマッピングされる領域には、
どのような領域があり、かつ、その領域の見積方法は
どうするのでしょうか?以下の領域を推測しています。

 ・OSカーネル
 ・ドライバ
 ・プログラムソース
 ・スタック
 ・ヒープ

この他にも、I/Oバッファや共有メモリ, ディスクキャッ
シュなども入るのでしょうか?



また、作成したプログラムのソースコード部分の領域の
大きさの見積方法はあるのでしょうか?(例えばC言語)

以上、よろしくお願いします。
0836login:Penguin04/01/07 22:21ID:x+u/tPyi
見積もりたいものが分かっていない悪寒。
分からん用語は使わずに何が知りたいかをくだ質スレに書け。
0837煽りイカ04/01/11 21:46ID:PPiKfNSH
先生、カーネルに付いて勉強しようと、ソースのプリントアウトを
始めたんですが、既にインクジェットのカートリッジを10個以上消費
しています。この戦いはいつまで続くんでしょうか?
プリントアウトした紙は、片っ端から製本業者に出しているので、
この出費もばかになりません。
0838login:Penguin04/01/11 22:09ID:26nuhaia
>>837
本当に紙のものが欲しいなら、すでに印刷して製本したものが書店で売ってあ
るから買えばいいですよ。でも紙で読むのはつらい。

lxr等のツールを使って眺めるとか--これも自前でやらなくてもlxrのサイトに
lxrかけたソースがおいてあるからwebブラウザで眺める--か、make tags(もし
くはTAGS)してviなりemacsで読むのがいいと思いますよ。

概要をつかむなら、まずディレクトリの構造を適当にながめたあと(or眺めつ
つ) init/main.c の start_kernel() から読み始めるのがいいと思います。
大変だけど、続ければ必ず読めるし、得るものは大きいから、がんばって。
0839login:Penguin04/01/12 17:15ID:lpS+N9kG
>>838
マジレスカヨ
0840login:Penguin04/01/13 01:07ID:odyLziqA
シェルについてですが なぜ シェルレベルがあるのですか
たとえば echo $SHLVL と打ちますと 2 とでたり
bash bashと続けて打てば 4となります
0841login:Penguin04/01/13 07:19ID:yowy6EM0
シェルレベルはカーネルと関係ない話なので、くだ質で再質問をお願いします。
# そのさい誘導されたことを付記してください。でないとマルチ呼ばわりされそう。
0842login:Penguin04/01/15 19:55ID:q7MiFnSU
2つ質問があります.

1:
カーネル側からroot権限であるデーモンプログラムかどうかのフックをする際に,
root権限である && setsidで制御端末から独立するのでcurrent->tty==NULL
という以外に条件はないでしょうか?
この条件だけだと端末からemacsを起動したときや,
デーモンプログラムから呼び出されたと思われるrmやchownなどもフックしてしまうようです.

2:
プロセスからあるデータへの参照をカウントしています.
その参照はコマンド名で対応づけられています.
カウント数が2の場合に,ps | grep [コマンド名]すると1つしかありません.
ん?と思って参照しているプロセスのコマンドラインをみてみると
(参照しているプロセスのpidは分かっています),
-:0
と表示されています.
これは一体どういう意味でしょうか?
pstreeコマンドでは「-:0」がちゃんとしたコマンド名で2つ表示されていました.
ちなみにそのコマンド名はwdm.binです.

よろしくお願いします.
084384204/01/15 19:57ID:q7MiFnSU
新規書き込みでsageてしまいました・・
0844login:Penguin04/01/15 22:13ID:mabMTQF9
1だけ
親がinitかどうか確認するとか。
daemon(3)使っていればinitが里親になるはず。
0845login:Penguin04/01/16 02:09ID:c7u8nyNC
>>844
ありがとうございます.
initにゾンビの始末をさせていたんでしたね.忘れてました.
emacsの方はsetsidを使って(emacsからforkしてemacsserverが実行されるまでの間),
しかもバックグラウンドで実行した場合initが親になるので無理なようです.
084684204/01/17 17:37ID:KaSlkRb2
2つ目の理由が一応分かりました.
psでは通常,コマンド名の表示に/proc/cmdlineを参照します.
ただし,-cオプション(本当のコマンド名を表示する)をつけたときはcurrent->commを参照するようです.
で,proc_pid_cmdlineやexecve周りを眺めたましたが,上書きされる様子がない.
manで調べてみるとどうやらsetproctitleという関数を使ってコマンドラインの上書きが可能なようです.
引数として渡す文字列の先頭に「-」をつけると,- は無視され,フォーマット後の文字列がそのままセットされるようで・・
けれども,今の自分の環境のglibcではsetproctitleに関する記述はないのが変だなと思いますが.
特にこれ以上突っ込んでも自分の実装と関係ないので,放っておくことにします.
0847login:Penguin04/01/18 02:11ID:+zT3hNOG
プロセス切り替え時の動作なんですが、

・CPUにタイマ割り込みがかかる
・割り込みハンドラに処理が移る
・プログラムカウンタをそのプロセスのカーネルスタックにpush
・汎用レジスタの内容をプロセスディスクリプタのthreadに保存
・schedule()で次に処理するプロセス選択
・次に処理するプロセスのプロセスディスクリプタのthreadから汎用レジスタにロード
・次に処理するプロセスのカーネルスタックからPCにpop
・ジャンプ

という理解でいいのでしょうか?(自主的にCPUを放す場合は別として)

ということは、ほかのプロセスのカーネルスタックの一番上の中身を書き換えると、
違うところから実行が再開される?
0848login:Penguin04/01/18 14:35ID:EgN885Nx
>>847
> ということは、ほかのプロセスのカーネルスタックの一番上の中身を書き換えると、
> 違うところから実行が再開される?
signalの挙動がそうです。
0849login:Penguin04/01/23 09:07ID:R+JbGtsc
>>848
おお〜!なるほど
0850login:Penguin04/01/25 16:35ID:8CJ3FK3q
Linuxカーネルに新しい機能を付けて拡張するカーネルパッチを公開する場合,
ライセンスはGPLに従うと思うのですが,基本的には拡張するカーネルのバージョン
についているCOPYINGをそのまま持ってきてREADMEか何かで
「このソフトウェアはGPLでライセンスされています.詳しくはCOPYINGを読んでください」
と書くだけでよいのでしょうか?
0851login:Penguin04/01/25 19:58ID:B5VoqxYA
>>850
GPL の最後読んだ?
0852login:Penguin04/01/25 21:16ID:STnhf9z3
>>851
すいません.今読みました.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

これをソースコードの冒頭につければいいんですね.
で「a copy of the GNU General Public License」がCOPYINGファイルになると思うのですが,
Linuxカーネルの方はCOPYINGのGPLの記述の最初にLinusさんの注意書きのようなものが付いていますよね?
このCOPYINGをそのまま使っていいんでしょうか?
0853login:Penguin04/02/03 12:14ID:w95WYYei
ゾンビプロセスに関して質問です。

現在サーバを起動しているとメモリをどんどん減っていくという問題で困っています。
(もちろんfreeコマンドでキャッシュを差し引いたところを見ています)

メモリが圧迫された状況でも、topコマンドから消費メモリ順に並べても、
特にメモリを食っているプロセスはありません。

気になるのはゾンビプロセスが発生していることです。

>>842-845 にあるように
ゾンビは最終的にはinitに吸収されると思うのですが、
その際psやtopで見たinitの使用メモリは増大していくのでしょうか?

原因を特定できずに困っています。
現在は毎日再起動してなんとか運用中です。
0854login:Penguin04/02/03 12:55ID:5ayoX5Ue
>>853
ゾンビを生んでる人を見つけて退治する。
毎日核落としてたんじゃバタリアンの中の人もかわいそう。
0855login:Penguin04/02/03 13:05ID:dnjnuywS
>>853
そのゾンビプロセスが何のプロセスかわからないと何とも言えない
0856login:Penguin04/02/03 15:54ID:w95WYYei
>>854-855 レスありがとうございます
postfix->local(Postfixのローカル配送プロセス)->procmail->bashスクリプト
と起動されており、
procmailから下がゾンビになってます。

まずはこのゾンビがメモリ圧迫の原因かどうか確かめたいのです。

ちなみにinitのメモリ使用量は増加してません。
純粋に空きメモリだけが減っていきます。

このようにゾンビが起きることでメモリを減らすということはあり得るのでしょうか?
もしあり得るとしたら、ローカルユーザは簡単にサーバを落とせてしまうことになってしまいませんか?
0857login:Penguin04/02/03 16:14ID:5ayoX5Ue
>>856
じゃあprocmailを殺す
ありうるし落とせるよ
だから殺す
0858login:Penguin04/02/03 17:29ID:qJjZfJxc
>>853
>>842-845は孤児の話だ。
親が骨を拾ってあげないからゾンビになる。
ということで親ごと殺さないとダメかも。

と書いていて思ったが、現実世界に当てはめたらとんでもねー表現だな。
0859login:Penguin04/02/03 18:31ID:bGaWcOzS
>>858
その親には問題がありそうだね。
0860login:Penguin04/02/03 18:42ID:u8zu6V/I
>>858
ちゃんと面倒見ない親を探して対処しないとな。

ていうか、孤児はinitが引き取るから、
引き取った後ならいい人のinitを殺す話になってしまう(藁
0861login:Penguin04/02/03 20:59ID:NOAqHG+F
ゾンビはリターンコードしか必要なデータは持ってないから、
メモリはあまり食わないはず。
だいたいpsで見れば分かるじゃん。
086285304/02/03 21:22ID:w95WYYei
みなさんレスどうもです。

psで見るとこんな感じになってます。
926 16119 0.0 0.0 0 0 ? Z 22:24 0:00 [sed <defunct>]

しかしいつまでもゾンビが残るわけではなく、
ちょっと立つと自然に消えていきます。

自然に消えるゾンビなら気にしなくても良いのでしょうか?
それともゾンビが出ること自体がまずいのでしょうか?
0863login:Penguin04/02/03 21:35ID:iQ6XyeXR
子供をほっとくなんて。
親の顔が見たい。
0864login:Penguin04/02/03 21:59ID:qJjZfJxc
>>862
消えるなら、親の面倒見が悪いだけだろう。
気にするな。
0865login:Penguin04/02/03 22:07ID:5ayoX5Ue
>>861
死んだら出席簿から名前が消されるのに
ゾンビちゃんは出席簿に名前が残ったままだよ。
机は持ってかれるかもしれないけどさ。
0866login:Penguin04/02/09 23:34ID:APi7kHwb
 LKMでファイル操作をしようと open,write,closeあたりの
関数を使ってみましたが、insmod で組み込むと
hook_uname.o: unresolved symbol open
hook_uname.o: unresolved symbol close
hook_uname.o: unresolved symbol write
とエラーになってしまいます。
 でもstrncpyみたいなライブラリが必要そうな関数は問題なく
試用できるのがよくわかりません。
 適切な資料がわからずみようみまねで書いているのですが、
LKMから呼び出せる関数のリストのようなものはありませんか?
 またはこれらopenなどの関数を呼び出すためのコンパイル
オプションなどがありますか?

 現状、次の記事を参考にプログラムを組んでいます。
http://www.atmarkit.co.jp/fsecurity/rensai/rootkit03/rootkit02.html
 記事の書いてあるところまでは、そのままやってうまくいきました。
 この hook_uname.c を改造しています。
 linuxのkernelバージョンは 2.4.19です。
0867login:Penguin04/02/10 00:13ID:0xm4A1oM
>>866
標準ライブラリは使えまへん。
strncpyは親切な人が同じものを用意してくれているから。
モジュールから呼べるのはEXPORT_SYMBOLで宣言されてる。

まじめにやるなら馬本嫁。
086886604/02/10 01:48ID:LKCK7qEy
>>867 アドバイスありがとうございます。
 EXPORT_SYMBOLでgrepしてみたら、i386_ksyms.cに記述されているのを
見つけました。
 strncpyなどは、特別にここで用意されていたに過ぎないのですね。
 馬本は、オライリーの「LINUXデバイスドライバ 第2版」のことでいいですか?
 ちょっと高いですが買って勉強します。
0869login:Penguin04/02/11 22:12ID:A4Mg4/pd
>>866
ライブラリ関数の使えないカーネル内でもシステムコールは使えますよ.
_syscall0とかのマクロを使うか,sys_openなど直接呼び出したりはできると思います.
0870login:Penguin04/02/12 13:38ID:8sD0wTgv
>>869
syscallマクロは、システムコールに再入してまうのであまりよろしくありまへん。
カーネルスレッド使えば問題ないけど。

そもそも、モジュールの中でファイル開いてごりごりやるのはどうかと思いますな。
0871login:Penguin04/02/15 18:11ID:UtEM83EN
>>870
rootkitのwebページを参照にしているようでしたので,「どうかと思う」ことを敢えてやりたいのかなと.

>>866
カーネル内でファイル入出力をするなら,sys_acct辺りが参考になるんじゃないでしょうか.
087286604/02/19 04:01ID:3kajdZP1
 すみません。まだ本買っていないです。
 とりあえずいろいろ試してみましたので経過報告です。

(1) _syscall2マクロを使ってみました。
 こんな感じでいのでしょうか。
_syscall2( int , open , const char *,pathname, int ,flags);

 コンパイルすると次のようなエラーになるので、
(上記のマクロは24行目にあります。)
$ gcc -c hook_uname.c
hook_uname.c: In function `open':
hook_uname.c:24: `errno' undeclared (first use in this function)
hook_uname.c:24: (Each undeclared identifier is reported only once
hook_uname.c:24: for each function it appears in.)

 errno.hをインクルードしてみましたが、
#include <errno.h>

 モジュールを組み込むにエラーになってしまいました。
#insmod -f hook_uname.o
hook_uname.o: unresolved symbol errno

(続く)
087386604/02/19 04:01ID:3kajdZP1
(2) sys_openを使ってみました。
fd = func_sys_open("/tmp/hook_uname.txt",O_APPEND | O_CREAT );

 コンパイルは成功しましたが、モジュールを組み込むにエラーにになってしまいました。
#insmod -f hook_uname.o
hook_uname.o: unresolved symbol sys_open

(3) sys_call_tableのアドレスを呼び出してみました
int (*func_sys_open)(const char *pathname, int flags);
func_sys_open = sys_call_table[SYS_open];
fd = func_sys_open("/tmp/hook_uname.txt",O_APPEND | O_CREAT );

 コンパイル、insmodとも成功しましたが、実行すると
func_sys_openの呼び出し中に失敗し -9 が返ってきました。

 やっぱりカーネル内からの呼び出しはだめですか。

 とりあえずファイル操作をやってみているのは、分かりやすい結果が得られた方が
面白いかなというのが主な理由でした。
 また linux-users MLの話題で、unlink をフックしてその中で、ファイルのバック
アップをとりたいという話題([linux-users:101834])があり、面白そうなテーマだと
思って手を出してみました。
 sys_acct(の実装?)等参考に調べてみます。
0874login:Penguin04/02/19 22:09ID:1aYGSfnX
>>872-873
#define __KERNEL_SYSCALLS__
#include <asm/unistd.h>

int hogehoge(void)
{
 int fd;
 fd=open("hoge",O_RDONLY,0);
}

at 2.4.x
試してないけど。
0875login:Penguin04/02/24 04:25ID:OerDcbnD
>>872
#include <errno.h>
だとライブラリ関数のヘッダファイルをインクルードします.
#include <linux/errno.h>
で/usr/src/linux/include/linux/errno.hをインクルードしてみてください.
>>873
sys_openをモジュールの冒頭でextern宣言してもだめですか?
それと単純にカーネルでファイル操作をしたいのなら,ファイルディスクリプタを返す必要はありません.
acctシステムコールにヒントがあります.

#まずは本を読んで知識を得ることが先決だと思います.
0876login:Penguin04/02/24 13:30ID:bvymi53U
>>875
sys_openはEXPORT_SYMBOLされていない罠。
armあたりは見える様になってるな。メンテナの趣味かな。

#素直にドライバにしてread/write経由でやりとりした方が素直だと激しく思う。
0877login:Penguin04/02/27 12:06ID:POIJFvcG
システムコールsys_execve()で、あるプログラムの
実行が始まるわけですが、ld-linux.soというのは
カーネルのどの部分でロードされるのでしょうか。

straceで観察するとlibc.soをロードするシステムコールは
発行されていますが、ld-linux.soに対してはありません。
これというのはカーネルがロードしていると考えていいわけですよね。
その後、ld-linux.soがlibc.soをロードする。
0878login:Penguin04/02/27 12:51ID:e6K8vpAQ
ld-linux.so.2 は ELFヘッダで指定されています。
なのでロードしているのは ELF の処理部分ではないかと(fs/binfmt_elf.c とか)。
0879login:Penguin04/02/27 14:10ID:vM/yZAhI
>>877
fs/binfmt_elf.c:load_elf_interp
んでld-linux.soが参照している共有ライブラリを読んでくると。

興味があるならLinkers&Loadersかttp://ukai.jp/debuan/2002w/elf.txtを読むと
もっと詳しく書いてある。
0880login:Penguin04/02/27 21:12ID:vdlMtlwT
Linuxカーネルを読もうと思っているのですが、ソースを食って仕様書
を吐いてくれるツールとか、ソースを可視化するようなツールがあれば
良いなぁと思い探しています。

今のところ以下のようなツールをみつけました。

global
ttp://www.gnu.org/software/global/

SourceNavigator
ttp://sourcenav.sourceforge.net/


他にも何か良いツールを知っている方がおられましたら
教えてください。
0881login:Penguin04/02/27 22:01ID:/BhsszhI
>>880 lxrは?
0882login:Penguin04/02/27 22:02ID:PSE6rHdE
>>880
Doxygenは?
http://www.fides.dti.ne.jp/~oka-t/doxygen.html
088388004/02/27 22:11ID:vdlMtlwT
Doxygenはよさそうだね。

新たなツールを発見したので紹介します。

Sapid
ttp://www.sapid.org/index-ja.html

かなり期待できそうですが使い方がいまいちわかりません。
使っている人がいたら使用感を教えてください。
0884????A?L?A?N?e?N?A04/02/27 22:13ID:V05PQgy9
UNIX カーネルはあッ、strategie しか知らずに済むのでしょう。けど、Linux は知らないよ。
0885login:Penguin04/02/27 23:33ID:vM/yZAhI
>>882
それように書かれていないので、あんまし面白くない。
0886login:Penguin04/02/27 23:49ID:xaaJLb2z
プリエンプトカーネルってなんでつか?
カーネル実行中にコンテキストスイッチがおこってユーザープロセスが動き出すってことですか?
0887login:Penguin04/02/28 00:00ID:A3wPssc7
>>886
http://www.atmarkit.co.jp/flinux/special/kernel25/kernel25b.html
088888604/02/28 00:16ID:xSTzzvuP
ありがとうございます
@IT読んでなんだかわかったような気分になれました。
0889login:Penguin04/02/28 14:09ID:J2FeZbHS
VFSの詳しい日本語解説をしているページを教えなさい
0890Linuxカーネルの仕組み04/02/28 19:39ID:bMmaH5z2
カーネルの中にLinusの小人が101人ほど入ってます。
彼らがガンガッテいるのでLinuxは動いているのです。

以上。
0891login:Penguin04/02/28 20:38ID:WjxTg2dV
bogomips 101っていったら
CPUはなんだろ
0892login:Penguin04/02/28 21:02ID:u/+Sj8Sq
>>891
http://www.linux.or.jp/JF/JFdocs/BogoMips/

PentiumとPentiumMMXでずいぶん違うな。
0893sage04/03/14 02:28ID:g+4Nnj/K
ソースを眺めていたらなんかLINUXの仕組みが分かってきたぞ。
意外と理解できるものなんだね。ちょい感動。
0894login:Penguin04/03/17 13:15ID:a5f2rjZp
Linuxの「現在使用中の」メモリの読み方について教えてください。

freeの表示にある-/+ buffers/cache: のusedの数値は、
man freeには「使用中のメモリからバッファメモリを引いた値」とあるのですが、
だとすると
/proc/meminfo にある
Active: の欄はどういう意味でしょうか?

私の使用しているLinuxでは、freeでみると、-/+ buffers/cache の usedは、常時100MBを
下回らないほど大きく、自分ではちょっとおかしい気がします。

/proc/meminfoのActiveの数値は20〜30MBで、
現在動かしているプロセスのメモリ使用量(topやpsコマンドで確認)から考えるに
その数値は正しいのではないかと思います。

Linuxのメモリ使用量は、どのように読めば良いのでしょうか。
0895login:Penguin04/03/17 13:33ID:a+ywf6ub
>>894
> 現在動かしているプロセスのメモリ使用量(topやpsコマンドで確認)から考えるに
どう計算したの?
089689404/03/17 14:23ID:a5f2rjZp
すいません、色々調べなおしてたら、余計にこんがらがりだしまつた、、

>895さん
ps -xl --sort -vsize
で、VSZを目算で足してました。が、これも実際にawk使って
足してみたら、freeの数値ともActiveの数値とも大きく異なっていました。

そもそもpsのSZとVSZの違いからしてわかってないので、そっちを先に調べることにしまつ、、

とりあえず、manからアタックはしてるのですが、
man proc も、 man ps も、 man free も、「そもそもメモリを理解してる人が
読むもの」な気がします。

どなたか「馬鹿野郎、ここ嫁!」っていうヒントがあったら教えてください。
■ このスレッドは過去ログ倉庫に格納されています