2010-02-01から1ヶ月間の記事一覧

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の基本的な使い方は,以下の通りで単純…