Syntax highlighter

2010-01-30

練習中の曲に関してのメモ

ギターの練習をしている。別に発表会とかはない。
ちなみに、練習してるのはこの曲

激ムズ。ギター暦1年未満がやる曲ではない気がする。しかも、クラシックギターではなく鉄弦のアコースティックギター・・・
それは置いておいて、これをやるにあたって必要そうな奏法のメモ。

ハンマリング、プリングオフ: いたるところで
ラスゲアード: 動画の49秒くらいのところのフレーズで出てくる
タンボーラ: 最後のノリがよくて格好いいところで
ポルタメント、グリッサンド: 結構いたるところでみる
チョーキング: 1分くらいのところで
ゴルベ?: 最後の方

タンボーラってサンピングのことか?
いろいろ無謀な気がするが、ロングスパンでやろう・・・

2010-01-28

OS: メモリ

ここ数日(数週間?)まったく時間が取れなかった。
今も取れているかはよく分からんが。

OSがメモリを割り当てるところで停まっていた。
まぁ、今も停まっていると言えばそうだが・・・

いまいちページングがよく分からない。E820hで取得したメモリーマップ情報からメモリアドレスを取得して、そのアドレスに対してページングOnする。
そこまでは上手くいっている(と思う)
っで、とりあえずmallocもしくはnewが使えないと話しにならない。ということで実装していたのだが、どうも変な挙動をしていた。
今日ふと、ページを初期化してから、アロケータの初期化をしたら、動いた(・A・)

鼻から悪魔が出るコードかもしれんが、とりあえずこれでいこう。
この辺が動けば少しやりやすくなるし・・・

まじめに参考書探さないとなぁ。
だれかお勧めの本とか知りませんか?

2010-01-24

ブリュッセル

ベルギーのブリュッセルに行ってきた。
別に観光情報とかが書かれるわけではない。単に所感。

実は(前に書いたっけ?)ブリュッセルに行くのは2度目。1度目はあまりいい思い出が無く終わったので、少し心配だった。
今回は2泊3日なので、まぁ少しゆっくり見て周れるかなと思いつつ、南駅(?)に到着。
メトロに乗ってホテル近くの駅まで。
一日目はこれで終了。仕事が終わってからなのでまぁこんなものだろう。
ちなみに、ロッテルダムからブリュッセルまで2時間弱くらい。

二日目とりあえず歩く。ショッピングストリートとか。本屋を探したが欲しい本が売っている店は見つからず。
どうでもいいが、ベルギーは一応オランダ語(フラマン語?)が公用語なのだが、ブリュッセルでは見るだけで、主に耳に入ってくるのはフランス語だった。
北部にあるアントワープではオランダ語だったのに、不思議。頻繁に旅行するようならフランス語を覚えた方がよさそうだ・・・
街自体は、新旧が入り混じってる感じ。パリの町並みによく似ているなぁと思わせるところが多々あったし、やはりフランス寄りなのだろう。
歩きつかれたのでホテルに戻って2日目終了。

3日目は日曜日なので店という店は閉まっている。雨も降ってるし、ということで特に何もせず帰る。

ちなみに、本当にどうでもいいことだが、ブリュッセルの平均身長は割りと低めだった。僕が普通か少し高いくらいに分類される感じだったので。
オランダの平均では僕は間違いなく低い方・・・190超えがごろごろいるんだよ・・・
ちょっとだけベルギーを好きになった瞬間だった。

2010-01-17

movie: シャーロックホームズ

映画の話。

予告ではホームズは荒くれ者で、ワトソンが知的って感じで、いまいちじゃねぇのこれって思っていたが、裏切られた(いい意味で)
いろんな新要素というか、見たことないホームズが見れたけど、それはそれでありな感じ。
ホームズ好きもそうじゃない人も楽しめるんじゃないかと。

最後の最後でモリアーティー教授の名前もでてきたし、エピソード2もあるのかね?
出たら見る自信がある。それぐらいよかった。

日本で公開されるか分からんけど。
(多分されるだろう。宣伝されてる?)

C++: 構造体でアドレスを読む

我ながら意味不明なタイトルだ。
やりたいことは、アセンブラが設定した配列をC++(またはC)の構造体に入れるってそれだけなんだけど、何故かはまっている。

アセンブラは適当なアドレスに値を入れる。こんな感じで。
0x00002840: 0x00000000 0x0000000 0x0009fc00 0x00000000
0x00002850: 0x00000001 ...
これが配列の一要素。
っで、まぁこれはE820hで取得したメモリーマップなので、普通にこんな構造体で受け取る。
struct MemoryMapEntry
{
  uint32_t baseAddrLow;
  uint32_t baseAddrHigh;
  uint32_t lengthLow;
  uint32_t lengthHigh;
  uint32_t type;
};

// どこかの関数で
MemoryMapEntry mapEntries = getMemoryMapEntry(); // これはアセンブラ内で定義した。
これで普通ならいけるはずなんだけど、取り出される値がおかしい。上記のアドレスなら、
baseAddrLow  = 0x00000000
baseAddrHigh = 0x00000000
lengthLow    = 0x0009fc00
lengthHigh   = 0x00000000
type         = 0x00000001
になるはずなんだけど、こんな感じに実際にはずれる。
baseAddrLow  = 0x00000000
baseAddrHigh = 0x00000000
lengthLow    = 0x00000000
lengthHigh   = 0x00000000
type         = 0x0009fc00
感じとしては、20バイト取得できてないといけないのだが、12バイトしか取れてない感じ。なぜ?
これが普通の動作なのかなと思い、ちょっと実験してみた。
#include 

struct sample
{
    unsigned int val1;
    unsigned int val2;
    unsigned int val3;
    unsigned int val4;
    unsigned int val5;
};

void* getsample()
{
    static int *addr = (int*)0x404030;
    addr[0] = 0x00000000;
    addr[1] = 0x00000000;
    addr[2] = 0x00000000;
    addr[3] = 0x0009fc00;
    addr[4] = 0x00000001;
    return addr;
}

int main()
{
    sample *s = (sample*)getsample();
    printf("addr: %x\n", s);
    printf("%x, %x, %x, %x, %d\n", s[0].val1, s[0].val2, s[0].val3, s[0].val4, s[0].val5);
    return 0;
}
こんなむちゃくちゃなコードでもなんか動いてるから不思議。
っで、結果は普通に予定通りの値が取れていた。
コンパイラの最適化が効いてるからなのか(何もオプションつけてないけど)、別の要因で直にアドレスから取るのとは違うのかよく分からん。

何より腹が立つのは、以前はまともに動いていたのだ!ページングの実装を終えたらおかしくなった・・・
関係があるのかな、やっぱり・・・

2010/01/17 追記

原因が分かった。
結論: まともに動いていました。
原因: VGAクラスで実装していたprintfメソッドの不具合。
64ビットの数値には%xの書式指定子が対応しておりません・・・
参考にしている人はいないと思うが、
64ビットの整数値を表示したいのに、可変引数のポインタを進める際に(int*)のポインタでやっとりました。つまり、8バイト移動させないといけないところを、4バイトしか進めていなかったっと。
これで2時間悩んだ。printfデバッグの限界やね。と勝手に納得・・・

OS: ページング

メモリ管理をしないと動的にメモリが取れない。
っで、とりあえずページングに手を出してみることにした。

とりあえずここを参考にしつつ、人のコードを見つつ。
っで、ページングONしてやって、qemuで起動すると、何故か無限リスタートしてくれる。
意味が分からんなぁ、と思いながらMonaのソースを見る。
(分からなくなったときのMona頼りというわけではないが・・・)

PageManager.cppのsetupメソッドを見ると、VRAMのアドレスをページング対応してる。何でだろうと思いながら、とりあえず似たようなことをしてみたら、動いた(・д・)
ページングをONにするということはすべてのアドレスをページング対応する必要があるのかな?
よく分からん。
ちなみに、ページング対応させたアドレスの属性を、書き込み可能、ユーザー領域、カレントにしないとだめだった。意味はよく分かっていない・・・(汗
無知っていやだなぁ・・・
勉強しないといけないのだが、こっちじゃ書籍も探し難い・・・ネットの情報だけじゃ厳しくなってきたというのに・・・

っで、これ書いてるときに気がついたのだが。
そういえばバイオスのE820h命令でメモリーマップを取得してるんだから、適当なアドレスを使用すれば、動的メモリーの割り当てができるような気がするなぁ・・・
ページングの前に実装するべきだったか?

2010-01-16

OS: 便利リンク

自分のための便利リンク。
ChangeLogとか、メモとかHDDに置けよという意見は無視。

[Wiki]
OSDev(English)
osdev-j(MMA)(日本語)

[ブログ]
OSのようなもの
Outlandish Watch(日本語)

[BIOS関連]
Ralf Browns Interrupt List

何か見つけたら随時足すことにしよう。

2010-01-14

C++: クラスのサイズ

これをググったのももう何度目かなので、いい加減メモっておこう。

C言語のstructは基本中身のバイト数の合計+パディングになる。例えば下記のような構造体があったとする。
struct Sample {
  int   value1;
  char  value2;
  short value3;
};
この場合だと上記の基本に当てはめて、
int = 4, char = 1, short = 2, total = 7になるが、
7だとキリが悪い(あまりいい表現ではないが)ので、パディングがcharとshortの間に入って8になる。
(詳しくは、バイト境界とか、アライメントとかでググって)

っで、C++の話。
C++のクラスはC言語の構造体と違ってメンバ関数を持つことができる。これが曲者。
例えばこんなクラスがあったとする。
class {
  public:
    void print();
  private:
    int value;
};
この場合は、クラスのサイズは4になる。なぜか?
どれだけメンバ関数が足されてもサイズには影響が無いそうだ。実際、GCCの-Sオプションで吐き出されるアセンブリを見たらなんとなく納得した。

っが、仮想関数が入ってくると別の話。
仮想関数はvtblを不可視のメンバ関数として持つので、そのポインタアドレス分増える。つまり4バイト。

なんでこんなことを調べたかというと、メンバ関数を持つクラスを普通の構造体として扱いたかったから。まったく普通なら問題なんだけど、メモリの内容を直接(例えばmemcpyとか)クラスの中に移したかった。
そうすると、クラスのサイズが重要になるので。
それだけの話。

2010-01-10

感覚が狂ったか?

座頭一がTVでやっていたので見た。
最初から見たわけではないので、序盤の話はよく分からなかったが、まぁ大まかな内容はつかんだと思う。

っが、別に今回は映画の内容ではなく、その中ででた台詞で不思議な感覚を味わったという話。
最後の最後で口縄(これでいいのかな?)の頭が、
「おめえ、メクラじゃねえのか?」と聞くのに対して、座頭一が、
「そうだよ」と答える一節。
これを見たときに、
「やっぱり盲目なんじゃん」と思った矢先に、座頭一が目を開けた!!

あれ?
なんで?

きっと、日本語→英語→理解の順になっていたのだろう。こんな感じで。
「おめえ、メクラじゃねえのか?」 -> "Aren't you blind?"
「そうだよ」 -> "Yes"

う~む、日本語がおかしくなってきたか・・・

2010-01-09

Makefile: 依存関係

自作OSをビルドする際に、当然(?)makeを使うわけだが、ずぼらな僕は「make」って打つだけで全部やってほしいと思うわけだ。

っが、依存関係の問題があって、今まで
「make clean all」
なんて、毎回プロジェクトをリビルドしていたわけだ。
けど、これ今はまだいいが、ファイル数が10とか100とか増えた時に非常に面倒になる。
というか、僕の貧弱なノートPCでは時間がかかりすぎるようになる。
(こんなことやってるのに、使用してるPCがノートかよ、って突っ込みはなしで)

っで、とりあえず、依存関係を自動で解決するようにMakefileを書き直した。
ポイントになるのは、gccの「-MM」オプション。
っが、makeのマニュアルにある方法だと、sedを使う。っが、WindowsでMingwだけで何とかしようという環境の僕にはsedはおろかCygwinもない。
適当に、gccが吐き出す依存関係を編集して上手いこと書き出すプログラムをC++で書いた。
なんでこんなことしなきゃならんのだろうか?

これだけいろいろ便利になってるんだから、こんな変なノウハウじゃなく、もう少しスマートな解決方法があってもいいような気がする。

2010-01-08

C++: 初歩的なこと・・・

VGAのを使って色を変えたり、文字を表示させたりするということ実装していた。
リアルモードからプロテクトモードに移行するとBIOSが使えないので、VGAを使う必要が(ないかもしれないが)ある。
っで、主にこの辺とかMonaの初期のソースとかを参考にしながら、しこしこ書いてみた。

っが、なぜか一行おきに空白がでる(縦に)。なんでだろうと、いろいろVRAMに与える値を変えたりしながら考えてみたが、一向に改善しない。
おかしいなぁと思いながらトイレにいって思いついた。
そういえばVRAMのアドレスはunsigned shortのポインタだなぁと・・・
Monaはunsigned charでサイトはunsigned shortなので、ポインタに加算を行った際のアドレスが1バイトずれる。

これか。

おさらい。

// ちなみに、0xb8000はVRAMのアドレス
unsigned char* ptr = (unsigned char*)0xb8000;
unsigned short* ptr2 = (unsigned short*)0x8b000;
ptr++; // 0xb8001
ptr2++;// 0xb8002

これを行った際に。ptrとptr2のアドレスは異なる。
あほかと思うくらい当たり前だが、はまった。

2010-01-07

OS: IPL

その筋には(というと変な雰囲気がでて格好いい?)有名だが、
2ch発祥のOSでMonaというのがある。最初の会社にいたころに知ったから、2005年くらいか?
あれから、5年。何を思ったのが、僕もOSを作りたいと思ってきた。
(昔から思っていたが、当時は何をしていいのかさっぱり分からなかった。が、最近なんとなく必要なものが見えてきた。暇にかまけて勉強したのが功を奏した感じ)

っで、Monaをはじめ、いろいろ調べてみた。
30日でできる! OS自作入門とかが有名っぽいが、こっちじゃ買えん。
っが、結構実践サイトとかあって、解説が読めないだけでソースは読めたりする。

っで、IPL(OSを起動する前にBIOSが起動する。ブートローダーと同義?)を作ることからはじめることになるのだが、これが難しい(当たり前だが)
アセンブラがよく分からない(アセンブリ言語自体は割りとシンプルなのだが、アドレスとかレジスタとかがいまいち分からん)
あと、GCCとNASMの相性が悪い(というかGASとGCCの相性がよすぎるのか?)というのもあって、とりあえずNASMを選択していた状態ではさっぱり分からんかった。

とりあえず、このサイトの自作OSのタグに書かれているのを参考に(ほとんど丸写し)、IPLを作成。
GASを使うとCの関数がそのまま呼べるので楽!!
リンカスクリプトを使うとコンパイル時にプログラムのサイズが取れるので、FDの読み取りに必要なセクタ数が分かって楽!!!
なんて感じだった。
はじめからこれにしておけばよかった。
回り道は無駄じゃないと信じたい。

2010-01-04

ASM: 勉強中

何を思ってか、アセンブリ言語のお勉強中。
(いや、ちゃんと目標があってだけど)
(Shemeはどうした?勉強してますよ)

どうでもいいけど、アセンブリ言語をアセンブラでアセンブルするんですよ(多分)
AssemblyをAssemblerでAssembleするかね、英単語にするとちと分かりやすい?
(yをeeにすると、employ、interviewと同じ関係やね)

横道どころでなくそれた。
最初(未だに)、NASMを使うか、GASにするか。NASMはIntel標準なので、(ちょっとだけ)汎用性が高い。GASはGCCとの親和性が抜群。
とりあえず、標準という言葉に弱いので、NASMにした。

アセンブリ言語の構造は非常に簡単といってもいいと思う。
基本、こんな感じ
;; 簡単なprint
;; 呼び出しは、
;; mov si, msg_pointer
;; call print
;; こんな感じ
print:
  pusha
  xor bx, bx
.loop:
  lodsb
  or  al, al
  jz  .end
  mov ah, 0x0e
  int 0x10
  jmp short .loop
.end:
  popa
  ret
命令とレジスタの組み合わせでいろいろやる。ここまでは、それなりにいろいろ言語をやってきたので簡単に理解。
問題はこの辺
mov ah, 0x0e
int 0x10
今となっては何か分かっているのだが、最初は何のことやら・・・
これは、上のlodsbでALレジスタにSIレジスタに格納されている文字列の先頭を格納していることを前提に、AHレジスタにBIOSの0x0e(表示)命令を入れて、int 0x10で実行している。
BIOSのint 0x10はビデオ関係の命令を実行するという意味で、
AHレジスタに一文字表示の命令0x0eを格納し、ALレジスタに文字コードを入れる。
BIOSの命令は、使用するレジスタ、命令の種類が決まっているので、それを調べる必要がある。
例えば、こことか。

後は、セグメントとオフセット、各レジスタの意味とかが重要になってくる。
正直、覚えられん(まだ1週間・・・)
とりあえずの、備忘録。

2010-01-01

movie: トワイライト サーガ

邦題は知らん。とりあえずそのままカタカナにしてみた。

新年一発目はこれだった。
エピソード2らしい。

感想(以下はネタバレが含まれる可能性があります)
個人的な感想を最初に書こう。
3流映画で見る価値なし。

無いよう自体は、バンパイアの子孫(?)のエドワードと狼男のジェイコブ、普通の人間のベラの恋模様を波乱万丈っぽく描いた無いよう。
その昔みた、ママレードボーイの三角関係そのままって感じ。
ただ、
エドワード → 貴族な優男
ジェイコブ → 野性味あふれる感じ
ベラ → エドワード一筋なくせに、ジェイコブも捨てがたい超わがまま娘
って感じだった。
う~ん、あんまり批判的な意見を書いて、名誉毀損で訴えられるのも嫌なので、これくらいにしてしまおう。
正直、意味不明だった(英語が理解できないとかではなく、内容が)

あけましておめでとうございます

本年もよろしくお願いいたします。

今年は初詣もなく、なんとも静かな新年であります。
すこし物足りない気分でもあります。

旧年は、行く年来る年を見ることもなく、年が明けた瞬間の花火(と呼ぶにはあまりにやかましい)にはずいぶん驚かされました。
(市がやってるわけじゃなく個人。しかも結構大きめな打ち上げ花火。そりゃ指なくしたり、足なくしたりするわ)

本年は寅年ということで、躍動感あふれる年にしたいと思います。