お前ら*BSDのカーネルをハックしますか?

1見習デーモン
垢版 |
NGNG
これからsys/kern/init_main.c読んでみます。

【参考】
・「The Design and Implementation of the 4.4BSD Operating System」
 の第2章
http://www.freebsd.org/doc/en_US.ISO8859-1/books/design-44bsd/index.html

・*BSDでのアセンブリ
http://www.int80h.org/bsdasm/

なんか検索してみてもあんまりハックサイトひっかからないね。
Linuxより伝統あるはずなのに。
126T大理系
垢版 |
NGNG
みんな理系?
凄いです
尊敬します
NGNG
>>125
そういう具体的な目標があるのなら、カーネルに拘らずに最初から
ネット周りのプログラムをハクした方がいいと思われ。

カーネル書ける奴はスゴイが、カーネル書ける奴だけがスゴイわけじゃない。
NGNG
俺的にはドライバをバリバリ書き捲くってるような人が
プログラマとして尊敬に値すると思ってる。
カーネルはどっちかって言うと設計するものって感じだしねぇ。
NGNG
>>128
実務家っぽい御意見…
NGNG
人に訊いてからじゃないと始められない奴は結局何もできない。
hackなんてのは気づいたらやっているか、やらないと夜が明けないかのどちらかだ。
NGNG
>>125
ネットゲーのサーバとかのように、非同期に発生する大量の要求を
うまく捌かなければならないプログラムを書くのは、
カーネルを書くのと似たようなセンスが必要な気がする。
# RDBMSとかもそうだな。

こういうシステムをうまく設計できる奴は
非常に使えるね。
NGNG
>>130 がいいこと言った。
133学生
垢版 |
NGNG
みなさんどうもありがとう
ところでみなさん理系ですか?
もしくはコンピュータで飯を食っている人達ですか?
NGNG
>>133
理系かそうでないかなんてどうでもいいことだ。
とりあえずやってみろ

>>130
どっかで聞いた気がするが、イイね
NGNG
>>133
俺も学生。経営情報学科というとこにいる。
理系だか文系だかわからん。
NGNG
あーあ
カーネルいじって遊んでたら
もー朝だよ...
寝よーっと。
NGNG
カーネル・ハッカースおじさんのAAキボンヌ
NGNG
hack より fuck だと最近痛感 おっかけさぼりすぎで make world 不能状態
13926=52=.....
垢版 |
NGNG
某誌のネタにしますた。
140名無しさん@お腹いっぱい。
垢版 |
NGNG
保守age
NGNG
見習いデーモンは死んだのか?
142名無しさん@お腹いっぱい。
垢版 |
NGNG


たか、いらっしゃい
        ま
        せ
        ん
        か
        ?
NGNG
誰かハックしてる人いますかー。


BSDのkernel読み始めるとしたら、手をつけるところは
どこがおすすめですかねぇ
NGNG
>>143
過去ログ
NGNG
>>143
current の SMPng
146名無しさん@お腹いっぱい。
垢版 |
NGNG
>>143
まぁ、過去ログにもいろいろあるけど、手足から見て行くのがいいと思うね。
デバイスドライバ、ファイルフォーマット毎のプロセス実行サブシステム(imgact_*)、
簡単なファイルシステム、低水準の初期化部あたりは割とコンパクトに
まとまってて読みやすいんじゃないの?

>>145

ほぅ。じゃぁ、具体的に何処のファイルがSMPngに関係してるのか言ってみ。
PERFORCEのリポジトリは見てるんだろうね。
NGNG
>>146 の後半
ネタにマジレスカコワルイ
NGNG
>>146
FreeBSD以外の*BSDってperforce使っているんですか?

FreeBSDのperforce treeってanonymousでソースを取れるんでしょうか?
できるんなら見てみたいと思っています。
149名無しさん@お腹いっぱい。
垢版 |
NGNG
>>148 他の*BSDでは使ってないです。
でもSMPngっていったらFreeBSDでしょ。
リポジトリのブラウズならここでどうぞ。
http://people.freebsd.org/~peter/p4db/
手元に置きたければ
http://people.freebsd.org/~peter/p4cookbook.txt
に取り方が書いてある。
150名無しさん@お腹いっぱい。
垢版 |
NGNG
FreeBSDのブートについて質問させてください。

sys/boot/common/load_elf.c を読んでるんですが、
/kernelのエントリアドレス(当方では0xc012b130)に0xff000000をマスクして
符号反転してオフセット(off)を0x40000000にしている意味がわからないです。
コメントの「i386 relocates after locore」っていうのも呪文ですし…

で、結局/kernelのプログラムヘッダの仮想アドレス(当方では0xc0100000)と
さっきのoffを加算して桁あふれさせて0x100000にして、
最終的にはこのアドレスに/kernelをロードしてるようなんですが、
なんかえらくまわりくどくないですか?私の読みが浅いだけでしょうか。
NGNG
>>150

sys/boot/common/load_elf.c
> off = - (off & 0xff000000u); /* i386 relocates after locore */

offの最上位の1バイトをクリアするだけだと。
e.g. 0xc012b130 -> 0x0012b130

>/* i386 relocates after locore */

boot2内で/kernelを16MB以下のリニアアドレス(0x00100000-)へ展開しておき、
locore.sにおいて適切なアドレス(0xc0100000-)へmapするのだと思われます。
(locore.s内でページングをenableにしている)

#ざっと眺めただけなので保証はしませんが :-p
NGNG
良サイト宣伝中〜〜。

http://www.interone.jp/~game-k/

注)私はサイト関係者とは無関係ですよ。
NGNG
>>152
BSD カーネルのハックに関する良サイトかと思って見に行っちゃったよ :-)
NGNG
アドレスの最後の方のgameがgmakeに見えて、見に行っちゃったよ。。
155名無しさん@お腹いっぱい。
垢版 |
NGNG
>>151
その通り。なぜ、&= ~(0xff000000)じゃないのかよう分からんけど。
で、じゃあ何故ELFヘッダの開始番地が0x100XXXなんかじゃ無くて
0xc01000XXになってるかっていうと、paging開始後はカーネル仮想メモリ
アドレスは全て0xc0000000以降になっていて、 カーネルで使用している
メモリアドレスは全てそこにマップされるから。(リンカとELFフォーマット
の機能を使えばそういう状況にも実は対応できたりするような気もするけど)
特にkernelとISAメモリ空間は(物理アドレス+0xc0000000)の位置にマップされます。
locore.sでページングを開始するまでに絶対アドレッシングが必要な
時は
#define R(foo) ((foo)-KERNBASE)
定義されるマクロを使ってアクセスしてます。
156150
垢版 |
NGNG
>>151, >>155

お二人のレスを見ると自分がはずしまくってるのかニアミスなのか
すげぇ悩みます。
load_elf.cに↓のようにコード追加して

--
228行目あたり
if (kernel) {
printf("before [%p]\n", (void *)off); ←これを追加
#ifdef __i386__
off = - (off & 0xff000000u); /* i386 relocates after locore */
printf("after [%p]\n", (void *)off); ←これを追加
--

# make
# make install

として祭起動すると

before [0xc012b130]
after [0x40000000]

となるんで、あぁそうかと思ってたんですけど、お二人は
最上位の1バイトをクリアしてるとおっしゃてますし。
でも/kernelを0x100000へマップするのはあってるんですよね?
NGNG
>>156
> off = - (off & 0xff000000u); /* i386 relocates after locore */

スマソ。コードを読み違えました。
off -= (off & 0xff000000u);
だったら最上位バイトのクリアですね。
158150
垢版 |
NGNG
>>157
まぁ「保証はしない」っておっしゃってましたしね =)

さてすっきりしたところでつぎはbtx.sでものぞいてみますか…
159名無しさん@お腹いっぱい。
垢版 |
NGNG
せっかくだから俺は、ed0からtcpパケットがユーザランドまで行くまでを追って見るぜ
edintr-> ed_rint(dev/ed/if_ed.c)-> ether_input
->ether_demux(net/if_ethersubr.c)->(queueへ)
(queueからnetisrで)->ipintr->ip_input(netinet/ip_input.c)->
tcp_input->(順序を組み立てる為のqueueへ?)
ぐらいまで読めましたが、そっからどうなってるのかわかりますか?
NGNG
上から来るぞ! 気をつけろ!
TCP は置いといてとりあえず UDP 追ってみては?
161名無しさん@お腹いっぱい。
垢版 |
NGNG
おい、>>160,見習いデーモン,生きてるか?
udpの場合ip_inputの後
udp_input@udp_usrreqで配送先のプロセスを探して、sowakeupで起こす
そうすると、sbwait()で待ってた
soreceive()(uipc_socket.c)->recvit()でcopyoutされ、
recvitからはrecvfromに戻ってシステムコール完了と言った感じですか。
162名無しさん@お腹いっぱい。
垢版 |
NGNG
ここなかなか良さそう。ただしSimplified Chinese。
http://opensource.zjonline.com.cn/
163150
垢版 |
NGNG
おはようございます。
PICの解説で参考になるページ見つけたんで貼っておきます。
http://www.asahi-net.or.jp/~WR7S-NKMR/BeOS/Documents/IRQ.html
http://www.cqpub.co.jp/column/books/2001a/34331PC_Legacy/default.htm

で、また質問させてください。
sys/boot/i386/btx/btx/btx.s を読んでるんですが、
220行目あたりの「Launch user task」からがサッパリわかりません。

TSSの働きとタスク切替えがよく理解できてないからだと思うんですが、
248行目のiret命令で何が起こるのかわかりません。
(コメントには「To user mode」って書いてあるんですが…)

iretでタスクを切替える場合はフラグレジスタにNTビットがセットされて
なければならない、とインテルのマニュアルにも「はじめて読む486」にも
書いてあるんですが、248行目に到達するまでにNTビットがセットされたような
様子もないんですが…

何かヒントだけでもお願いします。

164名無しさん@お腹いっぱい。
垢版 |
NGNG
基本的にはbtxではタスク切替え使ってない筈。(そんな豪勢なことする
ほどのサイズも無いし)単純に、EFLAGSもPOPすることで、
特権を切替えてbtx_hdrにあるモニタルーチンのエントリーへ
飛んでるだけのことと思う。
NGNG
>>163
この場合はTSSは関係ないですね。(V86用に使うだけ)
割り込みが起こったことにしてiretしているだけです。
166150=163
垢版 |
NGNG
レスどうもです。

はやとちりしてました。iretはタスク切替えだけで使うものではなかったんですね。
インテルのマニュアルの命令リファレンスで確認しました。

でも、pushしておいたEIP(btx_hdr+0xc)がiretで特権を切替えたあと
実行される番地みたいですけど、btx_hdr+0xcって

btx_hdr: .byte 0xeb # Machine ID
.byte 0xe # Header size
.ascii "BTX" # Magic
.byte 0x1 # Major version
.byte 0x1 # Minor version
.byte BTX_FLAGS # Flags
.word PAG_CNT-MEM_ORG>>0xc # Paging control
.word break-start # Text size
.long 0x0 # Entry address ←ここですか?

特権を切替えて、また同じコードを辿ってくってこと???
NGNG
>>166
>でも、pushしておいたEIP(btx_hdr+0xc)がiretで特権を切替えたあと
>実行される番地みたいですけど

>pushl btx_hdr+0xc# Set EIP

これは間接参照でbtx_hdr+0xc番地の内容(long)をpushするという意味です。
# operandに'$'が付いていないことに留意。
168150
垢版 |
NGNG
>>これは間接参照でbtx_hdr+0xc番地の内容(long)をpushするという意味です。
にしても、特権切替えたあとはどのコードが走るのか全然わからないです。
EIPが0x0なんですよね?0x0番地のコードって…?
NGNG
実際のバイナリをhexdumpしないとダメっすよ。ローダがいじるに決まってるでしょ。
/boot/boot2より

00000200 eb 0e 42 54 58 01 01 80 f6 0f 80 07 00 10 00 00 |..BTX...........|

<eb> btx_hdr: . byte 0xeb
<0e> . byte 0xe
<42 54 58 > . ascii "BTX"
<01> .byte 0x1
<01> . byte 0x1
<80> .byte BTX_FLAGS
<f6 0f> .word PAG_CNT-MEM_ORG>>0xc
<80 07> .word break-start
<00 10 00 00> .long 0x00001000
簡単にするならコメントを信じて次のbtxクライアント(boot2又は/boot/loader本体)
へ進めってことです。ちなみに/boot/loaderは更にbtxldrが走ったりするっす。
170名無しさん@お腹いっぱい。
垢版 |
NGNG
>>実際のバイナリをhexdumpしないとダメっすよ。ローダがいじるに決まってるでしょ。

おぉ、盲点でした。
こういうのはMakefileを丁寧に追っていけばわかることですか?
今ちらっとsys/boot/i386/boot2/Makefileを見たら
ORG2に代入された0x1000がbtxldコマンドのオプションとかに使われてて
「ほうほう」と思ってたんですけど。

ソースにとらわれすぎて本質を見失ってました。
でも>>169さんのおかげでまた少し前進できそうです。ありがとうございました。
171150=170
垢版 |
NGNG
sage忘れ欝だ死のう…
172名無しさん@お腹いっぱい。
垢版 |
NGNG
sageなくても良いんじゃない?

まぁ、強いていえば「特殊なローダを必要とする」「0x0なんて番地に飛ぼうとする」
という2点から勘を働かせた結果かな。
173見習デーモンへ
垢版 |
NGNG
スレ キトク スグカエレ

           〜ハハヨリ〜
NGNG
>>173
知らなかったのか?見習いデーモンは
半年前に勇者に殺されたんだぞ。
175名無しさん@お腹いっぱい。
垢版 |
NGNG
もし!毒蛇に噛まれたら、
切り口を素早くナイフでえぐり、
急いで口で吸え!

ほら、言ってみろ!!
NGNG
虫歯がある時にそれやったら死んでしまう罠。
177名無しさん@お腹いっぱい。
垢版 |
NGNG
ごめんなさい
クックロビンを殺したのは私です。。。。
178名無しさん@お腹いっぱい。
垢版 |
NGNG
boot0.sコードので分らない部分があるのですが、
61 movw $LOAD,%sp # stack

66 movw %sp,%si # Source
67 movw $start,%di # Destination
68 movw $0x100,%cx # Word count
69 rep # Relocate
70 movsw # code
この部分は、MBRを再配置するコードだと考えているのですが、
アドレスLOAD(0x7c00)からの512バイトの領域を、現在実行して
いるstartで表されるアドレスからの512バイトの領域にコピーする
という意味なのでしょうか?
NGNG
>>178
MBRが読み込み・実行される際のセレクタの値
引用してるコードの上の方で設定してるセレクタの値
セレクタとオフセットから得られる実効アドレス
について調べましょう。

# 個人的には、今さらIA32の16bitモードについて勉強しても
# 得る物はあまり多くない気がする。
NGNG
むしょうにデバイスドライバを書いてみたくなって、
http://www.jp.freebsd.org/www.FreeBSD.org/doc/en_US.ISO8859-1/books/developers-handbook/x10069.html
↑やってみたらすげー簡単でびっくりしました。

秋月のLCDキットとかをシリアルかなんかでつなげて、
echo "Hello" > /dev/mylcd
とかできるようになりたいんですけど、あとは↓
http://www.daemonnews.org/200010/blueprints.html
とか読んどけばできるようになりますか?

実際のドライバってどんななんだろうと思って/sys/dev/fxp/if_fxp.c
なんかのぞいてみて頭から煙だしたりしてます…
NGNG
おまえの見てるのデバドラのつくり方じゃねぇじゃん。(藁
NGNG
うお、もしかして空回りですか…

でもKLDでカーネル領域に自分のコード置けるとおもうとワクワクするんですが
NGNG
カーネルを再構築しても自分のコードは置けますが何か?
184名無しさん@お腹いっぱい。
垢版 |
NGNG
>>181
ハンドブックで解説されている部分は部分はデバイスドライバ
(ツリーを形成する実デバイスを叩くもの)ではデフォルトで呼ばれる
ものがあるので気にしなくていいです。

おまいさんの目的ではどう見てもfxpを見るのは間違いだと
思いますし、そもそもシリアルならsio使ってtermios
叩いたほうが.......
で、ご希望にそえるものなら例えば、spic(4)あたり簡単そうかな?



NGNG
spic は デバイスの仕様が不明なので、
読んでもあまりピンとこないのでは。
186鬼軍曹
垢版 |
NGNG
============ お知らせ ==================

あー、只今よりこのスレは、見習デーモンの学習を見張るスレになりました。

====================================
187名無しさん@お腹いっぱい。
垢版 |
NGNG
保守
188名無しさん@お腹いっぱい。
垢版 |
NGNG
NETBSD入れたらまずカーネルハックするぞぉ!
NGNG
おまえのいうハックってカーネルの再構築のことだろ?ぷ
NGNG
千里の道も一歩から
NGNG
千里の道を一歩だけ
NGNG
千里を歩き通すのは大変だよ……。
NGNG
千里ちゃんって誰?
NGNG
http://homepage3.nifty.com/senri/
195193
垢版 |
NGNG
>>194
そんなの僕の千里ちゃんじゃないやい。
NGNG
>>193
千里中央に行くには新御堂筋に一歩踏み出せばあとは
北上するだけで着くので解りやすいと言う諺だよ。
NGNG
>>196
それはちとローカルではないかと。
NGNG
なかおくんだろ?
199山崎渉
垢版 |
NGNG
(^^)
200山崎渉
垢版 |
NGNG
(^^)
NGNG
>>194
大江千里も随分としけたもんだね。オフィシャルサイトが
niftyとは。。。
202山崎渉
垢版 |
NGNG
(^^)オレダッテ タマニハ マジデ ホシュ スルyo!!
203山崎渉
垢版 |
NGNG
(^^)
204あぼーん
垢版 |
NGNG
あぼーん
205あぼーん
垢版 |
NGNG
あぼーん
206名無しさん
垢版 |
NGNG
カーネル内で、擬似的ではないランダムな値を使うにはどうすればいいですか??
NGNG
ガイガーカウンタをつないでカウントして乱数を発生させる
NGNG
ガイガーカウンタは計数するんじゃなくて時間を測るんだよね。
線源なしのバックグラウンドが相手だとパルス数が少なすぎて
ちょっとトロい。
NGNG
つーか、Intelチップセットの乱数ジェネレータとか使えばいいんでないの?
OpenBSDがサポートしてるのは知ってるけど、他はどう?
210名無しさん
垢版 |
NGNG
カーネル内で擬似的ではないランダムな値を使うためにはどうしたらいいですか??
211名無しさん
垢版 |
NGNG
すいません、ダブってしまいました。m(_ _)m
NGNG
NetBSD の場合、キーボードやシリアルその他のデバイスから
エントロピーを集めている。
この結果から得られた乱数は rnd_extract_data(9) で取得できる。
例えば sys/netinet/tcp_subr.c では、TCP の初期シーケンス番号
を、この乱数源から得るようになってるので、ここを見てみれば
使い方は分かる筈だ。
213名無しさん
垢版 |
NGNG
当方FreeBSDで「TCPの初期シーケンス番号」からヒントを得て、
そこからip識別子(ip_id)の初期化の手順へ行き、そこからシステムクロックをとるtime.tv_secを
知ることができました。

ありがとうございました。
NGNG
それちがうやろ....
215名無しさん
垢版 |
NGNG
確かに違いました。^^;
利用したい値の有効桁数が少なかったのでこれでも乱数として利用できるかと思ったんですが、
他の関数に利用する場合も考えてTCPの初期シーケンス番号の関数を利用したいと思います。
ご指摘ありがとうございました。
NGNG
>>210
どういう目的に使うの?
NGNG
>>212
「エントロピーを集める」という表現は気持ち悪いな。NetBSDの世界では普通に使うのか?
NGNG
別に NetBSD に限らず、乱数のセキュリティ方面への利用では、
普通に使います。試しに "collect entropy" でググってみるべし。
219名無しさん
垢版 |
NGNG
マルチキャスト通信においてNAKにより信頼性を持たせようと思っているのですが、
そのとき全ての受信者がNAKを出すタイミングが重なるとトラフィックが一気に
増大するのでそのタイミングをずらすために乱数が必要となりました。
アプリケーションプログラムと違い、カーネルでの乱数の求め方がわかりませんでした。^^;
NGNG
ただいまBSDのKernel SoruceをReadしてるので
Context Switchするわけにはいかぬ。
NGNG
擬似的でない乱数って…
222名無しさん@お腹いっぱい。
垢版 |
NGNG
自分でnumerical recipe使って書け
223 
垢版 |
NGNG
プ > numerical recipe
224*BSDハックさん
垢版 |
NGNG
UDPのudp_inputにおいて ユニキャストとマルチキャスト・ブロードキャストで
処理が分かれいるところで、ユニキャストの方は分かるのですが、
マルチキャスト・ブロードキャストの方でUDPPCBをfor文でスキャンして
いくのはなぜですか? 同じPCBは複数存在するのですか?
225あぼーん
垢版 |
NGNG
あぼーん
226あぼーん
垢版 |
NGNG
あぼーん
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況