ウォンツテック

そでやまのーと

2007-04-01から1ヶ月間の記事一覧

日ごろから調子の悪かったメインPCのWinXPを再インストール。 軽い。。。こんなに軽かったのかーwindowsって。。 あと完全におかしくなっていたFireFoxがOS再インストールで使えるようになったのが非常にうれしい。FireFoxが使えなくなってから泣く泣くメイ…

今までxemacsを使っていたけど何かと不都合が出てきたのでemacsに乗り換え。ついでにemacsのカラー化をやってみたので自分用にメモしとこ。 まずemacsのコンフィグファイルを読み込む順番は以下の通り ~/.emacs.elc ~/.emacs.el ~/.emacs .emacs.elcは設定フ…

SICPの問題を解こう15

問題 1.28 Fermat-testの欠点を補うMiller-Rabinテストを実装せよという問題。 そこでここで書かれている素数の性質についてちょっと見てみる。 ... ① かつ1 素数ではない。 証明 ①は上位の式と同義であり、x-1, x+1はそれぞれ [tex:0どうやら一般的なMiller…

SICPをemacs上で読めるようにしてみる。 neilvandyke.org - SICP in Texinfo Format ここからsicp.info.gzをDLし解凍したら makeinfo --no-split sicp.texi -o sicp.info でinfoファイルを生成し、/usr/local/info等へコピー あとはemacs上でM-x infoでSICP…

OSを作る

メモリ管理の実装大体完了。マクロを使って以前のよりすっきり書いた(つもり。。) メモリ管理も書いたし、次は頓挫してたFDCドライバーかな。 とりあえず1セクタの読み書きを目指そう。 memory.h #ifndef _MEMORY_H #define _MEMORY_H #include "types.h"…

OS

FDの読み込みを汎用的にして64KB以上に対応。 addw $0x1000, %ax とやらなければならない所を addw 0x1000, %ax とやってて気づくのに2時間くらい掛かったorz.. /* * @File bootacient.S * @Brief The initial boot section of Sodex * * @Author Sodex * @R…

メモリ管理を実装したのでkernelが増えbootacient.SでFDからのkernel読み込みセクタ数を負やした所問題が発生。突き詰めてみると FDから読み込んだ物はes:bxへ格納されるが、例えば es = 0x0DD0 bx = 0x2400 である場合実際に読み込まれる物理アドレスは 0x0…

以前apacheのソースを読んでて、APRにあるマクロで #define APR_RING_SPLICE_AFTER(lep, ep1, epN, link) do { \ APR_RING_PREV((ep1), link) = (lep); \ APR_RING_NEXT((epN), link) = APR_RING_NEXT((lep), link); \ APR_RING_PREV(APR_RING_NEXT((lep), l…

bootmiddle.SのBIOS命令e801で取得したメモリサイズをkernelから読む。 bootmiddle.Sにheaderファイルをincludeしてそのファイル上の変数にメモリサイズを格納したけど、それをkernel上から読み込むのに苦労した。。 bootacient, bootmiddle読み込み時はメモ…

SICPの問題を解こう14

問題1.27 素数以外でfermatテストを通ってしまう整数が本当に通るか確かめろという問題。 (define (fake-fermat-test n) (define (try-it a) (cond ((= a 1) (display "This num is prime or fake prime") (newline)) ((= (expmod a n n) a) (try-it (- a 1)…

次はメモリ管理。図を描いて整理。 kernelから作っているとメモリのFreeリストを使うにもその構造体用のメモリをmallocするわけにはいかないので予めメモリ管理構造体の配列を作っておく。この構造体は以下のような要素を持たす。 typedef struct _MemoryHol…

8259Aの初期化で設定したout8(0x21, 0x20)が有効になっていない。 具体的にはキーボードの割り込み処理を0x21番(0x20+1)に設定しても有効にならず、0x09が有効に なっている模様。以前作ったnchaOSでは0x21に反応していた。うーん謎。。qemuのinfo picで見る…

前回書いた割り込み処理の初期化部分を詳しく見てみる。 PCの割り込みコントローラ(Programmable Interrupt Controller:PIC)はIntelの8259Aというチップが二つ使われている(現在はチップセットでエミュレートされている模様)。 8259AへのIOポートはmaster…

タイマーが動かない原因はディスクリプタテーブルを登録する時(lgdt, lidt命令)の構造体がおかしかった。 typedef struct __gdtr { u_int16_t limit; u_int32_t base; } _gdtr; と書いていたがこれだとlimitとbaseの間に16bitの空白が出来てしまい正常なア…

今回はグローバルディスクリプタテーブル(GDT)の再登録(といってもbootmiddle.Sでやった事をもういちどやるだけ)と割り込み処理用のインタラプトディスクリプタテーブル(IDT)の登録を行う。GDTは前回見たとおりなのでIDTの中身を見てみる。 IA-32 Intel ma…

SICPの問題を解こう13

※Guileだと時間計測にまともな機能が無いのでGaucheに変更。Gaucheだとnanosecondまで計測出来るみたいだしいい感じ。 問題 1.24 素数のテストにFermatテストを使う Fermatテストの骨格となる以下のコードを見てみる (define (expmod base exp m) (cond ((= …

A20の有効化処理を書いた。とりあえず機械的にLinuxと同様の処理(biosでのチェック、キーボードコントローラでのチェック、コントロールポートAでのチェック)を255回試すって方法で実装。次の目標はvgaのデバッグ表示用API(レジスタ表示等)と正式版GDTと…

SICP 問題を解こう12

久々にSICPの問題を解きたくなったのでやってみる。 問題 1.23 問題1.22の素数テストを改良して検査時間が1/2倍になったかどうかを調べてなってなかったら理由を説明せよという問題。 改良の仕方は素数のテストにまでの2以上の整数を調べていたのに対し、2と…

リンカスクリプトを使ったことによる不整合が。。 文字列リテラルを以下のように使った場合 char *str = "hogehoge"; コンパイラはこの"hogehoge"を.rodataに置きリンクする時に先頭からの相対アドレスでこの文字列を参照しにいく。しかし先頭にはbootacient…

リンカスクリプトを以下のようにし、bootmiddleが0x1000(8セクション=8*512byte)あるようにbootacient.SのFD読み込み部分を書き直して解決。 苦肉の策だけどまぁ良しとしよう。 ※0x800〜0x1000の0x800バイトが無駄になる。 ※kernelを0x1000000などに置き直す…

gasにおけるメモリ参照のメモ AT&T記法であるgasでは以下のように書く segment:disp(base, index, scale) これはintel記法では segment:[base + index*scale + disp] ※scaleは1,2,4,8の値を取れる となる。 例をあげると %gs:4(%edi, %eax, 4) = gs:[edi + e…

CPUのプロテクトモード移行が成功したのでコードをassemblerからcへ移行。またmakefileも用意。今回はGASとリンカスクリプトを使ってるのでメモリ配置がわかりやすい。catを使ったfirst,second,c部分の結合も無くなったし。 makefile BASEDIR = /home/sode/p…

CPUのプロテクトモードへの移行において、GDT(グローバルディスクリプタテーブル)部分を読み直した。 IA-32 インテル アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル下巻で今回必要な部分を詳しく見てみる 全部で8バイト ディスクリプタテーブ…

多倍長演算クラス

RSA

多倍長演算クラスの和差部分のbug fix終了。 次は乗算を書く。多倍長演算クラスソース

Regex

@wikiにRegexのコードを貼り付ける REGEX - sodex @ ウィキ - アットウィキコードの整形スクリプトが使える無料のwikiは無いだろうか。。 perlでいちいちソースの先頭に空白入れてるけどめんどい。。

本屋

今話題の(一部の間で^^;)新宿ジュンク堂に行ってきました。 噂通りすばらしい品揃えでした。言語コーナーだけでも横一列びっしり。量なら当然ネットの方が上ですが、立ち読みしながら本選びしたい時はジュンク堂ですね。(ジュンク堂には座るスペースもあ…

メモリサイズ取得

int 15hのFunction 0xE801と0x88でのメモリサイズの取得が出来た /* We have to get the phisical memory map. * Using "Function E820" and "Function E801" but not "Function 88H", * we'll get it. * EAX 0xE820 - BIOS command to get the memory map *…

メモリマップ

メモリマップを取得しようと家にある実機3台で試したところ全部エラー(ah=0x86 Function not defined)となった。。 これじゃあ試しようがない。。仕方ないのでメモリサイズだけを取得する方法 int 0x15 Function 0xE801にするか。。

BIOS

http://hdebruijn.soo.dto.tudelft.nl/newpage/interupt/ 色々BIOSのファンクションコール回りが乗ってるサイトを探してたけど、いいサイトを見つけた。 このサイトはBIOSに限らずintをコールしている命令が羅列されている。 欲しい情報 int 15h function 0x…

実機FD読み込みバグ修正(print_debugでFDのエラーステータスが「4:sector mark not found」だった) FDのsectorに入れる値を間違えていた。(sectorは1〜18の値を入れる必要があるが、0を入れていた) > movb $0x1, (%si) # sector is 1