2010-01-01から1年間の記事一覧

Pythonのお手軽webサーバ機能

単純なWebサーバだと実質3行で作れるというお手軽さでした。 スクリプトを実行したディレクトリがDocumentRootになります。 #!/usr/bin/env python import SimpleHTTPServer import SocketServer import sys def run(port): print "listening port is ", por…

ファイルシステム実装中

だらだろext2の実装を始めたので、忘れないようにc⌒っ゜д゜)っφ メモメモ... 基本的にはLinuxの実装方法を参考にしつつ進めてます。ソースはこちら。 とりあえず、極々基本的なreadの流れが出来たので、めもっとかないと自分で忘れてしまいますorz なんとな…

1FD Linux

なんとなく、前に作ってた1FD Linuxを見てたので、どんな感じで作ってたのかの覚書です。 今時、1FD Linuxを作ろうなんて人はあんまりいないと思うけど・・・最後に作ったやつの主要モジュールはこんな感じです。 kernel:2.6.13 busybox:1.01 uclibc:0.9.…

sys_mount()を読んでみる。

mountってどんな感じで処理してるんだろ〜ということで、sys_mount()を読んでみます。 調べたのは、2.6.33です。ソースは大概LXRで調べてるんですが、sys_mountで検索しても実体が見つからなくてちょっと苦労しました。 定義が、SYSCALL_DEFINEマクロを使っ…

ソフトウェア割り込みのc⌒っ゜д゜)っφ メモメモ...

オレオレカーネル用のソフトウェア割り込みにやっと手を出したたので、メモっときます。 まぁ、今更なネタだし面白くないですけど。 ソースはいつもながらgithubに。流れ的には、こんな感じです。 1.設定 2.(どっかから)システムコール呼び出し 3.アセンブ…

procfs経由でデータの読み書き

今日はprocfs経由でデータの読み書きしようというのをやってみました。ここを参考にしました。 The Linux Kernel Module Programming Guideこんな感じの動作になります。 lisa:~# cat /proc/proc_test Hello, World lisa:~# echo -n "foobarbaz" > /proc/pro…

linuxにシステムコール追加

久々にやってみようと思って、2.6.33でシステムコールの追加をしてみました。 やってみたら新しい発見があったり面白いですね。copy_buffer.cというファイルは新規に作ったのと、それようにMakefileを弄ってます。 他のファイルはシステムコールを追加するた…

ページング使ってるときのTSS設定.

c⌒っ゜д゜)っφ メモメモ... 自作カーネルでTSSを使ったタスク切り替えをしてて,かなりハマったのでメモっときます. ページング無+TSSでコンテキストスイッチは動いてたのに,ページング有+TSSだとセグメント間ジャンプしたときに落ちてて悩んでたんだけ…

自作カーネルでコンテキストスイッチを実装したいので,Minix3.1.0のやり方を調べる.

Minixでコンテキストスイッチする部分は,処理内容的にkernel/mpx386.sのrestart()っぽいのでこれを見ます. 実装はアセンブラだけど,cからも呼べるようにkernel/proto.hにプロトタイプ宣言があります. _PROTOTYPE( void restart, (void) ); といっても,…

libusb-1.0のメモ

twitterの極一部で熱狂的ブームになっているYUREXを入手したので,libusb-1.0で遊んでます. ということで,その辺のc⌒っ゜д゜)っφ メモメモ... コードは割とやっつけです・・・ libusbはこちらの 「Introduction to using LibUSB-1.0」を参考にしてます.ド…

eflagsの値を読み出す

c++

rip/eipと同様にちょっとした手順が必要. #include <iostream> int main(int argc, char **argv) { unsigned long eflags = 0; __asm__ __volatile__ ("pushf\n\t" "popq %%rax\n\t" "movq %%rax, %0\n\t" :"=m"(eflags)); std::cout << "eflags is " << std::hex << </iostream>…

eip/ripの取得方法メモ

c++

インラインアセンブラでmovqとかで直接読み出せないので,call命令を使う. 参考「OSDev.org」 #include <iostream> int main(int argc, char **argv) { unsigned long rip = 0; __asm__ __volatile__ ("call 1f\n\t" "1: pop %0;\n\t" :"=r"(rip)); std::cout << "rip</iostream>…

自作カーネルでHDDへの書き込みもできました.

2010/02/18時点では,単に指定した位置を読み書きしてるだけで,実用性のあるコードにはなってないです>< ソースはgithubに.処理内容は読み込みとほぼ一緒で,論理セクタの設定方法は,あたりまえだけど,読み込み時とまったく一緒です. 読み込み時はコ…

HDDの内容を読み込めるようになったよ〜

ということで,自作カーネルもATAのPIOデータ転送(LBAとCHS)を使ってデータの読み込みが出きるようになりました(∩´∀`)∩ワーイソースはこちら http://github.com/masami256/miko 参考文献は「インターフェース増刊 ATA(IDE)/ATAPIの徹底研究」です. これ…

PCI コンフィグレーション・メカニズム1でPCIにアクセス.

前のコードでバグってるところを見つけたので、修正版です. 全てのソースコードはgithubにあります.PCIのバス番号と、デバイス番号からPCIデバイスを探す関数. static u_int32_t find_pci_data(u_int8_t bus, u_int8_t dev) { u_int32_t data; u_int32_t s…

sendfile(2)というのを見つけたのでメモ.

manによると,fd間でデータのコピーを行うけど,read()とwrite()が不要なので効率が良いとのこと.実際にやるとこんな感じになります.. [masami@moonlight:~]% touch a.txt b.txt [masami@moonlight:~]% echo "foobar" > a.txt [masami@moonlight:~]% emac…

PCI BIOS32の探し方

PCIにアクセスするのにPCI BIOS使った方が良いのかな〜と思って,まずは,PCI BIOS32を探すコードを書いてみました. 参考文献は昨日買った「PCIバス&PCI‐Xバスの徹底研究」最初に探すのは,PCI BIOS32サービス・ディレクトリで,アドレス0xE0000〜0xFFFFFの…

昨日のoopsから,バグが発生した場所を調べます.

昨日のoopsはこれです.まず,oopsにある原因のコードの場所を見ます. [12643.727359] RIP: 0010:[<ffffffffa02a00ae>] [<ffffffffa02a00ae>] count_free+0xae/0x131 [minix]そうすると,count_free()という関数で落ちていることがわかります. 後ろの0xaeはバグの場所で,0x131は関数のサイズで</ffffffffa02a00ae></ffffffffa02a00ae>…

fsfuzzerで遊んでみました.

ファイルシステム用のfuzzツール「fsfuzzer」にminixのファイルシステムをテストするコードを追加して,遊んでみました. このツールは,何年か前の,「Month of kernel Bugs」でも使われてたような気がします.fsfuzzの基本的な使い方は,以下の通りで単純…

double freeバグのデバッグ.

昨日久々に,double freeのバグに当たったので,それのデバッグ方法をメモ書き.こんな感じで,2重にfreeするバグを持ったプログラムがあったとして, サンプルなので,原因は簡単に分かりますけど・・・ [masami@moonlight:~]% cat double_free.c #include <stdio.h> </stdio.h>…

forkしてpipe読み書きにかかる時間.

こんなコードを書いて,Linux,Minixでかかる時間をtimeコマンドで見てみました. #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/wait.h> int main(int argc, char **argv) { pid_t pid; int max; int i; int pfd[2]; char buf[16]; if (argc != 1) max = atoi</sys/wait.h></sys/types.h></stdio.h></stdlib.h></unistd.h>…

KVM環境でMinixのビルド時間を計測

n7shiさんの日記(カーネルビルド時間)を参考に, KVM環境だとどうかなーと思い,時間を計ってみました.使ったPCの環境はこんな感じです. CPUは「Intel(R) Core(TM)2 Duo CPU T9600 @ 2.80GHz」で, カーネルは「Linux moonlight 2.6.33-rc5-tip+ #1 SMP PR…

オレオレカーネルで使うメモリ管理の仕組みを作って見ました.

といっても,まずは作成とテストがしやすいように,Linux上の普通のアプリとして実装してます. 大体動いているので,次はこれを,オレオレカーネルに移植します. 一応,ページ単位のメモリ管理は作ってあるので,移植時の変更点はinit_kmalloc_area()でmal…

PCIメモ2

2010/02/10追記:下の日記が,ちゃんと動く版です〜 http://d.hatena.ne.jp/masami256/20100208/1265644385昨日のソースにデバイスがマルチファンクションの場合の処理を追加してみました.というか,マルチファンクションかどうかチェックしてないですけど…

PCIのメモ.

2010/02/10追記:下の日記が,ちゃんと動く版です〜 http://d.hatena.ne.jp/masami256/20100208/1265644385最近だらだらと自作カーネルを書いているんですが, PCIについて,OSDevとかこちらを読んで,現状分かったことを忘れないうちにメモっときます.PCI…

久々にPythonでプログラム書いたのでメモ.

仕事でテストデータ作るのが面倒だったのでw ツールを作成してみました. 何がしたいかというと,.mp3ファイルがたくさん欲しかったので,IDv3タグを変更してIdv3タグ的に別のアーティスト・アルバムにしたかったのです.IDv3タグをいじれるライブラリを探し…