OSをつくろうpart3
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001ひげぽん
NGNGスレッドになればと思います。
前スレッド
OSをつくろうpart2
http://pc3.2ch.net/test/read.cgi/tech/1024411711/
0002ひげぽん
NGNG早速ですが、
現在のhigeposのステータスは、
firstboot ブート開始&secondboot以降をディスクからメモリに読み込んでjmp
secondboot プロテクトモードへ移行&third部にjmp
third Cでソースを書いてコンパイル&リンク return 'A';してaxレジスタに反映されることを確認
を試みているのだが
third部にjmpするとBochsが異常終了してしまう。
third部をアセンブラで書いた場合は通常に実行される(third.asm)
またうまくいかないCから作成されたバイナリファイルを
逆アセンブルすると出てくるものには、mox eax, ???以外の命令がある。
その命令のせいで不正終了しているのではと思っています。
なお現在の動かない最新のソースは↓にuploadしました。
http://oshigepon.tripod.co.jp/
どなたかお知恵を拝借させて下さい。
0003デフォルトの名無しさん
NGNGkernel.cは16bitのコードを生成してるだろ?
0004ひげぽん
NGNG${CC} -c -ffreestanding -Wall higepos_kernel.c -o ${BIN}/higepos_kernel.o
gccは32bitコンパイラだと思っていたのですが、16bitコードを吐くんですか?
0005デフォルトの名無しさん
NGNG0006ひげぽん
NGNG0153320000i[CPU ] protected mode
0153320000i[CPU ] CS.d_b = 32 bit
0153320000i[CPU ] SS.d_b = 32 bit
0153320000i[CPU ] | EAX=60000068 EBX=00000000 ECX=00150002 EDX=00000000
0153320000i[CPU ] | ESP=00001000 EBP=00000000 ESI=000000ee EDI=000b8006
0153320000i[CPU ] | IOPL=0 NV UP DI PL NZ NA PE NC
0153320000i[CPU ] | SEG selector base limit G D
0153320000i[CPU ] | SEG sltr(index|ti|rpl) base limit G D
0153320000i[CPU ] | DS:0010( 0002| 0| 0) 00000000 000fffff 1 1
0153320000i[CPU ] | ES:0010( 0002| 0| 0) 00000000 000fffff 1 1
0153320000i[CPU ] | FS:0000( 0000| 0| 0) 00000000 0000ffff 0 0
0153320000i[CPU ] | GS:0000( 0000| 0| 0) 00000000 0000ffff 0 0
0153320000i[CPU ] | SS:0018( 0003| 0| 0) 00000000 00000000 1 1
0153320000i[CPU ] | CS:0008( 0001| 0| 0) 00000000 000fffff 1 1
0007デフォルトの名無しさん
NGNG0008デフォルトの名無しさん
NGNG0009デフォルトの名無しさん
NGNGgccでコンパイルしてオブジェクトファイルにした物を
そのままcatしても起動できないのは当たり前。
-cでコンパイルした物は単なるcoff形式のオブジェクトファイルだから。
0010デフォルトの名無しさん
NGNGkernel.o をそのままロードしてるの ? リンクは ? ヘッダーの除去は ?
できたらロードしてるバイナリもアップした方が助言しやすいと思う。
00119
NGNGstrip --output-target=binary kernel.o
でどうかな?
0012デフォルトの名無しさん
NGNG00139
NGNG00149
NGNG>strip --output-format=binary higepos_kernel.o
>ndisasmw -u higepos_kernel.o
00000000 55 push ebp
00000001 89E5 mov ebp,esp
00000003 B861000000 mov eax,0x61
00000008 5D pop ebp
00000009 C3 ret
0000000A 90 nop
0000000B 90 nop
実行結果がこうなるんで、問題ないと思うが、いかが?
0015ひげぽん
NGNGbochsが↓というエラー出しながら異常終了してしまいます。
00000232034e[CPU ] prefetch: running in bogus memory
${CC} -c -ffreestanding -Wall higepos_kernel.c -o ${BIN}/higepos_kernel.o
#${LD} --oformat binary -Ttext 0x200 -o${THIRD} ${BIN}/higepos_kernel.o
${STRIP} --output-target=binary ${BIN}/higepos_kernel.o -o ${THIRD}
${NDISASM} -u $@ >${LIST}/third_disasm.asm
make と ndisasmの結果です。
00000000 55 push ebp
00000001 89E5 mov ebp,esp
00000003 B861000000 mov eax,0x61
00000008 5D pop ebp
00000009 C3 ret
0000000A 8DB600000000 lea esi,[esi+0x0]
0016ひげぽん
NGNGひとつどうしても納得いかない点があるので質問させてください。
前提知識としてブート部のサイズは以下の通りです。
firstboot 512byte
secondboot 512byte
firstbootでは、2セクタ目から18セクタ分 0x100に読み込んでいます。
そのためsecondbootにjmpするときには
jmp 0x100:0000
のようにしています。
secondbootからthirdにjmpするときには、0x100+ 512 = 0x300
と指定していました。
しかしこれだとexceptionがあがるので
0x200を指定したところうまくいきました。
なんだか計算が合わない気がするのですが、どこで間違っているのでしょうか。
0017デフォルトの名無しさん
NGNGhttp://oshigepon.tripod.co.jp/
0020デフォルトの名無しさん
NGNGがんばれひげぽん+名無しさん
0021デフォルトの名無しさん
NGNGhttp://www.delorie.com/djgpp/
NASM
http://sourceforge.net/projects/nasm/
ひげぽんはこの2つを使ってるってことでOK?
0022デフォルトの名無しさん
NGNG何かがおかしい。
jmp 0x100:0000 はリニアアドレス 0x1000 のはず。
0x200 byte が second なら 0x1200 から third か?
なら jmp 0x200 であってる。
jmp 0x100:0000 で 0x1000 にセグメントを置きなおしてるから。
なぜに 0x100 + 512 なのか?
0023ひげぽん
NGNGありがとう。
Bochs
http://bochs.sourceforge.net
も追加しておきます。
0024デフォルトの名無しさん
NGNG0x200で上手くいったのは [org 0x100]を指定していないからだろ。
orgを指定すれば 0x300で上手く行くだろうに。
0025ひげぽん
NGNGjmp 0x100:0000 はリニアアドレス 0x1000 のはず。
>0x200 byte が second なら 0x1200 から third か?
>なら jmp 0x200 であってる。
>jmp 0x100:0000 で 0x1000 にセグメントを置きなおしてるから。
>なぜに 0x100 + 512 なのか?
すいません。
一瞬で自分の勘違いを理解しました。
かなり赤面の勘違いです。
ご指摘ありがとうございました。
0026デフォルトの名無しさん
NGNG>>24は、 [org 0x1000] で、 jmp 先は 0x1200 だな。
まあ org と jmp 先アドレスがちょうど 0x200ずれてれば上手く行っちゃうんだけど、、、。
0027ひげぽん
NGNGhttp://www.osdev.org/cgi-bin/projects.cgi
たくさんのOS開発プロジェクトへのリンク集です。
多くのプロジェクトはソースを公開していて大変勉強になります。
もちろん英語ですが・・・
0028ひげぽん
NGNGもうひとつのほうは、いまだ解決しておりません。
明日がんばってみます。
0029デフォルトの名無しさん
NGNGvoid hige(void) {
VRAM[0] = '2';
VRAM[2] = 'c';
VRAM[4] = 'h';
for(;;);
}
ひげぽん、動いたよ。
エラーになったのは、returnで処理を返していたからだろ。
キッチリhangしないとダメポ
0030デフォルトの名無しさん
NGNGもうひとつのほうとは?
0031デフォルトの名無しさん
NGNG相対じゃなかったか、とか言うのは?
↓のが良いと思う。
jmp _third
times 512-($-$$) db 0
_third:
0032ひげぽん
NGNGOSの設計・開発を本気で始めるときに
共同開発者や、協力者ってどう集めればいいんでしょうか?
source forgeみたいなところで、まずはきちんとプロジェクトとして
始動しておいたほうが良いのでしょうか?
0033ひげぽん
NGNGありがとう!!!!
できましたよ。
今日は遅いので明日ちょっと改良してアップロードさせて
いただきます。
すごいやる気が出てきました。
>>30
↑解決しました。
>>31
ありがとう。それも試してみます。
0034デフォルトの名無しさん
NGNG--------
typedef short word;
typedef char byte;
#define MAX_HEIGHT 24
#define MAX_WIDTH 80
#define VRAM ((byte *)0xb8000L)
#define BUFF ((word *)0x08000L)
#define AT(X,Y) ((X)+(Y)*80)
void copy_buff()
{
int i;
for(i=0;i<MAX_HEIGHT*MAX_WIDTH;i++){
VRAM[i*2]=BUFF[i];
}
}
void buff_clean()
{
int i;
for(i=0;i<MAX_HEIGHT*MAX_WIDTH;i++){
BUFF[i]=' ';
}
}
void init()
{
BUFF[AT(4,4)]='*';
BUFF[AT(4,5)]='*';
BUFF[AT(4,6)]='*';
BUFF[AT(41,10)]='*';
BUFF[AT(42,10)]='*';
BUFF[AT(40,11)]='*';
BUFF[AT(41,11)]='*';
BUFF[AT(41,12)]='*';
}
0035デフォルトの名無しさん
NGNG------
int count(int p)
{
int i,c;
#if 0
int around[8]={-81,-80,-79,-1,1,79,80,81}; /* こうしたいところだが */
#else
int around[8]; /* こうしないと上手く行かない */
around[0]=-81;
around[1]=-80;
around[2]=-79;
around[3]=-1;
around[4]=1;
around[5]=79;
around[6]=80;
around[7]=81;
#endif
for(i=c=0;i<8;i++)
if(VRAM[(around[i]+p)*2]=='*')
c++;
return c;
}
void update()
{
int x,y;
for(y=1;y<MAX_HEIGHT-1;y++)
for(x=1;x<MAX_WIDTH-1;x++){
int c=count(AT(x,y));
if(c==3 || (c==2 && VRAM[AT(x,y)*2]=='*'))
BUFF[AT(x,y)]='*';
else
BUFF[AT(x,y)]=' ';
}
}
void c_main()
{
buff_clean();
init();
for(;;){
copy_buff();
update();
}
}
003629
NGNGstripでオブジェクトを作ると、
文字列リテラルとかが入っているオブジェクトが破損されるから出来なかった。
0037デフォルトの名無しさん
NGNGstrip しても文字列は消えないんじゃない?
ただリンクを上手くしないとdata領域に上手くアクセスできないってのはあるけど。
003929
NGNGたとえば、
#define VRAM ((char*)0xB8000)
void hige(void) {
VRAM[0] = '2';
VRAM[2] = 'c';
VRAM[4] = 'h';
for(;;);
}
char* text="2ch";
このソースのリスティングが下のようになっちゃう。
やっぱり、きちんとリンカを使わないとだめなようです。
MinGW標準だと-oformat binaryが使えないので、
どっちにしろダメポってかんじですか。
00000000 1A00 sbb al,[eax]
00000002 0000 add [eax],al
00000004 0500800B00 add eax,0xb8000
00000009 32C6 xor al,dh
0000000B 0502800B00 add eax,0xb8002
00000010 63C6 arpl si,ax
00000012 0504800B00 add eax,0xb8004
00000017 68EBFE3263 push dword 0x6332feeb
0000001C 68 db 0x68
0000001D 00 db 0x00
0000001E 90 nop
0000001F 90 nop
0040デフォルトの名無しさん
NGNG0041デフォルトの名無しさん
NGNG> bochsが↓というエラー出しながら異常終了してしまいます。
> 00000232034e[CPU ] prefetch: running in bogus memory
bochs のソースを grep すると...
if ( new_phy_addr >= BX_CPU_THIS_PTR mem->len ) {
// don't take this out if dynamic translation enabled,
// otherwise you must make a check to see if bytesleft is 0 after
// a call to prefetch() in the dynamic code.
BX_ERROR(("prefetch: running in bogus memory"));
}
となってるから、どうもメモリー容量を越えたみたい。
higepos_kernel.c の hige() は、誰からも呼ばれてないから関数から戻ったら
即暴走してメモリーを使い尽くしたんだと思う。
とりあえず...
static char foo();
void hige()
{
char a;
a = foo();
while(1){
}
}
static char foo()
{
return 'A';
}
とでもして試してみて。
0042デフォルトの名無しさん
NGNG0043デフォルトの名無しさん
NGNGつうか、return するならアセンブリではcallにしろよ。>ひげぽん
0045デフォルトの名無しさん
NGNG散々叩かれて消えていったとさ。。。
0046デフォルトの名無しさん
NGNG叩いたつもりになってるのは、このスレの雰囲気が読めてない君だけだよ。
ちょっと内容が高度になってきて内容が理解できないのはわかるが、おとなしく
他のスレに行きな。
0047デフォルトの名無しさん
NGNG今の内からオブジェクト配置のリロケータを書いた方が良いのかな、とか思タヨ
0048デフォルトの名無しさん
NGNG0049デフォルトの名無しさん
NGNGどのスレ?
http://pc.2ch.net/tech/kako/1006/10065/1006524791.html
http://pc.2ch.net/tech/kako/1022/10226/1022685075.html
http://piza2.2ch.net/tech/kako/998/998113110.html
http://piza2.2ch.net/tech/kako/998/998502881.html
0050デフォルトの名無しさん
NGNGあ〜〜〜、そう言うことか。唐突にでてきたように見えたから、単なる嵐かとおも
たよ。スマソ。で、結局どのスレなの ?
0051デフォルトの名無しさん
NGNG( ´,_ゝ`)プッ ダセェ
0052デフォルトの名無しさん
NGNG0053デフォルトの名無しさん
NGNGまずはFDにおさまるOSをつくろうぜ
0054デフォルトの名無しさん
NGNG漏れFATからロードするローダー今作ってるが、
誰かが作るならやめる。
0055デフォルトの名無しさん
NGNG005645
NGNG同じタイトルのスレ見覚えがあったんだけどOS板でした…
結局part1はどれかわからん。とにかくひげぽん頑張ってね〜
興味あるんだけど漏れじゃ何もできんよ。。。
初めて読む486読んで勉強してるところです。
0057ひげぽん
NGNG>>ALL
>まずはFDにおさまるOSをつくろうぜ
そうですね。ひげぽんの当面の目標も↑と一緒です。
>>56=45
ありがとう。
>興味あるんだけど漏れじゃ何もできんよ。。。
>初めて読む486読んで勉強してるところです。
そんなことはないですよ、このスレッドの前スレから目を通してもらえれば
すくなくとも、フロッピーからブートするところまではいけると思いますよ。
OSを作ることに興味がある人はぜひご参加ください。
0058デフォルトの名無しさん
NGNG俺も、ひげぽんのおかげでフロッピーからブートするところまではいける
ようになったよ。(つーか、ひげぽんのソースをちょっといじっただけと
も言えるが...。) で、次にカーネルのコアに相当するものを読み込む
ローダーを作ろうと考えてたんだけど、もう作っている人いるのか...。
そろそろファイルシステムとか実行ファイル形式とかメモリー管理とか
決めないといけない状況かな...。
0059ひげぽん
NGNG>そろそろファイルシステムとか実行ファイル形式とかメモリー管理とか
>決めないといけない状況かな...。
そうですよね。
ファイルシステムってどの時点で決めざるを得なくなるんだろう。
OSブート部に含まれるシステム初期化部分に含まれるんですよね。
いまは、VGA部のライブラリを書こうと思っているのですが・・・
良いサンプルとかありますか?
higeposの方針として
一番ハードウェアよりのレイヤーは、システムライブラリ群として実装し
それをcppのクラスでラップしようと思っています。
たとえばVGA、FILEクラスとか・・・
もしx86以外に移植する場合はライブラリを
直すようにすればよいかな・・・
なんて考えております。
006054
NGNGフロッピーからブートだけど、
FAT12形式の方が何かと便利なので、
FAT上にファイルとしてhigeboot.bin(2nd boot program)を設置して
それに実行を移すプログラムを書いてるって事。
0062ひげぽん
NGNG>フロッピーって時点でFAT12で決定じゃないんですか?
>それとも、フロッピーもオリジナルのファイルシステムにする?
ファイルシステム実は良く分かってないっす(笑)
ファイルシステムは、どの時点で決定するものなのでしょうか。
0063デフォルトの名無しさん
NGNGの時に除算命令(div)を発行すると、
除算命令で無限ループになるんだけど、
これってx86の仕様?
006458
NGNG> フロッピーって時点でFAT12で決定じゃないんですか?
> それとも、フロッピーもオリジナルのファイルシステムにする?
それ以外にも、EXT2 (Linux), NTFS (WindowsNT), BSD FFS (FreeBSD),
HFS (Mac) とかもあるからどうするものかと...。
>>62
> ファイルシステムは、どの時点で決定するものなのでしょうか。
普通、カーネル自体は普通のファイルの形式にすることが多い。そうすれ
ば、カーネルを再構築した時に単にそのファイルを置き換えるだけで済む
から。その為には、second_boot 当たりがファイルシステムを理解して
読み出すことが必要。と言うことで、そろそろかなぁと思った次第。
とりあえずは、開発システムのファイルシステムに合わせておくのがいい
かと思う。
006554
NGNGえーっと、いきなりハードディスクで動かすのを前提で進めるの?
まず、フロッピー運用でウインドウシステムなりコンソールなりまで出さないの?
EXT2もNTFSもフロッピーに作れるファイルシステムじゃないし、
今の時点では考えてなかったんだけど。
0066ひげぽん
NGNG>普通、カーネル自体は普通のファイルの形式にすることが多い。そうすれ
>ば、カーネルを再構築した時に単にそのファイルを置き換えるだけで済む
>から。その為には、second_boot 当たりがファイルシステムを理解して
>読み出すことが必要。と言うことで、そろそろかなぁと思った次第。
なるほど、ありがとうございます。
まったく勉強不足で申し訳ないのですが、
ファイルシステムの実装はどのくらいのボリュームなのでしょうか。
またファイルシステム毎にやはり難易度は違うのでしょうか。
0067デフォルトの名無しさん
NGNG> 除算命令で無限ループになるんだけど、これってx86の仕様?
命令が無限ループになるなんて言う仕様/バグがあるとは考えにくい。
(実プロセサはもとより、bochs にも。) 除算エラー例外のハンドラが
単純に IRET してるとかしてない ?
006858
NGNG> EXT2もNTFSもフロッピーに作れるファイルシステムじゃないし、
すまん、NTFS はダメだね。EXT2 もダメなのか...。
ところで、WindowsNT の FD は FAT12 だけど、Linux の FD ってどう
いうフォーマットなの ?
>>66
> ファイルシステムの実装はどのくらいのボリュームなのでしょうか。
とりあえず、FAT を実装したソースが...
http://cvsweb.netbsd.org/bsdweb.cgi/syssrc/sys/msdosfs/
からダウンロードできるみたい。これは、FAT12/16/32 を含んでいて、
更に書き込みをサポートしているから、ブートローダーとしてならこれ
の半分ぐらいにはなると思う。
> またファイルシステム毎にやはり難易度は違うのでしょうか。
これは、当然そう。同じサイトに、ntfs とか isofs とかもあるから
見比べてみればいいかも。
0069デフォルトの名無しさん
NGNGつーか、PC互換機ではほとんどのOSで
フロッピーのファイルシステムはFAT12。
0070デフォルトの名無しさん
NGNG0x0b〜のBPBを潰してある形式もあったね。
たぶん、BPB決め撃ちなんだと思うけど、
ウインドウズからは読めなかったはず。
0072ひげぽん
NGNGld.exe: warning: cannot find entry symbol startKernel; defaulting to 00000200
../bin/higepos_kernel.o(.eh_frame+0x11):higepos_kernel.cpp: undefined reference to `___gxx_personality_v0'
やろうとしていることは、
higepos_kernel.cppに実装していたVRAMアクセス文字列出力関数を
vga.cppで実装し、呼び出すことです。
vga.cppで実装している_sysPrint2ch関数をhigepos_kernel.cppで
呼び出しているのですが、リンク時に
higepos_kernel.cpp: undefined reference to `___gxx_personality_v0'
というエラーが出てしまいます。
もちろん`___gxx_personality_v0'というものには、
まったく覚えがありません。
リンカのオプションが悪いのでしょうか。
このエラーがエラーが出てしまうソースは、
http://oshigepon.tripod.co.jp/
におきました。
0073ひげぽん
NGNGファイルシステム難しそうだなあ。
0074デフォルトの名無しさん
NGNGリンク時にエントリーを指定しても意味がない。
リンク時先頭にあるコードから実行されるようになる。
2つ目のメッセージは、c++のランタイム関数かと。
例外処理とかその他で利用する奴(要するに必須)でない?
>>73
まだファイルシステムサポートは書く必要ないだろ
ルートからファイルを一つ読み出せればいい
理由:
プロテクトモード移行前のファイルシステムドライバを書いても、
結局2nd bootで利用するだけになり、意味がない。
0075デフォルトの名無しさん
NGNG0076ひげぽん
NGNG>リンク時にエントリーを指定しても意味がない。
>リンク時先頭にあるコードから実行されるようになる。
やっぱりそうですよね。
私もそう思っていたのですが、自信が無くて・・・・
>2つ目のメッセージは、c++のランタイム関数かと。
>例外処理とかその他で利用する奴(要するに必須)ではない?
リンク時にこの必須でない関数をリンクしないオプションがあるのでしょうか。
それともライブラリを見つけてリンクしなければいけないのかな?
0078デフォルトの名無しさん
NGNG>リンク時にこの必須でない関数をリンクしないオプションがあるのでしょうか。
>それともライブラリを見つけてリンクしなければいけないのかな?
gccはよくしらんのだけど、RTTIと例外を無効にするオプションを使ってみたら?
>c++はいろいろあって面倒だから
たとえば、上に上げた例外や、他言語(アセンブラが主かな)とのシンボル名の整合
あとは、cだとランタイムを使わなければ良いだけでも、
c++ではnew演算子とか言語自体の機能なんで、
デフォルトでいらないコードがリンクされたり、それの準備のための初期化ルーチンが用意される。
0079デフォルトの名無しさん
NGNGSecond で FAT12 からファイル読めるのは便利だが。
32bit モードでやるならディスクアクセス BIOS に頼るのもなんだし。
IDT 作ってキーボード割り込み捕まえる辺りのが先では?
0080デフォルトの名無しさん
NGNG0081デフォルトの名無しさん
NGNG> このエラーがエラーが出てしまうソースは、
> http://oshigepon.tripod.co.jp/
> におきました。
ちょっと話題がずれるんだけど、ソースコードアップルーチンにバグない ?
なんか、#include の後ろがなくなってるみたいなんだけど...。
HTML は、'<' や '>' は、特別扱いだからそこら当たりが怪しいかと。
あと、& 等も要注意だね。
0083ひげぽん
NGNG>ld.exe: warning: cannot find entry symbol startKernel; defaulting to 00000200
>../bin/higepos_kernel.o(.eh_frame+0x11):higepos_kernel.cpp: undefined reference to `___gxx_personality_v0'
のエラーが出てしまう件ですが
>gccはよくしらんのだけど、RTTIと例外を無効にするオプションを使ってみたら?
例外を無視するオプション -fno-exceptions
を使ったらばっちりうまくいきました。
ありがとう。
0084デフォルトの名無しさん
NGNGosask
0085ひげぽん
NGNG↓こんな感じで使えるようになりました。
_sysInitVga();
_sysClearScreen();
_sysPrint(" Higepos Kernel start!!\n Powered by 2ch\0");
http://oshigepon.tripod.co.jp/
[問題点・課題]
文字列の終端を'\0'で捕まえようとしているが出来ない。
'\b', '\t'に対応する。
日本語の表示
0086デフォルトの名無しさん
NGNG_sysPrintとか_sysPutCharacterっていわば低レベル文字出力でしょ?
\bとか\tはレイアウトを扱うもっと高レベルな関数でサポートするのが良いと思う
0087デフォルトの名無しさん
NGNG> 文字列の終端を'\0'で捕まえようとしているが出来ない。
どうなっちゃうの ? ちょっと意味が良くわからない。
> '\b', '\t'に対応する。
'\b' は、
if(0 < curX){
backwardCursor();
_sysPutCharacter(' ');
backwardCursor();
}
'\t' は、
while((curX % 8) != 0){
_sysPutCharacters(' ');
}
あたりでどうか。(\t の 直後に \b されるとちょっとまずいけどね。)
> 日本語の表示
これは、ちょっと難しい。そもそもフォントをどのように扱うかが問題と
なる。とりあえず優先順位は落としたほうがいいと思う。
0088ひげぽん
NGNG>_sysPrintとか_sysPutCharacterっていわば低レベル文字出力でしょ?
>\bとか\tはレイアウトを扱うもっと高レベルな関数でサポートするのが良いと思う
あったら便利なのかなと思ったのですが、後述するように\tはめんどくさいですよね。
>>87
> '\b', '\t'に対応する。
>'\b' は、・・・
\bはそんな感じですね。
\tは、\bされたときにどうするかというが非常に面倒くさいですね。
現時点でそこまでして実装するのか!!みたいな・・・
0089ひげぽん
NGNG>>87
>> 文字列の終端を'\0'で捕まえようとしているが出来ない。
>どうなっちゃうの ? ちょっと意味が良くわからない。
C言語では文字列の終端は'\0'ですよね?
そこで
vga.cppでは
void _sysPrint(char* str) {
for (; *str != '\0'; str++) {
_sysPutCharcter(*str);
}
return;
}
のように実装しています。
で呼び出し側で_sysPrint("higepon");とやると
無限ループになってしまうんです。
_sysPrint("higepo\0");だとOK
0090デフォルトの名無しさん
NGNGbochsdbgは試してる?
指定アドレスにブレークポイント張れるから、
ステップ実行してみるといいかも
009187
NGNG> で呼び出し側で_sysPrint("higepon");とやると
> 無限ループになってしまうんです。
> _sysPrint("higepo\0");だとOK
う〜〜〜ん、わからん。_sysPrint("higepon"); とやった時のバイナリ
イメージアップできます ?
0093デフォルトの名無しさん
NGNGfirstbootで18セクタ読んで、
1000h:0000h 2nd boot
1000h:0200h kernel
という配置ですよね?
2nd bootの最後でkernelのアドレスにジャンプしていると思うのですが、
kernelの先頭位置には文字列が来てるじゃないですか。
どうして実行できるんですか?
0094ひげぽん
NGNG>どうして実行できるんですか?
kernelの先頭に文字列とはどういう意味でしょうか?
あれれ何か変なことやらかしてますか?→私
0095デフォルトの名無しさん
NGNGあんたマジすごいよ。
なんですぐ、VGAとか書けちゃうの????
あー俺って、おちこぼれって感じ。
009693
NGNGKernel.binのダンプ
20 48 69 67 65 70 6f 73 20 4B 65 72 6e 65 6c 20 | Higepos Kernel |
73 74 61 72 74 21 21 0a 20 50 6f 77 65 72 65 64 |start!!. Powered|
20 62 79 20 32 63 68 00 00 90 55 89 e5 83 ec 08 | by 2ch...U.....|
〜(略)〜
0008:00001200 20 48 69 and [eax+0x69],cl ; " Hi"
0008:00001203 67 65 70 6f gs a16 jo 0x76 ; "gepo"
0008:00001207 73 20 jnb +0x20 ; "s " *1
〜(略)〜
0008:00001229 90 nop
0008:0000122a 55 push ebp
〜(略)〜
2nd bootからメッセージの先頭に飛んで、
たまたま*1の時の"s "のオペコードが jnb +0x20で、
とんだ先が正常に実行できるコードだったというだけみたい。
で、'\0'の問題は、'\0'を入れたことによって、
「たまたま」とんだ先が正常なコードになっただけで、
cのソースが悪いわけじゃなかったみたい。
009793
NGNG0008:00001200なので、メッセージ(文字列)の中にjumpしてるって事。
009893
NGNG0008:00001261になっているはず
0099デフォルトの名無しさん
NGNG0100ひげぽん
NGNGこの場合、文字列の中にjmpしてしまうことはどのように回避すれば
良いのでしょうか。
文字列部分がkernelの先頭に来てしまうということは、
文字列を変更した場合は、startKernelのエントリポイントが
変わってしまうんですよね。
混乱してきました。
0103デフォルトの名無しさん
NGNGvoid startKernel(void) {
body();
}
void body(void) {
_sysInitVga();
_sysClearScreen();
_sysPrint(" Higepos Kernel start!!\n Powered by 2ch\0");
while (true) {
}
}
010493
NGNGオブジェクト形式を規定して適切にリロケーションしないとダメなのかも知れない。
それから、今はstatic int curXとかは0008:00000000に配置されているはず。
0106デフォルトの名無しさん
NGNGvoid startKernel(void) {
body();
}
// body.c
void body(void) {
_sysInitVga();
_sysClearScreen();
_sysPrint(" Higepos Kernel start!!\n Powered by 2ch\0");
while (true) {
}
}
//
ld -T simple.ls kernel.obj body.obj -o a.exe
objcopy a a.bin -O binary
//
OUTPUT_FORMAT(pei-i386)
SECTIONS
{
. = 0x1200;
.text : { *(.text) }
.data : { *(.rodata) }
.data : { *(.data) }
.bss : { *(.bss) }
}
//
by MinGW
てな感じは?
0107デフォルトの名無しさん
NGNG無理みたいですね
0108デフォルトの名無しさん
NGNGやっぱり、実際のデータを動的に再配置するしか方法は無いみたいですが。
0109デフォルトの名無しさん
NGNG1. リンカスクリプトで、コードセグメントを先頭に持っていく。
2. 実行ファイル形式に先頭アドレスの情報を埋め込んで、ローダーがそれを解
釈して指定された先頭アドレスにジャンプする。
組み込みなんかでは、1. の方が多い。通常の PC アプリケーションでは 2. の
方が多いと思う。私は、VC++ でやっていて標準の link.exe では、1. ができ
ないので、2. でやれないか、.exe ファイルフォーマット (PE 形式) を調査
中。
0110106
NGNG文字列は先頭に来なくなり main が先頭に来ている。
djpp とか linux版 gcc とかは無理なのかな?
いい加減だったので訂正。
// りんく手順
ld -T simple.ls kernel.obj body.obj vga.obj -o a.exe
objcopy a.exe a.bin -O binary
// simple.ls
OUTPUT_FORMAT(pei-i386)
SECTIONS
{
. = 0x1200;
.text : { *(.text) }
.data : { *(.data) }
.bss : { *(.bss) }
}
// 以下より参考
ttp://www.sra.co.jp/public/sra/product/wingnut/
ld マニュアル(binutils-2.11.2) の
3. リンカスクリプト の
3.3 簡単なリンカスクリプトの例 から
0111デフォルトの名無しさん
NGNGstartKernelからbodyを呼び出すのが重要だったんですね。
リンカスクリプトは要らないようです。
リンクすると、自然に以下の配置になるようです。
obj0::data
obj0::code
obj1::data
obj1::code
〜
objn::data
obj0::code
0112ひげぽん
NGNGソース構成を変えたものをアップロードしました。
ばっちりうまく動いております。
http://oshigepon.tripod.co.jp/
ところで例のMinix本でファイルシステムの勉強をしてました。
実現したい機能等はMinixのものと同様かそれ以上なのですが
かけるコードは、絶対それ以下の自信があります(半分本気)
0113デフォルトの名無しさん
NGNGパクリだけど、↑を実装してみるとか
0114デフォルトの名無しさん
NGNGていうか、ファイルシステムの議論って今して意味あるのか?
HDDで運用するfsを決めるより、FDDでの運用をどうするかを決めないといけないし、
カーネルの構造と、デバイスドライバとのインターフェイスを考えないといけない。
大体、fs非依存ではなく、fs依存型のOSを作るつもりですか?
0115ひげぽん
NGNG>>114
>ていうか、ファイルシステムの議論って今して意味あるのか?
ファイルシステムに関して、自分の知識不足を感じたので
勉強しただけっす。
>カーネルの構造と、デバイスドライバとのインターフェイスを考えないといけない。
>大体、fs非依存ではなく、fs依存型のOSを作るつもりですか?
カーネルの構造は考えなければいけないですね。
まあその前にもっと基礎的な部分で足りないところがいろいろとありますが。
0116デフォルトの名無しさん
NGNGそれより、IDT作って、キーボード、FDC、IDEインタフェース
この辺りの割り込み受け付けて通信できないと。
ディスクアクセスが出来なくてファイルシステムが意味ある訳ない。
0117デフォルトの名無しさん
NGNGマイクロカーネルのOSでもカーネルに内蔵するの?
そうでないなら、どうやってロードしてるんだろ。
カーネル自体はブートストラップからの一連の処理で起動するのは分かるけど、
カーネルが記憶装置からドライバをロードするには、
その記憶装置へのアクセスを提供するドライバが必要だし。
0118デフォルトの名無しさん
NGNG0119過去ログ読んでないから外してたらごめん
NGNGFDでもHDDでもルートディレクトリのファイルだけは読みこめるようになってる。
で、そのディスクアクセスはどうやるかっていうとBIOS(int13h)経由でしょ。
FAT12前提でやるなら、ルートディレクトリの位置は決まっているはず。
これもうろ覚え(というよりPC98の記憶)だけど、
同じDOSでも古いバージョンだとIO.SYSのディレクトリエントリの位置も
ファイル本体の開始位置も決まってたような気がする。
「IO.SYSはこのセクタから始まる」って決め打ちで読みこみね。
まあ、ブートセクタ(ミニマムローダ)読みこみ→ローダー読みこみ(bios経由)として、
この後のカーネルイメージとドライバの読みこみを
リアルモードでやるかプロテクトモードでやるか、どっちが良い(あるいは楽)かな。
リアルモード(Win9x式)だと、16bitでファイルシステムにアクセスするために
結局同じものをもう1つ作ることになるけど、
biosを使えば手軽だし、読みこんでから配置をいじったりできる。
プロテクトモード(WinNT式)だと、ローダーに制御が渡ったらすぐにモード遷移するから
ファイルシステムサポート部の他に、FDDやHDDにアクセスする(最小限の)ドライバも
ローダーに組みこむ事になる(ファイルシステムにアクセスできないと、
ドライバを読みこめないから)。
ただ、ドライバやファイルシステム自体は全て32bitモードで管理できる。
個人的には、(とりあえずの間は)ブートはブートと割りきって
ローダーの位置決め打ちでbiosを使って読みこんで
GDT,IDTのセットアップやカーネルイメージのロードまでリアルモードでやっちゃって
カーネル本体の動作を見える(楽しめる)ようにした方がいい気がする。
0120デフォルトの名無しさん
NGNGNT系でもBIOSで読んでるだろ。
ブートローダ専用ドライバなんて話、DDKのドキュメントでも見た覚えないし、
手元のSCSIドライバディスクにも入ってない。
0121デフォルトの名無しさん
NGNGNTでドライバを読んでいるのってプロテクトモード移行後でしょ
で、そのドライバを読み込むのにBIOS使ってるの?
0122デフォルトの名無しさん
NGNGBIOS呼ぶときは当然、リアルモードなりV86モードなりになってるだろ。
各ベンダにブートローダ専用ドライバを作らせるよりよっぽど現実的。
0123デフォルトの名無しさん
NGNGFDDとIDEドライバ(相当のもの)をNDLDRに入れるだけじゃないか。
0124デフォルトの名無しさん
NGNG0125デフォルトの名無しさん
NGNGローダーやカーネルをコンパイルした時点で固定されちゃうじゃん。
0126デフォルトの名無しさん
NGNG0127デフォルトの名無しさん
NGNGふーん、全てのIDEやSCSIコントローラはまったく同じ方法で制御できるのか。
それならMSが1つドライバ作れば済む話だね。
0128デフォルトの名無しさん
NGNGブート時にntldrやntdetectの他にntbootdd.sysが必要らしいんだけど
これはSCSIドライバではないのかな
0129128
NGNG0130120
NGNGフルバージョンのSCSIドライバらしい。
となると、nsoskrnl.exe、hal.dll、bootvid.sys、pci.sys、scsiport.sys、ntbootdd.sysあたりまでがBIOSでロードか?
0131ひげぽん
NGNGキーボート割り込み処理が目標・・・
0132ろうひ男爵
NGNGMINIXみたいなのをつくるの?凄いですね。
0133デフォルトの名無しさん
NGNGこのスレに触発されかかって、OSを作ってみたいと思いかけているのですが。
PowerPCをCPUに選びたいんです。
その場合でもIntel系と作る手順というのは変わらないのでしょうか?
0134デフォルトの名無しさん
NGNG*nix系なのかぁ。
BeやBTRONみたいにRT系の方が面白そうだよなぁ
>>133
ブートはこんなに泥臭くないとおもうが。
0135デフォルトの名無しさん
NGNGドライバまで含めてブートローダで読み込みかぁ。
なら、リアルモードのうちに BIOS でメモリに配置で読み込みのみならできそうか。
ファイルシステム意味あるかも?
>>118
PIC(8259A)設定 > IDTに割り込みハンドラ設定 > in al, 60h する
ttp://www.cqpub.co.jp/column/books/2001a/34331PC_Legacy/default.htm
でなけりゃ EOTA の boot 以下参照で逝け。
0136デフォルトの名無しさん
NGNGポート60hにコマンドを送ると割り込み処理されるのに
キーボードを押してもなんにも反応ないのですが
そういうものなんでしょうか。
0137135じゃないけど
NGNG・その処理ルーチン内でON/OFF(make/breakだっけ?)のどちらであるかを読み、
・リングバッファなりに記録(あるいはシフト状態フラグを変化させる)して、
・処理した事を8259Aに知らせる(どっかのポートを叩く)
じゃなかったかな?
で、他の方法(システムコール等)でそのバッファに記録された内容を読み出すことで
キーボードからの入力を受け取ると思うんだけど。
0138デフォルトの名無しさん
NGNG0139デフォルトの名無しさん
NGNGhttp://www.google.com/search?q=%E6%AD%BB%E3%81%AD%E3%81%B0%EF%BC%9F&sourceid=opera&num=0&ie=utf-8&oe=utf-8
これ見れ。
014045
NGNG>すみません。
> このスレに触発されかかって、OSを作ってみたいと思いかけているのですが。
> PowerPCをCPUに選びたいんです。
> その場合でもIntel系と作る手順というのは変わらないのでしょうか?
CPUの違いはあるけど基本は同じだべ。
そんな事もわからないんですか?
0141デフォルトの名無しさん
NGNG他のソースをみると割り込み処理の基本的な部分は自分で用意したバッファに
コードを保存するということのように思ったのですけど、そのような作業を実は
してるんでしょうか。
>>138
作った処理はの内容は60番ポートからデータを読み込んで、そのコードを
画面に表示し、20hに20hを送るというものです。
bochsにキーボードのログをとるように指定すると、何回もKeyboard mouse disable
calledっていうのがあるのと、押したときにputting scancode * in internal buffer
ってなっているのが気になります。
0142ひげぽん
NGNGsourceforge.jp
sourceforge.net 使っている人いますか?
もしいたら、使い心地、メリット、デメリット等を
教えてください。
0143デフォルトの名無しさん
NGNG参考になるかナー
0144デフォルトの名無しさん
NGNG送るんでなく,キーボード押すて割り込まれたら 60h から in する。
それと PIC に EOI の発行も忘れずに。
137, 141 の書いてることはあってるような雰囲気。
割り込みハンドラではリングバッファなどに入れるだけに留めとく。
後で,キーコードを読み出したいルーチンがバッファから読む。
0145デフォルトの名無しさん
NGNG応援するよ。微力ながら
Σ(゚Д゚;≡;゚д゚) < うお!なんかすごいところに迷いこんじまったぞゴルァ!
./ つ つ \_________________________
〜(_⌒ヽ ドキドキ
)ノ `Jззз
0147デフォルトの名無しさん
NGNG0148デフォルトの名無しさん
NGNG0149デフォルトの名無しさん
NGNG0150デフォルトの名無しさん
NGNGそれはそうと、バイナリフォーマットはどうするん?>ひげぽん
COFFかELFを採用するのが妥当だと思うけど、もしかして独自にするつもり?
そうなると専用リンカを作るか、ldのパッチも作らないといけなくなるね。
0151ろうひ男爵
NGNGキーボードはマスターだから、20hをたたけば良いだけだと思う。
8259_MS,8259_MSMSK,8259_SL,8259_SLMSKのうち、8259_MSでok。
0152os4gd ◆PRisauvg
NGNGまだ取り入れられてない定義なのでもうしばらくしたら
完成できそうです。ただ問題もたくさんあるので
相談していこうかと思います。よろしく
0153デフォルトの名無しさん
NGNG0154デフォルトの名無しさん
NGNGビクッ ∧ ∧ ∧ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
Σ(゚Д゚;≡;゚д゚) < うお!妄想厨が来ちまったぞゴルァ!
./ つ つ \_________________________
〜(_⌒ヽ ドキドキ
)ノ `Jззз
0155デフォルトの名無しさん
NGNG0156ひげぽん
NGNG↓定義して終わってるていうか勉強中です。
typedef struct idtr_st {
unsigned int limit; /*! idtr limit */
unsigned int highbase; /*! base address of idtr */
unsigned int lowbase; /*! base address of idtr */
};
>>150
>それはそうと、バイナリフォーマットはどうするん?>ひげぽん
正直に言うと、バイナリフォーマットにどんな種類があって
どのような特性があるか、不勉強のため分からないので
勉強させてください。
IDT早く終わらせたい。
>どうせならEROSで
これって何ですか?
0157ひげぽん
NGNGOS開発の際にC++を使おうとするならば
new,delete演算子を自分で実装しなければならない
みたいな事が書かれていたのですが、
この辺を実装した例(ソース)とかないですかね。
0158デフォルトの名無しさん
NGNGmallocだとしても自前で定義しないとダメでしょ
少なくとも、今のところは管理すらされてない生のアドレスが露出してるだけだから。
0160デフォルトの名無しさん
NGNGEOTA の memory.c に malloc と free があった。
あと K&R にも malloc と free が載ってる。
0162デフォルトの名無しさん
NGNGだめだって。
それをサポートするための低レベルメモリ管理を書かないと。
MMUって言われている奴。
0163ひげぽん
NGNG486はハードウェアとしてMMUを持っているそうです。
それをソフトウェアとして実装するということですか?
0164デフォルトの名無しさん
NGNGEROSはOSの名前のことだと思うけど・・・先越されてる?
http://www.eros-os.org/
0165デフォルトの名無しさん
NGNGMMU は後回しで、まず、リニアアドレスでメモリ管理の練習ってのは悪くないと思う。
ttp://www.amazon.co.jp/exec/obidos/ASIN/4797304952/ref%3Dlm%5Flb%5F11/249-4037071-2369146
0166デフォルトの名無しさん
NGNG眺めてたんだけど、プロテクトモードに移行する時に
ハードウェア割りこみ(IRQ)のベクタを変更してる。
というのは、186以降で定義された無効命令とかの例外とベクタ番号が重なり
処理が面倒くさくなるから。
だから、8259Aを再初期化して、例外と重ならないように変更するといいかも。
で、例外もエラーコードをスタックに残すのと残さないのがあるから、
何種類かにハンドラを分類してるな。
それと、一般保護例外は特別扱いで、逆アセンブルして
ソフトウェア割りこみやHLT,I/Oポートの違反かを検出しているようだ。
(ページングをONにしているので、DMAアクセスはアドレス変換が必要だから)
その他の割りこみ等はリアルモードの処理ルーチンをセットしてiretdしてた(V86だから)。
特別な処理が必要ない場合は、ハンドラの先頭で
push imm ; ←割りこみ番号
jmp short INTR_Handler
みたいな感じでまとめてしまってる。
ハンドラの最後は必ずiretdしなければいけないからアセンブラになるけど、
その中からCのルーチンを呼ぶようにしておいて
実際の処理はC/C++で書くのが楽なんじゃないのかな。
0167デフォルトの名無しさん
NGNGちょっとオーバーヘッドが気になるね。
x86はせっかく割り込みベクタテーブル式で提供してくれてるんだから、
俺は有効活用したいと思うな。
あと、割り込みハンドラであんまりスタック使いたくないしね。
0168デフォルトの名無しさん
NGNGうん、これはその通りだと思うけど、
実際、アセンブラソースに256個書いて保守するのはどうかと思ってさ。
でも
> ちょっとオーバーヘッドが気になるね。
はどうだろ。
そもそも、割りこみ処理は特権レベルの移行やらタスクの移行やらで
普通のjump/callとは比較にならないほど複雑な処理をしてるよ。
スタックもゲートに指定したパラメータサイズ分だけコピーされて
一般的にカーネルスタックが使われるし。
確かに、カーネル内部でのスタック使用量は僅かに増えるかもしれないけどさ、
それでも気にするほどのことかな。
まあ、俺はコード書かないで口を出してるだけなんで、
変だと思ったら聞き流してくださいな。
0169デフォルトの名無しさん
NGNGハードリアルタイムのOSを実装できたらいいなと思い、勉強しているのですが
・特定タスクのデッドラインを守れなかった場合はどうしたら良いんでしょうか。
・タイマーで厳密な意味で1msを計ることが出来ないのですが(n.nとなり、多少誤差が生じる)、
この揺らぎってどうしたら良いんでしょうか。
0170168
NGNG割りこみでタスクが切り替わるのはタスクゲートだけだね、確か。
割りこみゲートやトラップゲートではコールゲート呼び出しと同じなので、
タスクは切り替わらない(当たり前)。
スタックの切替はゲートの特権レベルによって違うかも。
もしかしたらユーザーモード実行中に割り込みが発生した場合のみかも。
よく覚えてないや。ごめん、ホントいい加減で。
0171超先生@OS板 ◆OS/dd1Xc
NGNG< `ー´>y-~~~ OS板より出張。
>>169
> ・特定タスクのデッドラインを守れなかった場合はどうしたら良いんでしょうか。
何があろうとdeadlineを死守する必要があるからhard-realtimeなのだが。。。
> ・タイマーで厳密な意味で1msを計ることが出来ないのですが(n.nとなり、多少誤差が生じる)、
> この揺らぎってどうしたら良いんでしょうか。
そのプラットフォームは?
PC/ATの場合は1.19318MHzでドライブされてるから、
8254Aのカウント値を補正する必要があるけど。
>>170
スタックが切り替わるのは、non-conformingで上位のprivilaged-levelへ遷移する場合だったと思う。
0172デフォルトの名無しさん
NGNGレスどうもです。
>何があろうとdeadlineを死守する必要があるからhard-realtimeなのだが。。。
勿論それは承知してますし、普通は起きそうもないケースなのですが、
動的タスク生成をサポートする非組み込みのRTOSって出来ないかなって思ってるので、
最高優先度のタスクが処理能力の上限を超えて作られた場合の心配をしてます。
>8254Aのカウント値を補正する必要があるけど。
やっぱり補正する必要があるんですね、適当なOSのソースを見るのがよさげですね。
0173ろうひ男爵
NGNGlinkers&loadersっていうズバリの本がオーム社から出てるよ。
coffもomfも出てて3200円は安いっす。
386関連の本は、
80486の使い方 スルヤント オーム社
で、用語を覚える
はじめて読む486 アスキー
で、動かしてみる
386BSDカーネルソースの秘密 アスキー
で、大規模実装の例を見る
自分はといった感じで読み進めました。
それとは別に8259A,8251,8253,8255の各サンプルを読みました
0174デフォルトの名無しさん
NGNG0175デフォルトの名無しさん
NGNGの下巻だけあれば事足りる感じなんだが。
0176デフォルトの名無しさん
NGNG事足りるって?
0177デフォルトの名無しさん
NGNGはじめて読む〜系の本は必要ないと思う
0178ひげぽん
NGNG突破口が開けたかも・・・
0179デフォルトの名無しさん
NGNG0180デフォルトの名無しさん
NGNG0181ろうひ男爵
NGNGlodsでcsの時には、
lods byte ptr cs:[si]
ですよ>ひげぽん
0182ひげぽん
NGNG>odsでcsの時には、
>lods byte ptr cs:[si]
>ですよ>ひげぽん
すいませんもう少し詳しくお願いします。
だれか。
idtの8byteのうち先頭から
2byte
2byte
1byte
1byte →ここ。
2byte
の部分って0xf、0xeとかが入ると思うんですけど
値とその意味の詳細とか載っている資料とかWeb上でありましたら
教えてください。
0183デフォルトの名無しさん
NGNG5.9.IDTディスクリプタ
に詳細が書いてある
0184ひげぽん
NGNGありがとう。
覚悟を決めて読むしかなくなくなってきた(笑)
0185デフォルトの名無しさん
NGNGhttp://www.intel.co.jp/jp/developer/design/pentium4/manuals/
ここからだね。
でも、どっちが良いんだろ。なんかサイズ違うし。
pen4向けのガイドが少し増えてるのかな。
(俺が昔落としたpen3向けのpdfは見当たらない)
0186デフォルトの名無しさん
NGNGすごく丁寧に書いてあると思うんだけど。
0187デフォルトの名無しさん
NGNG将来P4についても調べたくなったとき、差分を探して読む手間が省ける。
0188ろうひ男爵
NGNGごめん、ひげほんさんじゃなかったですね。
お詫びに、IDT
07bit P
06bit DPL
05bit DPL
04bit 0
03bit 1
02bit 1
01bit 1
00bit 0:割り込みゲート,1:トラップゲート
です。
0189ひげぽん
NGNGありがとう。
軽く読んでみたところでは
11101110=0x76
かなと思っています。
0190超先生@OS板 ◆OS/dd1Xc
NGNGinterrupt-requestを受け付ける用途には、
P=1,DPL=0,interrupt-gate
で10001110=0x8eが一般的だと思う。
0191ひげぽん
NGNG>interrupt-requestを受け付ける用途には、
>P=1,DPL=0,interrupt-gate
>で10001110=0x8eが一般的だと思う。
最も大きい特権レベルとして安易に1としてはだめということですね。
load idtrを実行するところまで一応実装してみたのですが、
見事に3rd exceptionになりました。
load idtrまでは、一応何事もなく。動くのですが
割り込み許可(_sysUnlock=sti)すると例外があがります。
そもそも、いまWebにアップロードしている
ひとつ古いバージョンでも_sysUnlockすると例外があがる気がする。
なんでだ・・・・・
0192超先生@OS板 ◆OS/dd1Xc
NGNG< `ー´>y-~~~
>>191
>3rd exception
IDTが正しく指されていないか、もしくは
GateのSegment-selector値が不正というところか。。。
>load idtrを実行するところまで一応実装してみたのですが、
PIC側でINTRを止めておかないと、
stiした瞬間に設定されていないベクタ(ゲート)へ飛び込んでしまうけど。
もしくはダミーでもよいのでIRQハンドラを立てておく必要あり。
0193ひげぽん
NGNGありがとうございます。
>IDTが正しく指されていないか、もしくは
>GateのSegment-selector値が不正というところか。。。
この辺からですかね。
>PIC側でINTRを止めておかないと、
>stiした瞬間に設定されていないベクタ(ゲート)へ飛び込んでしまうけど。
>もしくはダミーでもよいのでIRQハンドラを立てておく必要あり
ダミーでハンドラを立てる場合は0から255のうち必要ないものはすべて
ダミーにすればよいんですよね。
セレクタが違うのかなあ。
0194デフォルトの名無しさん
NGNG0195デフォルトの名無しさん
NGNG超先生プログラム書けるじゃない。
おまけゲーム作ってたような。
0196デフォルトの名無しさん
NGNG0197ひげぽん
NGNG今週末の目標は何とかこいつを動かすことですね。
↓
http://oshigepon.tripod.co.jp/
とりあえずダミーのハンドラを用意したので
またアドレス違いとかなのかな・・
ここがおかしいじゃないかなど、突っ込み募集です。
0198超先生@OS板 ◆OS/dd1Xc
NGNG< `ー´>y-~~~
>_sysLoadIdtr((idtr_st*)IDT_BASE);
>void _sysLoadIdtr(idtr_st* idtr) {
>
> asm("lidt (%0) ": :"p" (idtr));
> return;
>}
IDTとIDTRの扱いがゴチャゴチャになってるような・・・。
_sysLoadIdtrにはIDTへのポインタを渡すのが正解。
void _sysLoadIdtr(idt_st* idt) {
idtr_st idtr;
idtr.limit = sizeof(idt_st)*HANDLER_NUM-1;
idtr.highbase = hiword(idt);
idtr.lowbase = loword(idt);
.....
asm("lidt (%0) ": :"p" (idtr));
return;
}
0199デフォルトの名無しさん
NGNGtypedef struct idtr_st {
unsigned int limit; /*! idtr limit */
unsigned int highbase; /*! base address of idtr */
unsigned int lowbase; /*! base address of idtr */
};
32ビットコンパイラならunsigned int = 32bitじゃ?
で、IDTRはlimit 16bit、base 32bitの48bit。
0200デフォルトの名無しさん
NGNG0201ひげぽん
NGNGありがとうございます。
ご指摘のIDTR IDTの混同部分と、
IDTRのサイズ間違いを修正いたしました。
http://oshigepon.tripod.co.jp/
あいかわらず3rd exceptionが発生いたします。
>>200
構造体の詰め物とは何でしょうか。
構造体が自分の期待しているサイズと異なってしまうということでしょうか。
0202デフォルトの名無しさん
NGNG0203超先生@OS板 ◆OS/dd1Xc
NGNG↓で十分だと思う。。
typedef struct idtr_st {
unsigned short limit; /*! idtr limit */
unsigned int base; /*! base address of idtr */
};
/* idtr set up */
idtr.limit = sizeof(idt_st) * HANDLER_NUM -1;
idtr.base = IDT_BASE;
0204超先生@OS板 ◆OS/dd1Xc
NGNG/*! struct for interrupt handler */
typedef struct handler_st {
int number; /* handler number */
int (*handler)(); /* pointer to handler function */
};
>/* set idt */
>idt->offsetL = (int)(p->handler) & 0x0000FFFF;
>idt->offsetH = ((int)(p->handler) & 0xFFFF0000) >> 16;
・戻り値や引数を伴う関数は直接ゲートには置けない。
・外部割り込み要因からの復帰はiretd命令を使用する必要がある。
・なので、stack frameを破棄するコードは自分で実装する必要がある。(例えばenter,leave命令)
0205ひげぽん
NGNG構造体のサイズを調べました。
size of idtr_st = 6byte
size of idt_st = 8byte
となりました。
>>203, 204 超先生@OS板さん
ありがとうございます。
>・戻り値や引数を伴う関数は直接ゲートには置けない。
handlerの戻り値をvoidにしました。
とりあえず割り込みがあったら、ハンドラにジャンプし
そのなかで無限ループに入るというのを最初の第一歩として
やろうかと思っております。
3rd exception 発生中。
http://oshigepon.tripod.co.jp/
0206デフォルトの名無しさん
NGNGねえねえこれ間違ってない ? (外出だったらスマソ)
#define IDT_HIGHBASE 0x6800 /* idt low base address */
たぶん上の行をコピベしたと思うけど、0x0000 だと思うが...。
(ついでに、コメントも直しておいた方がいいと思う。)
というか、俺なら IDT_HIGHBASE と IDT_LOWBASE の定義を止めて
/* idtr set up */
idtr.limit = sizeof(idt_st) * HANDLER_NUM -1;
idtr.highbase = (IDT_BASE >> 16) & 0x0000FFFF;
idtr.lowbase = (IDT_BASE >> 0) & 0x0000FFFF;
と書くと思う。
あと、3rd Exception が発生した時のログ (レジスタの値) を見せて
あげると、わかる人ならバグの場所が特定しやすくなると思うよ。
(俺には、無理だけど...。) がんばってね。
0207ひげぽん
NGNG間違っております。やらかしてました。
訂正いたしました。
3rd exceptionがおきたときのレジスタ内容です。
# In bx_gui_c::exit(void)!
00000309028i[CPU ] protected mode
00000309028i[CPU ] CS.d_b = 32 bit
00000309028i[CPU ] SS.d_b = 32 bit
00000309028i[CPU ] | EAX=00000fc4 EBX=00000000 ECX=0000a7c0 EDX=0000a7c0
00000309028i[CPU ] | ESP=00000fd8 EBP=00000fec ESI=000000ee EDI=0000ffe4
00000309028i[CPU ] | IOPL=0 NV UP EI PL NZ AC PE NC
00000309028i[CPU ] | SEG selector base limit G D
00000309028i[CPU ] | SEG sltr(index|ti|rpl) base limit G D
00000309028i[CPU ] | DS:0010( 0002| 0| 0) 00000000 000fffff 1 1
00000309028i[CPU ] | ES:0010( 0002| 0| 0) 00000000 000fffff 1 1
00000309028i[CPU ] | FS:0000( 0000| 0| 0) 00000000 0000ffff 0 0
00000309028i[CPU ] | GS:0000( 0000| 0| 0) 00000000 0000ffff 0 0
00000309028i[CPU ] | SS:0018( 0003| 0| 0) 00000000 00000000 1 1
00000309028i[CPU ] | CS:0008( 0001| 0| 0) 00000000 000fffff 1 1
00000309028i[CPU ] | EIP=000012cf (000012cf)
========================================================================
Bochs is exiting with the following message:
[CPU ] exception(): 3rd exception with no resolution
========================================================================
0208ひげぽん
NGNG結構重宝するかも。
0209超先生@OS板 ◆OS/dd1Xc
NGNG>idt_st* idt = (idt_st*) IDT_BASE + p->number * sizeof(idt_st);
演算が間違っているのでは。
↓こうだと思う。
idt_st* idt = ((idt_st*) IDT_BASE) + p->number;
0210ひげぽん
NGNGたびたびありがとうございます。
>/* idt size = 64bit */
>idt_st* idt = (idt_st*) IDT_BASE + p->number * sizeof(idt_st);
この計算の意図は、IDTをnumber番目にセットする
ためのアドレス計算なのですが・・・
sizeof(idt)倍しなくて良いんですか???
うーーん、でもとりあえず直してみるです。
きっとおいらが間違えているんだろうな・・・
3rd exception 発生中。
http://oshigepon.tripod.co.jp/
rb2html.rbに感謝!
0211デフォルトの名無しさん
NGNGここが踏ん張りどころだ。がんばれ。
0212超先生@OS板 ◆OS/dd1Xc
NGNG22| unsigned short limit; /*! idtr limit */
23| unsigned short highbase; /*! base address of idtr */
24| unsigned short lowbase; /*! base address of idtr */
25| };
little-endianなのでhighbaseとlowbaseは逆かな。
0213ひげぽん
NGNG大変ありがとうございます。
3rd exception 回避できました。
たぶん自分ひとりでは絶対気づきませんでした。
とりあえず画面上にdummyと表示されたので
何らかの割り込みが発生を捕まえたようです。
ありがとうございます。
http://oshigepon.tripod.co.jp/
割り込みcatch成功版
0214ひげぽん
NGNG大変お世話になっております。
超先生@OS板さんって、どんな人なんですか。
OSを作られたりしているのでしょうか?
今の私からすると、かなりすごい人です・・・・
0215デフォルトの名無しさん
NGNGなんか、偉い人召喚しちゃったの?
0216デフォルトの名無しさん
NGNGおめでとう。
0217デフォルトの名無しさん
NGNG0218デフォルトの名無しさん
NGNGOS板で最も実力を持っていると思われるヤシ。
当地ではチョンのAAを使って話をするので時々チョン先生と呼ばれることもある。
0219デフォルトの名無しさん
NGNGしかも、かなり進化してる・・・
ひげぽんお前さん本気だな。
source forgeでプロジェクト申請したら???
0220デフォルトの名無しさん
NGNGAPIはどうするの?
0221デフォルトの名無しさん
NGNG0222ひげぽん
NGNG>source forgeでプロジェクト申請したら???
もうすこし成熟してからにしようかと・・・
後は賛同者がいればって感じです。
>>220
>APIはどうするの?
C++のクラスライブラリとして提供できればと思っているのですが、、、
まだ先ですね。
0223デフォルトの名無しさん
NGNGC++のクラスはやめとけ。
どうしてもというのなら、低レベルAPIをC互換で作り、
WinのCOMのような形で提供するべき。
0224ひげぽん
NGNG>C++のクラスはやめとけ。
>どうしてもというのなら、低レベルAPIをC互換で作り、
>WinのCOMのような形で提供するべき。
理由も教えていただけるとありがたいのですが、
何かの経験上でしょうか。
もちろん低レベルAPIはCの関数として実装するとは思いますが、
C++のクラスでメインの機能を提供しようと思っています。
OSの主要な機能は、そのインスタンスを介して利用する形にしたいです。
インスタンス間(OSのさまざまな機能間)の連携は
observerパターンなどを使おうと思っています。
0225デフォルトの名無しさん
NGNGC++の名前修飾や呼び出し規約はコンパイラ間で互換性がまったくない。
0226ひげぽん
NGNGということは、C++でクラスライブラリを提供する場合は
特定コンパイラ向けになってしまうということでしょうか。
良く分からないのですが、C++の標準の機能を利用するだけでも
大きな影響があるのでしょうか。
0227デフォルトの名無しさん
NGNG今からここをメチャクチャにします。
応援ヨロシク!
0228デフォルトの名無しさん
NGNGシンボルをすべてextern "C"にするか、
OSのコンパイルに使ったコンパイラの呼び出し規約と修飾された名前を
理解してくれる処理系でないと、ネイティブの実行ファイルが作れなくなる。
0229ひげぽん
NGNGということは、
higeposはgccでコンパイルしているので
g++用クラスライブリになってしまうということですね。
ということは、higeposのアプリケーションを作るときに
C++コンパイラは、g++を使わなければいけなくなるということですね。
これってアプリ開発者側から見て大きなデメリットでしょうか。
この辺の切り分けが出来ればよいかと思っています。
0230ひげぽん ◆zcp/NZpA
NGNG0231デフォルトの名無しさん
NGNG将来GCCがバージョンアップされたらOS毎再コンパイルが必要だし
0232ひげぽん ◆zcp/NZpA
NGNGgccが下位互換になるとは限らないということですね。
こまったなあ。
独自コンパイラ作るのきっとしんどいだろうし・・・
うーんどうしよう。
今頭の中にあるOSは、オブジェクト指向なんですよ・・・
Cでオブジェクト指向実装するのは面倒だな・・(不可能ではないが)
0233デフォルトの名無しさん
NGNGC++からしか使うことが出来ないようになるから、
やっぱり言語に依存しないインターフェイスモデルを構築した方がいい。
0234ひげぽん ◆zcp/NZpA
NGNGやっぱりCでAPIを提供しているんだろうか。
0235デフォルトの名無しさん
NGNG0236デフォルトの名無しさん
NGNGC++でも提供してるの?それともC++ only?
0237デフォルトの名無しさん
NGNG聞いてみれ。
アドバイスくれるかも。
0238デフォルトの名無しさん
NGNG> C++の名前修飾や呼び出し規約はコンパイラ間で互換性がまったくない。
なんか誤解してない ? そんなこと言うと C だって互換性 100% じゃないよ。
もし、OS の保護機構なんて要らないと言うことで、ユーザープログラムも OS
も全て C++ 等で書いて直接 (あたかもサブルーチンコールのように) 呼び出す
と言うのならその通りなんだけど、普通そんなことはしない。
最近 OS では、API は最終的にはソフトウェア割込みで行っているのが普通。
大概のプロセッサは割込み以外の方法ではユーザーモードからシステムモード
への切替をできないようになってるから、保護機能等を使うのであれば、これ
はほぼ必須。
通常 read(fp, buff, size) とか言ってる API は、全部その言語用のラッ
パーだよ。だから、
>>231
> 将来GCCがバージョンアップされたらOS毎再コンパイルが必要だし
と言うことは無い。第一そんなことしたら、その時動作しているコマンドや
サービス等のプログラムも再コンパイルが必要になる。
ただし、コンパイラが変わったらライブラリの再コンパイルは必要。
0239デフォルトの名無しさん
NGNGあんたも古いな。
最近は割り込み〜じゃなくて、割り込み自体は昔から使われていた。
それより一歩進んだ方法として、たとえばIA32ではコールゲートがある
0240デフォルトの名無しさん
NGNG>サービス等のプログラムも再コンパイルが必要になる。
名前修飾に互換性がある保証がないから、
存在しないシンボルを呼び出すことになる可能性があるって事だろ
0241ひげぽん ◆zcp/NZpA
NGNGところで
OSのカーネルがC++で組まれている事と
OSの提供するAPIがC++のクラスライブラリであることは
ある程度別問題として考えることって出来ますか?
うーん日本語が変ですね・・・
0242デフォルトの名無しさん
NGNG> それより一歩進んだ方法として、たとえばIA32ではコールゲートがある
コールゲートが一歩進んでいるかは別にして、コールゲートを使っても
話は一緒だよ。IA32 プロセッサは保護モードの時に far Call を割り込
みの様に扱うだけだよ。(スタックのコピーとか特権チェックとか色々プロ
セッサでやってくるけどね。) 普通のサブルーチン呼び出しと同じように
は呼べないよ。
コンパイラを改造して OS 呼び出しって言うのを認識する (例えば、関数
の属性として API 属性と言うのを定義できるようにして、その関数を呼び
出す時は far Call を生成する。) ようにすれば、呼び出すことはできる
ようになるとは思うけど、ポインタ経由で呼び出された時にも対応する
(=ポインタにそう言う属性をつける ?) とか考えると、あんまり実用的に
は思えない。
>>241
基本的には別問題。
ファイル操作 API を C++ 風に...
file f;
f->open("foo", ReadOnly);
f->read(buff, size);
f->close();
となるけど、これアセンブラレベルで見たら全て this ポインタを伴って
呼び出されている。結局今時の OS で、ファイルディスクリプタを使うの
と (OS から見れば) 大して変わらない。
今時の OS は、デバイスでもファイルでも同じ方法で、read/write でき
るけど、結局これも OS 内で C++ で言うところの仮想関数呼び出しをし
て実現している。そう言う意味で、カーネル (特にデバイスドライバ) を
C++ で書くとそれなりにきれいになるのではとちょっと期待している。
0243デフォルトの名無しさん
NGNGwindowsのdllのインポートライブラリのように、
スタブを用意すればいいんじゃないの?
0244デフォルトの名無しさん
NGNGdll 作成した時にできるヘッダーファイル見たことありませんか ?
__declspec(dllimport) と言う思いっきり Microsoft 独自 (とは限らないけ
ど、ANSI 非互換の) 関数属性が定義されてますよ。
>>242 に書いたコンパイラの改造は、あくまでも一例です。他にも、OS の API
関数は例えば、0x00010000 以下に置くと決めといて、その領域はわざとユー
ザー空間にはマップしないでおく。API 関数が呼び出されたら、アクセスエラー
の例外が発生するので、これをトラップしておもむろに OS 側でどのように呼び
出されたかを調べて本物の関数を呼び出すようにすれば、コンパイラの改造はい
らない。
0245デフォルトの名無しさん
NGNG> この辺はこれからの設計にもかかわる重要項目ですね。
そろそろ、作ろうとしている OS の特徴を決める時期かも...。
0246ひげぽん ◆zcp/NZpA
NGNG>基本的には別問題。
>ファイル操作 API を C++ 風に...
>file f;
>f->open("foo", ReadOnly);
>f->read(buff, size);
>f->close();
OSのカーネルをC++で実装したとします。
例えばファイルシステムの一部を
構造体や連結リストで表現するのではなく
クラスで表現したとします。
しかし公開するAPIはCの関数で、その関数の中でクラスライブラリを操作
している場合も何か問題が発生するのでしょうか。
分かりづらい質問かもしれませんが・・・
よろしくお願いいたします。
0247デフォルトの名無しさん
NGNG0248デフォルトの名無しさん
NGNG問題ない。
0249ひげぽん ◆zcp/NZpA
NGNG>そろそろ、作ろうとしている OS の特徴を決める時期かも...。
まさに、今その時期かも。
とりあえず開発側から見たつくりの特徴としては
・カーネルの機能をコンポーネント化して、そいつらの結びつき
は疎結合(メッセージング?)
・当面は、CUIだけ。unixのようにGUIはサーバーを通す?
・入出力を何らかの方法で高度に抽象化したい。
・当然日本語OK(マルチバイト対応)
・ネットワーク機能はOSにくみこむ??
・出来れば分散環境を意識したつくりにしたい。
・とにかくつくりをすっきりしたい、設計・実装どちらもスマートに
ある程度パフォーマンスを犠牲にしてもきれいなつくりを維持する。
・過去の遺産は引きずらない
いま思いつくのはこれくらいかな。
0251デフォルトの名無しさん
NGNGunixでもデバイスをファイルとして扱えるけど、
具体的にどう抽象的でないと思う?
>・当然日本語OK(マルチバイト対応)
これは何?
CES依存で作るの?
>・出来れば分散環境を意識したつくりにしたい。
分散カーネルなんて聞いたこともないけど、どうすんの?
DCOMのような分散システムをもっとアプリケーションよりの層に作るのなら、
他OSでも実現されているし、実現自体は特に問題ないと思うけど。
0252デフォルトの名無しさん
NGNGそん時は、リンカがサンクコードとリンクするだけのこと。(一段階の間接参照
だけだけど) API のラップと概念的には変わらないよ。
0253DQN
NGNG0254ひげぽん ◆zcp/NZpA
NGNGこんばんわ
>unixでもデバイスをファイルとして扱えるけど、
>具体的にどう抽象的でないと思う?
うーん。すいませんまだきっちりと固まってないので
表現しきれないのです。インターフェースとしては同じですが。
内側の仕組みをもっとすっきり出来ないかなと・・・
>>・当然日本語OK(マルチバイト対応)
>これは何?
>CES依存で作るの?
無知ですいません。CESってなんですか。
2byte文字もきちんと意識しようってことです。
0255デフォルトの名無しさん
NGNG0257ひげぽん ◆zcp/NZpA
NGNG以下の募集を行います。
まじめです。
http://pc3.2ch.net/test/read.cgi/tech/1024411711/
[募集]
higepos(仮称)の開発PJの要員
higeposとは、2002/06/18から開発が始まった新しいOSです。
とりあえずひげぽんは本気でOSを作ろうと考えています。
[現在のメンバー]
プロジェクトリーダーのひげぽんだけです。
[これからの予定タスク]
(1)簡単なプロトタイプの実装。http://oshigepon.tripod.co.jp
(2)OSの設計。
(1)(2)を並行して行っていこうと思います。
[注]
ひげぽんは、仕事をしているため
higeposの開発ばかりに完全には専念できません。
ご了承ください。
興味がある方は、ひげぽん宛にメールをください。
Subjectを[higepos]としていただけるとありがたいです。
Webデザイナーさんとかも来てくれたらうれしいです。
ひげぽんはデザインセンスが0なので・・・
0258ひげぽん ◆zcp/NZpA
NGNG現状の知識は問いません。
そのとき必要な知識を勉強すれば良いですし。
役割分担があると思うので。
メールはすぐに返事を出します。
もし2日たっても返事が来ない場合は、すいませんがここに書き込みしてくれると
ありがたいです。
0259デフォルトの名無しさん
NGNG>内側の仕組みをもっとすっきり出来ないかなと・・・
内側の仕様ってドライバ依存では?
>無知ですいません。CESってなんですか。
検索しようよ。
>2byte文字もきちんと意識しようってことです。
2byte文字をOSが意識すると言うことは、2byte文字を特別視すると言うことでしょ?
要するに2byte文字に依存してる。
たとえば、UNICODEとか、もっと別のコードは想定しないって事?
0260デフォルトの名無しさん
NGNGttp://korbit.sourceforge.net/
0261デフォルトの名無しさん
NGNGどこまでをカーネルと呼ぶかによって変わってくるけど、
システムコールのリクエストを複数のサーバーへの分散要求に変換してくれるわけでもないし、
基本部分はやっぱり各マシン毎で動いているから、分散カーネルとは言えないと思うんだが。
0262ひげぽん ◆zcp/NZpA
NGNG>>内側の仕組みをもっとすっきり出来ないかなと・・・
>内側の仕様ってドライバ依存では?
I/Oの下層レイヤー(ドライバレベル)を上位のレイヤーでラップして
抽象化するときにすっきりとしたいなと考えています。
でもこれは、現状のUNIXがどういうアプローチを採っているのか
正確には知らないので、車輪の再発明っぽくなるかも・・・
>>無知ですいません。CESってなんですか。
>検索しようよ。
そうですね。しばらく時間をください。
>>2byte文字もきちんと意識しようってことです。
>2byte文字をOSが意識すると言うことは、2byte文字を特別視すると言うことでしょ?
>要するに2byte文字に依存してる。
OS内部で採用する文字コードをマルチバイト(2byteとは限らない)
の文字コードにするという意味です。
なので、2byte文字を特別視するという意味ではないです。
0263デフォルトの名無しさん
NGNG>は疎結合(メッセージング?)
マイクロカーネルとか調べてみては?
0264sage
NGNGそれならいっぱいあるぽん!
とりあえず↓あたりは有名だぽん・・
ttp://www.menuetos.org/
ttp://www.skyos.org/index2.html
ttp://www.atheos.cx/
ttp://cosmoe.com/
ttp://syllable.sourceforge.net/
0265デフォルトの名無しさん
NGNG0266デフォルトの名無しさん
NGNG>>262
>OS内部で採用する文字コードをマルチバイト(2byteとは限らない)
>の文字コードにするという意味です。
>なので、2byte文字を特別視するという意味ではないです。
てことは、1byte、2byte、4byteとかいろんなバイトの文字コードを扱えるようにするって事?
結構処理きつくならないか?
それならいっそunicodeで統一(以下略
0267ろうひ男爵
NGNGyaccとlexを使うのが良いのでは?
自分は使わずに手で実装しましたが、大変でしたよ。
特にスタック関連の再帰が面倒でした。
字句解析には、力業で文字列のコンペア取ってましたが、
ハッシュに変えたらスゲー早くなりました。
でも、c言語レベルの物を作るならならそんなに大変ではないと思いますよ。
といっても、フルにやって2ヶ月はかかるでしょうけど。
しかも、os側でmmuを使って0からのアドレスにマップすれば、
アロケータは必要ありませんし、セグメントの用途固定にすればokですしね。
コンパイラは、ネイティブコード出力だけでなく、
共通の中間コードも出力できたら楽しいかもしれませんね。
0268デフォルトの名無しさん
NGNG0269デフォルトの名無しさん
NGNG0270デフォルトの名無しさん
NGNGせっかくOS開発として形になろうとしてきたところに、
言語から作れなんて言う水を差すような発言はどうかと思うぞ
0271ろうひ男爵
NGNGすまぬ。
0272ひげぽん ◆zcp/NZpA
NGNGなるほど言語ごと作るとは・・・
フルにやって2ヶ月って、宝くじが当たったらやろうかな。
仕事がなけりゃ、やってみたら面白いと思うけど
生活できない・・・
>>270,>>271
いえいえ。
確かにそこまでやったらかなり面白い!!
とは思います。でも今は無理です。
募集したのに誰もメールくれないと言ってみるテスト。
当分一人やるしかないようです。
もっとレベルが上がってから再募集します。
0273デフォルトの名無しさん
NGNG漏れはsourceforgeにプロジェクトが立ち上がったら参加したいです
少なくとも、今の段階ではひげぽん一人で楽しみながらやるのが良いと思う。
個人で把握しきれない規模でもないしね。
0274ひげぽん ◆zcp/NZpA
NGNGが、つまずいています。
キーボード割り込みハンドラを作成してIDTを登録しました。
Bochs上でキー入力をしてもハンドラが呼ばれた形跡はありませんが
裏のコンソールに「nternal keyboard buffer full, ignoring scancode.(a1)」
と出るのでbochs自体は、キー入力は受け付けていると思います。
ハンドラは以下のようなものです。キーボード割り込み以外のハンドラも
下記と同様の作りです。
void keyStrokeHandler() {
_sysPrint("key stroke\n");
asm("mov %ebp,%esp");
asm("pop %ebp");
asm("iret");
return;
}
0275ひげぽん ◆zcp/NZpA
NGNGおお!結構うれしいです。
ちなみに募集をしたのもそろそろsource forgeでプロジェクト化しようと
思ったからです。
誰もメールをくれないのでめげていたところです。
source forgeってオープンソースでなければいけないんでしたっけ?
のちのち面倒なことにならないようにその辺はしっかりと
調べなければと思いつつ後回しになっています。
0276デフォルトの名無しさん
NGNG>>259
OS関連の用語としてのCESは下記のようなことでよろしい?
CES = Character Encoding Schemeの略。 文字符号化方式。
参考リンク(google で "CES 依存 文字" で検索してめぼしいものをピックアップ)
ttp://www.inac.co.jp/~maki/ruby/ruby-i18n.html
ttp://tsukuba.m17n.org/mule-ja-archive/2000-1/msg00033.html
ttp://tsukuba.m17n.org/mule-ja-archive/2000-1/msg00034.html
ttp://www.emaillab.org/mutt/linuxjapan/mutt200111.pdf
# この辺りの話は glibc のようなものを作るときに問題にすればよいのでは?
0277デフォルトの名無しさん
NGNGとりあえず、不正なアドレスへのアクセスなどは捕まえられるのかな。
キー入力を捕らえるなら 8259A の初期化辺りはどうなった?
それと、キー入力ならマスターへのEOI撃たないとダメだけど。
>>272
いや、だって、ちゃんとしたページもなけりゃ解説もなし。
内容は「はじめての486」もカバーしきれず。
もし遊ぶならもう少し気合が見たいかも知れず。
0278超先生@OS板 ◆OS/dd1Xc
NGNG∧_∧
< `ー´>y-~~~ それはおそらく
最もプライオリティの高いsystem timer割り込みがEOIされてないから
プライオリティの低いキーボード割り込みを拒否してるだけだと。
stiする前にkeyboard以外のIRQをmaskするなどPICを設定しておく必要がある。
0279ひげぽん ◆zcp/NZpA
NGNGありがとうございます。
こういう書き込みは大変助かります。
文字オブジェクトという考え方はなかなか新鮮でした。
>>277
>とりあえず、不正なアドレスへのアクセスなどは捕まえられるのかな。
>キー入力を捕らえるなら 8259A の初期化辺りはどうなった?
>それと、キー入力ならマスターへのEOI撃たないとダメだけど。
bochs起動時に08h(タイマー?)への割り込みが1回キャッチされてます。
8259A,マスターEOI、調べます。キーワードをありがとうございます。
>いや、だって、ちゃんとしたページもなけりゃ解説もなし。
>内容は「はじめての486」もカバーしきれず。
>もし遊ぶならもう少し気合が見たいかも知れず。
力不足は認めます。
まずはカーネルのプロトタイプの完成を第一優先に
考えているので暖かく見守っていただけたらありがたいです。
0280ひげぽん ◆zcp/NZpA
NGNG>最もプライオリティの高いsystem timer割り込みがEOIされてないから
>プライオリティの低いキーボード割り込みを拒否してるだけだと。
>stiする前にkeyboard以外のIRQをmaskするなどPICを設定しておく必要がある
勉強不足で申し訳ありません。
でも、超先生の予想が当たっている気がします。
0281デフォルトの名無しさん
NGNG0282デフォルトの名無しさん
NGNGIOとかになってくると、もう資料を集めるスキルも多大に要求される。
0283ひげぽん ◆zcp/NZpA
NGNGそうですね。いままでははじめて読む・・ + アマチュアOSのソースを
いくつか眺めながら作っていたのですが
資料集めスキルは本当に重要だと痛感しています。
Minix本は、偏りがあるし・・・
0284デフォルトの名無しさん
NGNG0285デフォルトの名無しさん
NGNGttp://www.amazon.com/exec/obidos/ISBN%3D0201596164
0286ひげぽん ◆zcp/NZpA
NGNGキーボード入力に対して、「一度だけ」ハンドラ呼び出しに成功しました。
その後キーボード入力をしても、何も反応しなくなります。
キーボードハンドラの中でも、EOIしているのですが、
次の割り込みを捕まえることが出来ません。
ところでsystem timerのハンドラってとりあえずは空回りさせとけば良いのでしょうか。
0287ひげぽん ◆zcp/NZpA
NGNG日本語版とかないですかね。
割り込みの資料も英語のものしか見つからなかったので
がんばって読んだのですが、ちょっと疲れました。
0288ろうひ男爵
NGNG1)古いハンドラを呼ぶ
2)EOIを発行 port 20hに20hを出力
が普通だと思う。
0289ろうひ男爵
NGNG周期的に何回も割り込みがかかってきているかチェックしてくださいね。
0290LightCone
NGNGようですが、Cソースをコンパイルした結果の .data セグメントや
.bss セグメントを正しく扱う事の方が優先順位的には高いと思います。
OBJファイル群をリンクした後に出来る実行形式のフォーマット(ELF等)
の資料を入手し、IPLに続く部分もしばらくはアセンブラで書いて、
その実行形式に対するローダーを書いておくか、自分でコンバータを
作って、予めロードしやすい形式にしておくといいです。
それから、32 BIT のCコンパイラが吐き出すコードは、32BIT
プロテクトモードへ移行して、各種の環境を整えてやらないと、
そもそも全く正しく実行できません。
初期時のしばらくの間、安定した32BITのアドレッシングモード
に移行するまではアセンブラで書くのが安全で楽だと思います。
Cコンパイラの吐くコードを実行するのに重要なことは、DS,ES,SSの
セッティングです。そのコンパイラがFLATモデルのコードを吐いている
なら、DS,ES,SS を全て 4GB FLAT に設定する代わりに、ちゃんと
命令中の OFFSET アドレスを全てリロケートする必要があります。
逆に、セグメントモデルのコードを掃いているなら、DS,ES,SSを
正しく設定すれば、リロケート作業は必要有りませんが、ポインタ
を far ポインタで扱う必要が出てきます。お勧めはFLATモデルです。
FLAT モデルの場合のリロケートする方法ですが、それは、実行形式
に埋め込んである「再配置情報」を利用します。そこからは、絶対
OFFSET アドレスが書かれているアドレスと、それに関係した
セグメントの情報が得られます。
0291LightCone
NGNG(多分.data)が最初に来ていると言う状態や、#89,#92 で、文字列の
終端コードが読めないと思っていたら、読めることも有ったりするのは、
実は全てセクションの配置や、OFFSETの再配置問題が関係しているように
思えますので、そこをうまく乗り越えれば、ひとまず小安定した
環境がやってくると思います。
この掲示板を読む限り、なんとなく勘で試したら、動く時も有った、
かのような感じを受けるのですが、そういう姿勢はやめて、もっと
精密に一歩一歩石橋を渡るように前に進んでいくことをお勧めします。
まず、ブートさせる前に、イメージファイルなどをバイナリエディタで
くまなく観察することがお勧めです。
あたりまえのことですが、配置が1バイトでも狂っていれば、
プログラムの論理的なバグがもし一切無くても、全く動くこと
さえできません。
OS作りとは、環境作りであって、カーネルを、Cソースでスイスイ
と書ける状態に持っていけたらば、既にかなり進展したと言っていいと
思いますので、まずはそこに一週間かけても問題は無いと思います。
なお、少しまともなOSを作ろうとすれば、ページングを実装しなければ
なりませんが、アドレスを精密に決める癖がついていないと多分挫折する
ことになるでしょうから、ここで踏ん張りを効かせて、Cソースが完全に
正常に動く所まで持っていけるように、自分の腕を鍛え上げてください。
0292デフォルトの名無しさん
NGNGなんか偉そうだね。
プロテクトモードへは移行しているが?
しかも、raw binaryを吐き出させているから、
DS=ES=SS前提の、offset 0ベースでアドレス情報もキッチリ出力されてます。
>終端コードが読めないと思っていたら、読めることも有ったりするのは、
>>96で原因調査をして、>>111で解決策が出ています。
スレをもっとよく読みましょう。
んで、あなたの云う安定したアドレッシングモードってなんですか?
0293デフォルトの名無しさん
NGNG俺がいいたいのは、たとえ行き当たりばったりだとしても、
今は好きな順番で好きなようにやらせるべきだと思うんだ。
第一にひげぽんの知識が全然無いこと。
今は何をやっても無駄ということはなく力になる段階であると思う。
そして、最も重要な事は、モチベーションを持続させる事であるため、
お仕着せで作業順を決定するのはどうかと。
0294LightCone
NGNGそうだったんですか。
でも、raw binary と言う言葉も、offset 0 ベースでアドレス情報が
出ていると言うことも、このスレだけでは読み取れないと思います(gcc
に詳しくなければ。)。
ともかく、ひげぽんさん、頑張ってくださいね。
#293 さんが言う、モチベーションの維持は一番難しいと思います。
私だって、NWSOSが何を目的に作っているのかも分かっていませんし、
暫定版でもいいから公開しろという声が一部から上がったので、公開したく
無かったバージョンを無理やり公開したら、非難轟々を浴びたわけで、
もともとナケナシのモチベーションは下がりまくりです。
偉そうにしていると思う人もいるようですが、私もひげぽんさんも、立場
は何も変わらないんですよ。最初は何にも無い所から作り始めたんですか
ら、、、。今でもたいしたことは全然無いんですけれど。
まあ、そもそも、コンピュータソフト自体は、その中に使われている
純粋な理論以外の部分では、「簡単」と思われても仕方が無い部分を
持っていて、私自身も、他の分野に比べてかなり簡単だと思っている
わけで、いまさら、OSを作れたぐらいで偉そうにするなと言われても、
私自身が、OSを作ることなんて大したことが無いと自分で思っている
わけで、そういうことを言う人が、何がいいたいのかわからないで困っ
ています。
はっきり言いまして、OSなんてある種の人たちには簡単に作れるはずなん
です。しかし、全世界が、Windowsの呪縛からなかなか離れないでいるこ
ともまた事実で、それは技術的なものよりも、背景事情から来ていること
なんですが、かといって、万人にOSが簡単に作れてしまうと言うわけでも
無いのは事実だと思います。NWSOSごとき、OSと考えるなというのは
最もな意見ですが、それと同様なものさえも、日本ではあまり見かけない
という事実もまたあるんじゃないでしょうか、、、。
0295デフォルトの名無しさん
NGNGttp://www.linux.or.jp/bookreview/BR56.html
0296デフォルトの名無しさん
NGNGなんか偉そうだね。
0297デフォルトの名無しさん
NGNGttp://homepage2.nifty.com/nowsmart/nwsos.htm
ここまでがんばってるんだから多少エラソウに見えてもしょうがない
0298デフォルトの名無しさん
NGNG0299デフォルトの名無しさん
NGNGまたWindows互換でかつ下位互換なら狂喜する
0300デフォルトの名無しさん
NGNGAPI互換でも動くソフトが存在しないんじゃ?
0301デフォルトの名無しさん
NGNG>この作者さん?
> ttp://homepage2.nifty.com/nowsmart/nwsos.htm
>
> ここまでがんばってるんだから多少エラソウに見えてもしょうがない
だから偉そうにしていいのか?ノータリンですか?
0302デフォルトの名無しさん
NGNGご本人はそういうつもりじゃないと思うけどなあ・・・
それなりに情報もってるんだろから排斥しなくてもいいのにと思ったからさ
0303ろうひ男爵
NGNGMSのエミュレーターであるよ。
コンシューマ向けでも何度か企画されたことがある。
0304デフォルトの名無しさん
NGNG企画つーか、高木産業から一機種発売になってます。
0305デフォルトの名無しさん
NGNG>>301
このスレを覗いている人たちや助言をしてくださっている方々のモチベ
ーションを下げる傾向にある(と自分には受け取れた)発言は慎むべきか
と思われ。。。
だって、情報が集まらなくなるじゃないですか?そうなったらお互いに
損ですよね?;-)
>>293
モチベーションの持続・・・大事ですね。最近切に感じます。
とりあえず、
「最初はみんな素人だ、失敗し、学び一人前になる」
「壁を意識できるやつは壁を乗り越える素質を持っている」
とか言ってみるテスト。
# 関係ないレスでスマソ。
0306ひげぽん ◆zcp/NZpA
NGNG>ちなみに、タイマーは、ワンショットではなく、方形派のハズなので、
>周期的に何回も割り込みがかかってきているかチェックしてくださいね。
これは確認できました。
確かに一定の間隔の割り込みで発生しています。
>>290,>>291 LightConeさん
まずは書き込みありがとうございます。
実際にOSを作っている方からの意見は大変貴重でありがたいです。
> この掲示板を読む限り、なんとなく勘で試したら、動く時も有った、
>かのような感じを受けるのですが、そういう姿勢はやめて、もっと
>精密に一歩一歩石橋を渡るように前に進んでいくことをお勧めします。
>まず、ブートさせる前に、イメージファイルなどをバイナリエディタで
>くまなく観察することがお勧めです。
そうですね。確かに、本来であればその姿勢が正しいと思います。
現状自分では、手探り状態でOSを作っている状態です。
本来であれば気を付けなければいけないところに、手が回らず
とりあえず動くものを・・・という姿勢でやっています。
もちろん不定な動きがあれば、原因追求すべきだと思います。
現状作っているものは、位置づけとしてプロトタイプと考えています。
出来がよければそのまま使い続けるかもしれません。
>ともかく、ひげぽんさん、頑張ってくださいね。
>#293 さんが言う、モチベーションの維持は一番難しいと思います
ありがとうございます。
これは最重要項目ですね(笑)
この掲示板に書き込みを下さる方もありがたいです。
0307デフォルトの名無しさん
NGNG0308ひげぽん ◆zcp/NZpA
NGNGさあがんばろう。
0309ひげぽん ◆zcp/NZpA
NGNGでもこのスレは好き。
だからage
0310ひげぽん ◆zcp/NZpA
NGNG恥ずかしい・・・
そもそもageてないし。
反省して今日はもう寝ます。
0311デフォルトの名無しさん
NGNG0312デフォルトの名無しさん
NGNGゴバク(・∀・)ニヤニヤ
0313デフォルトの名無しさん
NGNG0314デフォルトの名無しさん
NGNG0315ひげぽん ◆zcp/NZpA
NGNGプログラム板の某スレッドと間違えました。
大変失礼しました。
こっそり報告です。
sourceforge.jpに昨晩申請し、今朝PJ登録されました。
プロジェクト名は、higeposです。
0316ろうひ男爵
NGNGでは、ちゃんと割り込みは入っているみたいですね。
では、キーボード割り込み単体の問題みたいですねぇ。
タイマーの方もEOIしてるでしょうし、
他の割り込みをmaskしてみてはどうでしょうか。
>>304
フォローありがとう。
そーいえば、高木産業からノーパソの筐体を使ったCEが出てたんですよね。
0317デフォルトの名無しさん
NGNGひげぽん・・・俺は気にしないぞ。がんばれ。
俺は自演でも気にしないぞ。
・・・ぁ〜あ。
0319ひげぽん ◆zcp/NZpA
NGNGありがとう。
引き続き協力者募集中です。
しばらくはsourceforge用の環境構築に時間が取られそうです。
>>316 ろうひ男爵さん
ありがとうございます。
他の割り込みをMASKする方針でちょっとやってみます。
ところで会社から2chを見ようと思うのですが←ダメ社員
どこかのサービスで、ページにアクセスしてURLを入力すると
CGIかなんだかが、URLのページ内容を代わりに表示するみたいなのって
ありませんでしたっけ?
どなたか知っていたら教えてください。
0320デフォルトの名無しさん
NGNGhttp://www.age.ne.jp/x/babya/download/#EseXy
これをどっかにおけばいいんでねの?
0322ひげぽん ◆zcp/NZpA
NGNGなんちゃってunix環境なのでssh,scp,cvsの設定は楽かと思ってたけど
もう少し時間がかかりそうです。
0323デフォルトの名無しさん
NGNG0324デフォルトの名無しさん
NGNG0325デフォルトの名無しさん
NGNG質問やらなんやらはこのスレでした方が良くないか?
フォーラムの方はあれたときの非難用か何かの方が都合良いと思うぞ。
0326デフォルトの名無しさん
NGNGそうね。
今のとこ、こちらのが気楽に書き込みできそうだし。
とりあえず、様子見。
0327ひげぽん ◆zcp/NZpA
NGNGsourceforge.jpのドキュメントは一部古いものがあったり
.netのものだったりして苦労しました。
分かりづらかったのでメモ代わりに方法を書いておきます。
私の環境は
cygwinの
OpenSSH_3.1p1, SSH protocols 1.5/2.0, OpenSSL 0x0090603f
Bad escape character 'rsion'.
■キー作成
ssh-keygen -t rsa
パスフレーズの入力をすると
.ssh/id_rsa.pubというファイルが出来る。
■キー登録
sourceforge.jpにログインし、メニューのアカウント管理を選び
シェルアカウント 鍵の編集で
上記ファイルの内容をそのままペーストする。
数分待ってから
■ログイン
ssh -l username shell.sourceforge.jp
パスフレーズを入力するとめでたくログインできる。
ちなみにcvsは本を買ったので勉強中です。
>>325
了解です。
引き続き協力者募集中です。see >>257
0328ひげぽん ◆zcp/NZpA
NGNG現状のソースをCVS importをしました。
下記からたどっていただけたらと思います。
http://sourceforge.jp/projects/higepos/
本日より開発を開始いたします。
0329デフォルトの名無しさん
NGNG0330デフォルトの名無しさん
NGNG0331デフォルトの名無しさん
NGNG0332ひげぽん ◆zcp/NZpA
NGNG割り込み許可の前に以下の作業をしています。
/* Enable IRQ0 (timer) and IRQ1 (keyboard) at the
8259 PIC chips, disable others: */
outportb(0x21, ~0x03);
outportb(0xA1, ~0x00);
キーボード割り込みハンドラでは
/* EOI is below for IRQ 0-7 */
outportb(0x20, 0x20);
/* iret */
asm("mov %ebp,%esp");
asm("pop %ebp");
asm("iret");
をしています。
timerイベントは、定期的取得できているのですが、
キーボードイベントは一度しかとれないです。
0333FreeDOS教徒
NGNG一度しかキーボードイベントが取れないのでしたら、
出力バッファが満杯なフラグが立ったままなのでは?
これは私の勘なのですが、キーボードコントローラが
フラグを感知して割り込みを発行しないのかも。。
ハンドラでステータスレジスタを操作してやれば如何?
0334ひげぽん ◆zcp/NZpA
NGNGありがとうございます。
最近ちょっとモチベーションが下がり気味だったのですが回復しました。
>一度しかキーボードイベントが取れないのでしたら、
>出力バッファが満杯なフラグが立ったままなのでは?
おっしゃるとおりでした。
まずはキーボードハンドラが呼ばれることを実現するという方針で
進めていたのがあだとなったようです。
importb(0x60)でscan codeを取得するようにしたら
複数回のキーボードイベントを感知できるようになりました。
キーボードイベント取得成功版をcommitしました。
0335ひげぽん ◆zcp/NZpA
NGNGちょっと考えてみました。
以下私の思考の流れです。
キーボード処理を書いてるけどこれってドライバーだよなあ。
OSからみて、ハードウェア割り込みって受動的だ。
とりあえずキーイベント情報は、バッファにためるべきかな。
でもためたキーボードイベントって、アプリケーションはどうやって
受け取るんだろう。
1.アプリケーションに取りに来てもらう。
2.アプリケーションはキーハンドラを用意して、OSはそいつにキー情報
を与えてやる。
どっちにしろ、OSとドライバーの関係をきっちり決めなければ
いけない気がしてきた・・・・
でもその前にメモリをどう管理するかを決めたほうがよいかな。
そうすればmalloc,newもできるようになるし、幅が広がるかも。
ということで、当面の目標は、メモリ管理について調べて実装するという事に
なりそうなのですが、
間違った方向に行ってませんか?
上記よりも大事なことがあるだろ!みたいな突っ込みお待ちしています。
0336デフォルトの名無しさん
NGNG0337FreeDOS教徒
NGNG0339デフォルトの名無しさん
NGNGひげぽんぽん(ハッカー)◆zcp/NZpA
の誕生だ!
0340ひげぽん ◆zcp/NZpA
NGNG作るという設計方針でテストしていたのですが・・・・
リンク時に以下のエラーが出てしまうのですが、
これの解決方法をご存知の方がいたら教えてください。
なお、継承をしなければ以下のエラーは出ません。
ld.exe: warning: cannot find entry symbol start; defaulting to 00001200
../../bin/X86MemoryManager.o(.gnu.linkonce.d._ZTI16X86MemoryManager+0x0):X86MemoryManager.cpp: undefined reference to `__ZTVN10__cxxabiv120__si_class_type_infoE'
../../bin/X86MemoryManager.o(.gnu.linkonce.d._ZTI13MemoryManager+0x0):X86MemoryManager.cpp: undefined reference to `__ZTVN10__cxxabiv117__class_type_infoE'
make.exe: *** [../../bin/third.bin] Error 1
0341デフォルトの名無しさん
NGNGRTTI関連じゃないか?
0342ひげぽん ◆zcp/NZpA
NGNGありがとうございます。
-fno-rtti オプションでコンパイル後
リンクすると
ld.exe: warning: cannot find entry symbol start; defaulting to 00001200
../../bin/MemoryManager.o(.gnu.linkonce.d._ZTV13MemoryManager+0x8):MemoryManager.cpp: undefined reference to `___cxa_pure_virtual'
というエラーが出てしまいます。
仮想関数を使っているのが怒られているのでしょうか。
でももう一息で解決しそうな・・・・
0343超先生@OS板 ◆OS/dd1Xc
NGNG∧_∧
< `ー´>y-~~~ 典型的なC++コンパイラの実装に従えば、
___cxa_pure_virtualは純粋仮想関数の不正な呼び出しを受け止める関数かな。
ダミーでvoid ___cxa_pure_virtual() {}とかしておけばいいかと。
0344ひげぽん ◆zcp/NZpA
NGNGありがとうございます。
自分の実験でも純粋仮想関数を使うと上記のエラーが出ることが分かりました。
基底クラスのクラス宣言で
void MemoryManager::___cxa_pure_virtual() {}
としてみましたが、リンク時に同じエラーが出てしまいます。
純粋仮想関数が使えなくても、何とかなるといえばなるのですが、
のちのちクラスの設計・実装者の意図がうまく伝わらないことが起こりそうで心配です。
0345ひげぽん ◆zcp/NZpA
NGNGただの仮想関数なら大丈夫でした。
0346デフォルトの名無しさん
NGNGextern "C" void __cxa_pure_virtual();
void __cxa_pure_virtual() {}
0347デフォルトの名無しさん
NGNG[libstdc++]
pure virtual な 関数を定義すると
undefined reference to `__cxa_pure_virtual'
や
undefined reference to `vtable for __cxxabiv1::__class_type_info'
が出る。
↓
-lstdc++
ライブラリをリンクするのを忘れてた。
以上。
0348ひげぽん ◆zcp/NZpA
NGNG>extern "C" void __cxa_pure_virtual();
>void __cxa_pure_virtual() {}
これは、別ファイルでこの関数を定義して
pure virtual関数宣言時にヘッダーをincludeして、リンクするということでしょうか?
それとも基底クラス内でのお話ですか。
>>347
OS開発時にライブラリをリンクしてしまってよいのでしょうか。
0349超先生@OS板 ◆OS/dd1Xc
NGNG< `ー´>y-~~~
>>348
> これは、別ファイルでこの関数を定義して
> pure virtual関数宣言時にヘッダーをincludeして、リンクするということでしょうか?
ヘッダをincludeする必要すらなく、全く別のモジュールとして
__cxa_pure_virtual関数をlinkするだけでOK。
0350デフォルトの名無しさん
NGNG0351ひげぽん ◆zcp/NZpA
NGNG>>350
ありがとうございます。
出来ました。別モジュールとしてリンクしたらばっちりでした。
この関数はいずれ、OSレベルで何らかのエラー処理を実装したほうが
良いのでしょうか。
0352デフォルトの名無しさん
NGNG好きにやったらいいと思うけど、こういうややこしい問題は暫く続くよ
だって、仮想関数テーブルはどこに配置されてるとか、そんなレベル
をコントロールしなくちゃいけないでしょ
このレベルだとまだ C で書いた方がいいんじゃないの?
仮想関数の代わりに 関数ポインタ構造体にしておけば?
0353名無しさんだよもん
NGNGそれもパクリですか?(藁
0354デフォルトの名無しさん
NGNG超先生がパクリ?
0356デフォルトの名無しさん
NGNG0357ひげぽん ◆zcp/NZpA
NGNGメモリ管理勉強中。
デマンドページング
セグメント
アドレス変換
難しいですね。
これはなかなか大きな壁だ。
でもやる気出てきた。最近あまり頭使ってないし・・・
たまにはじっくり考えよう。
0358ひげぽん ◆zcp/NZpA
NGNG大雑把に言えば
・メモリを確保する(malloc,new系)
・メモリを開放・後処理(free,delete系)
ですよね。
この二つのインターフェースの実装はたくさんの選択肢があると
思います。
仮想メモリ、ページング等の技術を駆使して賢く作るのが
理想でしょう。
ですが、今の私の技術レベルからする一からそれを実装するのは
難しいと思います。
そこで最低限のメモリ管理機能を実装しようと思うのですが、
どのような管理機能を実装すると勉強になるでしょうか。
もし経験者の方がいたらアドバイス頂けたらうれしいです。
0359デフォルトの名無しさん
NGNGどうやってるのかを調べることからはじめると
理解が進むと思いますよ。
0360ひげぽん ◆zcp/NZpA
NGNGありがとうございます。
メジャーなOSだときちんとした(実装するのは難しい)メモリ管理機能
を搭載していて、ちょっとボリュームありすぎます・・・
昨日今日とメモリ管理について勉強して気づいたのですが、
実験段階であればとりあえず要求されたメモリをただ割り当てて
後始末出来ればよいのではないでしょうか。
とりあえず勉強ばかりだとモチベーションが維持できなくなるので
そろそろ簡単な実装には入れればと思います。
0361デフォルトの名無しさん
NGNG> 実験段階であればとりあえず要求されたメモリをただ割り当てて
> 後始末出来ればよいのではないでしょうか。
極論すれば、とりあえず割り当てだけして解放はほっとくというのでも
良いかも...
static void *Last = 0x10000; // 管理領域の最初
void *Malloc(size_t Size)
{
void *OldLast = Last;
Last += Size;
return Last;
}
void Free(void *p)
{
}
みたいな...。
0362ひげぽん ◆zcp/NZpA
NGNGありがとうございます。
そうですね。
この方針で明日にでも実装してみます。
その後 new演算子も実装しようかなあ。
0363デフォルトの名無しさん
NGNGhigepos上で動作するアプリケーションなんてのは
どうやって作っていくんでしょう?
専用のコンパイラとか必要になるんですか?
0364ひげぽん ◆zcp/NZpA
NGNG>higepos上で動作するアプリケーションなんてのは・・・
興味深い質問です。
今のところ未定ですが、
実行ファイルの形式を決定すればある程度形は決まると思います。
理想は、標準のCおよびC++クラスライブラリとAPI
を提供してフリーのコンパイラでコンパイルすればOK!という形です。
その辺にもし御興味があるなら
ぜひhigeposプロジェクトへご参加ください(笑)
http://sourceforge.jp/projects/higepos/
0365デフォルトの名無しさん
NGNG確かMINIXは仮想メモリ実装してなかったと思う。参考になるかも。
0366デフォルトの名無しさん
NGNG>を提供してフリーのコンパイラでコンパイルすればOK!という形です。
こういうことに突っ込むのもアレだがリンクはしないの?
0367ひげぽん ◆zcp/NZpA
NGNGありがとうございます。
Minix本は一応持っているのですが、ソースまでは追ってないです。
>>366
おっしゃるとおり、リンクしなければならないので
フリーのリンカでうまくいけば吉かと。
0368ひげぽん ◆zcp/NZpA
NGNGくじけるもんか・・・
0369デフォルトの名無しさん
NGNG0370デフォルトの名無しさん
NGNGそれが出来ないJAVAの為のパターンをわざわざ踏襲する必要ないだろうに
0371ひげぽん ◆zcp/NZpA
NGNG>シングルトンパターンなら C言語の領域(関数ポインタ)で書けばいいんじゃないの?
それも選択肢のひとつだとは思います。
>それが出来ないJAVAの為のパターンをわざわざ踏襲する必要ないだろうに
今回のX86MemoryMangerは、メモリを管理するクラスで
インスタンスが2つ以上あることは許されません。
そのためシングルトンパターンが必要なのです。
また、MemoryMangerという抽象クラスを継承していて
いることにより、インターフェースが確定しているので
容易に他のMemoryManagerと入れ替えることが出来るはず・・・
という計画です。
0372ひげぽん ◆zcp/NZpA
NGNGprivate:
X86MemoryManager() {}
~X86MemoryManager();
X86MemoryManager(const X86MemoryManager&);
X86MemoryManager& operator = (const X86MemoryManager&);
public:
char* getMessage();
char* getName();
unsigned long allocateMemory(unsigned long);
unsigned long freeMemory(unsigned long);
static X86MemoryManager& instance() {
static X86MemoryManager theInstance;
return theInstance;
}
};
のように実装したのですが、
link時に
ld.exe: warning: cannot find entry symbol start; defaulting to 00001200
../../bin/higepos_kernel.o(.gnu.linkonce.t._ZN16X86MemoryManager8instanceEv+0x2f):higepos_kernel.cpp: undefined reference to `_atexit'
というエラーが出てしまいます。
extern "C" int _atexit();
int _atexit() {}
としてもだめでした。
うーん。なぜだろう。
0373超先生@OS板 ◆OS/dd1Xc
NGNG< `ー´>y-~~~ いよいよ夏の祭典が始まりか。。。
_atexitはANSIだと↓だと思うけど。
int _atexit( void (__cdecl *func)(void));
0374超先生@OS板 ◆OS/dd1Xc
NGNG0375デフォルトの名無しさん
NGNGstatic X86MemoryManager *theInstance;
if (!theInstance) theInstance = new X86MemoryManager;
return *theInstance;
あとさ、何で atexit にアンダーバー付けて定義してるの?
0376ひげぽん ◆zcp/NZpA
NGNG>int _atexit( void (*func)(void));
ありがとうございます。この定義でも同じエラーが出てしまいました。
atexitが呼ばれないようにすればいいんじゃない?
>static X86MemoryManager *theInstance;
>if (!theInstance) theInstance = new X86MemoryManager;
>return *theInstance;
実はこのクラスに限っては上記の方法を使いたくんないんです。
このクラスのallocateMemory()が、newや、mallocの元となる関数なんです。
このクラスが完成したらnewや、mallocが
使えるようになって、幸せになる予定です。
>あとさ、何で atexit にアンダーバー付けて定義してるの?
_を除いて、コンパイルしてリンクしたら幸せになりました。
ありがとうございます
0377ひげぽん ◆zcp/NZpA
NGNG>超先生@OS板
>いよいよ夏の祭典が始まりか?
夏の祭典てなんですか?
0378デフォルトの名無しさん
NGNG違うか。。。
0379ひげぽん ◆zcp/NZpA
NGNG超先生@OS板さんは、謎多し
0380ひげぽん ◆zcp/NZpA
NGNG何かお勧めな、フリーのツールで一般的なファイル形式のものってないでしょうか。
複数人で開発するので少なくともWindowsおよびunix系のどちらでも編集閲覧
が可能でないとまずいのですが、今のところ候補は、
open office???とかしか思い浮かばないです・・・
UMLが描けたら最高ですが、簡単な図が描けるだけでも十分です。
メモリの図やら簡単なクラス図とか・・・
0381デフォルトの名無しさん
NGNG0382デフォルトの名無しさん
NGNG0383デフォルトの名無しさん
NGNG0384デフォルトの名無しさん
NGNGhttp://pc3.2ch.net/test/read.cgi/tech/1008775775/l50
0385デフォルトの名無しさん
NGNG10点
0386ひげぽん ◆zcp/NZpA
NGNGありがとうございます。
htmlは図形描画が厳しいですね。
pdfって、adobeのWriter以外の編集手段ってあるんでしょうか?
ところで
Gnu diaってどうなんでしょうか?
0387デフォルトの名無しさん
NGNG0388ひげぽん ◆zcp/NZpA
NGNGtexいいですね。
学生のとき愛用してました。
でもtexの本、友達にあげちゃいました。
texかあ、すっかり忘れたなあ。卒論のときは重宝しました。
Wordで卒論かいてるやつが気の毒だった・・・
0389387
NGNG禿同.
…とか言ってる俺がWordで仕様書書きながらこのスレを
見てるわけだ. もう見てらんない….
0390ひげぽん ◆zcp/NZpA
NGNG卒論って、画像とか張りまくって
表とかが多いのでWordがすごい不安定になるんですよね。
とかいいながら、わたしもテスト仕様書をExcelでかいてたりする・・・
0391デフォルトの名無しさん
NGNG0392ひげぽん ◆zcp/NZpA
NGNG0393ひげぽん ◆zcp/NZpA
NGNGそいつのメソッドを使って
new,delete演算子を定義しました。
でも怖くてまだ使えてません。
土日にじっくりと実験してみようと思います。
0394ひげぽん ◆zcp/NZpA
NGNG0395デフォルトの名無しさん
NGNGプロジェクト一覧に入ってたよ。
すごいじゃん。
0396デフォルトの名無しさん
NGNGhttp://www.lysator.liu.se/~alla/dia/
0397デフォルトの名無しさん
NGNG俺も見た。すごいねー。
0398デフォルトの名無しさん
NGNGhttp://pcmania.jp/~osdev/echo/first_boot.asm
これをNASMでコンパイルして実行するだけで3rd exceptionが出てしまいます。
どこらへんが悪いか誰か御教授お願いします…
0399デフォルトの名無しさん
NGNG>これをNASMでコンパイルして実行するだけで3rd exceptionが出てしまいます。
画面には何か表示された?
関連ファイルはすべて提示したほうがきっと、玄人さんたちが
答えやすいと思うよ
OSを作りたいなら、higeposに参加するのもあり
0400398
NGNG自己レス。
恥ずかしながら単にセグメントレジスタについて勘違いしておかしな設定をしてしまっていただけのようです。
それを直したらうまく動いてくれました。
>>399
>>OSを作りたいなら、higeposに参加するのもあり
自分ではペースが遅くてあまり貢献できなさそうなので1人マイペースで作っていく予定です。
0401デフォルトの名無しさん
NGNG0402ひげぽん ◆zcp/NZpA
NGNG>sourceforge.jp に行ったら、Higeposプロジェクトが活発な
>プロジェクト一覧に入ってたよ。
>すごいじゃん
ありがとうございます。でもあれって、何が基準なんだろう。
75.555%みたいな表示があるけど・・・
>>401
>>higeposはGPLなのか…。
sourceforge.jpの申請時にライセンスを選ばなければいけなかったので
GPLにしました。
でもGPLの説明英語だったから多分3/4位しか理解してない。
GPLのデメリットとかあるんですかね。
ちょっと不安になってきた。
一応ライセンスは、変えられるらしいけど。
ただいま、new実験中。
2重インクルード防止を忘れてたので、でいろいろと書き換え中。
0403デフォルトの名無しさん
NGNGttp://icrouton.as.wakwak.ne.jp/pub/e-law/opensource.html
個人的にはBSDが好き。GPLは縛りがきついので使えない事が多い。
でも、ひげぽんがイイ!と思うライセンス形態にすればいいと思うよ。
0404403
NGNG0405ひげぽん ◆zcp/NZpA
NGNG大変有用なリンクをありがとうございます。
とりあえず、GPLのままで行こうかなと思います。
GPLに必要な、COPYINGを追加しました。
0406ひげぽん ◆zcp/NZpA
NGNGmallocやnew演算子の元となる関数で返す、割り当てられたメモリの
先頭アドレスって、CSのなかでのオフセットアドレスで良いんでしょうか。
bochsで以下のエラーが出てしまいます。
実装方法は、>>361のような感じです。
>0000311650e[CPU ] prefetch: running in bogus memory
>0000311652i[CPU ] write_virtual_checks(): write beyond limit, r/w
>0000311687p[CPU ] >>PANIC<< iret: return CS selector null
0407超先生@OS板 ◆OS/dd1Xc
NGNG∧_∧
< `ー´>y-~~~ 念のため確認しておくと、
仮想関数の呼び出し(allocateMemory)自体は問題ないのかな?
仮想関数テーブルが初期化されていないため、
running in bogus memoryになってる気がする。
0408デフォルトの名無しさん
NGNG0409ひげぽん ◆zcp/NZpA
NGNG超先生@OS板さん、いつもありがとうございます。
>仮想関数テーブルが初期化されていないため、
>running in bogus memoryになってる気がする。
X86MemoryManager& mm = X86MemoryManager::instance();
_sysPrintInt(mm.allocateMemory(500));
と実行すると意図どおりの動きをするので
仮想関数呼び出しは問題ないと思います。
>>408
>ひげぽんも知ってると思うけど, GPLの和訳もネットに転がってるから, キチンと理解したいのなら探してみるのもいいかもしんない
ありがとうございます。
そうですね。上であげていただいたリンクも結構詳しい解説が載っていましたよ。
0410デフォルトの名無しさん
NGNGatexitだって存在しないと静的なクラスのデストラクタ呼び出しが出来なくなるだろうし。
0411ひげぽん ◆zcp/NZpA
NGNGCで書いた方がOS作りに集中でき、余計な面倒がかからないと
仰ってくれてるのは大変ありがたいのですが、
もう少しだけがんばってみます。m(__)m
>>409
メモリ割り当てのエラーに関して問題の切り分けをしてみたところ
どうやら超先生@OS板さんのご指摘の通りかもと思われます。
-- テスト用 --
int* num = (int*)malloc(sizeof(int));
*num = 8885;
_sysPrintInt(*num);
-- これは動きました --
void* malloc(unsigned long size) {
return (void*)0x10000;
}
-- これはエラーでした --
void* malloc(unsigned long size) {
X86MemoryManager& mm = X86MemoryManager::instance();
return (void*)mm.allocateMemory(size);
}
unsigned long X86MemoryManager::allocateMemory(unsigned long size) {
return 0x10000;
}
-- エラー内容 --
00000311654i[CPU ] write_virtual_checks(): no write access to seg
00000311654p[CPU ] >>PANIC<< exception(): 3rd exception with no resolution
超先生@OS板さんのご指摘の通り
仮想関数テーブルの初期化辺りが怪しいのかといろいろ調べたのですが
ちょっと行き詰っています。
WEBで調べたところ仮想関数テーブルは、GCCが作成してくれるみたいな
記述があったのですが、この認識は間違っているのでしょうか。
0413デフォルトの名無しさん
NGNGgcc使っているなら絶対gplでなきゃだめジャン。
0414デフォルトの名無しさん
NGNG0415デフォルトの名無しさん
NGNG>Cで書いた方がOS作りに集中でき、余計な面倒がかからないと
>仰ってくれてるのは大変ありがたいのですが、
>もう少しだけがんばってみます。m(__)m
ちゃうちゃう。
シングルトンにするとリンクエラーが出るんだろ?
つーことは、静的領域にあるインスタンスの解放(デストラクタ呼び出し)は
Cランタイムのatexitを利用して実装してるって事になる。
勝手にatexitを何もしない物で置き換えたら、メモリマネージャのデストラクタが呼ばれなくなるはず。
0416デフォルトの名無しさん
NGNGgccを使っても問題ない。
古いバージョンのglibcを使うとGPLに縛られることになるけど、
このプロジェクトでは標準ライブラリも使ってないしね。
0417デフォルトの名無しさん
NGNG(゚Д゚)ハァ?
http://www.gnu.org/licenses/gpl-faq.ja.html#CanIUseGPLToolsForNF
(´-`).。oO(なんでこういう誤解する香具師が減らないんだろう・・・)
0418デフォルトの名無しさん
NGNGライセンスも理解してないバカが発言するな。
0419デフォルトの名無しさん
NGNG標準ライブラリを使ってもgplに引っかかるのか?
0420デフォルトの名無しさん
NGNG新しいバージョンのglibcはLGPLだったはず。
昔はGPLだった。
0421ひげぽん ◆zcp/NZpA
NGNG>シングルトンにするとリンクエラーが出るんだろ?
>つーことは、静的領域にあるインスタンスの解放(デストラクタ呼び出し)は
>Cランタイムのatexitを利用して実装してるって事になる。
>勝手にatexitを何もしない物で置き換えたら、メモリマネージャのデストラクタが呼ばれなくなるはず
すいません。大きな誤解をしていたようで・・・
つまり、リンクエラーの回避のためにatexitを実装するなら
静的領域にあるインスタンスのデストラクタが呼ばれるように
きちんと実装しないとだめということですね。
これであってますでしょうか。
0422デフォルトの名無しさん
NGNGLGPLって、GPLよりゆるいんだよね。
0423デフォルトの名無しさん
NGNG>Cランタイムのatexitを利用して実装してるって事になる。
やっぱりC++のソースから吐き出されるアセンブラソースが完璧に
想定できるようでないと、カーネル組むのは難しいね。
ひげぽんがC++でがんばってるの見るといろいろと参考になります。
ところで、oskitはMSのCOMを真似てC++でもOSが作れるようにしてる
みたいだけど、そのあたりの技術はかっぱらってこれないかしら?
0424ひげぽん ◆zcp/NZpA
NGNGoskitダウンロードしてみました。
ソースはかなり参考になりますね。
ありがとうございます。
今も暴走中・・・
0425ひげぽん ◆zcp/NZpA
NGNGあれくらいのOS作りたいなあと思う今日この頃
やっぱり仮想関数呼び出し辺りが非常に怪しい。
すごい怪しい・・・
0426デフォルトの名無しさん
NGNGいまAtheOSを見てみたけどカーネルはCで書いてあるよ。
前に見たときの記憶だとeCosがC++だったような。。
それよりもC++の出すアセンブラをよく見た方が
良さそうだね。
0427ひげぽん ◆zcp/NZpA
NGNG>前に見たときの記憶だとeCosがC++だったような
ありがとうございます。
時間のあるときにぜひ見てみます。
>それよりもC++の出すアセンブラをよく見た方が
>良さそうだね。
そうですね。
早く安定した、C++環境を構築することも大きな目標です。
今日は今帰ってきたのであまり進んでおりません。
0428超先生@OS板 ◆OS/dd1Xc
NGNG何か手がかりがつかめるかも知れず。
0429デフォルトの名無しさん
NGNGそこまでしてあげますか。
ご苦労様です。
0430ひげぽん ◆zcp/NZpA
NGNG超先生@OS板さんいつもありがとうございます。
下記URLにエラーの再現するソースとバイナリを置かせていただきました。
http://oshigepon.tripod.co.jp/
エラー内容
prefetch: running in bogus memory
write_virtual_checks(): write beyond limit, r/w
>>PANIC<< iret: return CS selector null
超先生@OS板さんのご好意によりアドバイスが頂けるかもしれないとの
ことですが、もしよろしければ今後のためにも
調査のポイント、こんなことを勉強しておけ、こいつを読めなどありましたら
ぜひ教えてください。
本来この部分は自分でどうにかしないといけないことだと思います・・・
大変申し訳ありませんがもし何か、お気づきの点がありましたら
教えてください。
0431超先生@OS板 ◆OS/dd1Xc
NGNGの 3.1 Global Constructors and destructors in C++
が参考になるかも。
コンストラクタのコードにバイナリ上での目印を埋め込んでもらえるかな。
asm("hlt") を10個程度。
0432超先生@OS板 ◆OS/dd1Xc
NGNG0433デフォルトの名無しさん
NGNGOSなんでしょ。atexitなんか何もしなくていいんじゃないの?
0434デフォルトの名無しさん
NGNGあんたはOSのシャットダウンフェーズには何もやらないで
勝手に電源切っちゃうタイプですか?
0435デフォルトの名無しさん
NGNGそれ本気で言ってる?
0436デフォルトの名無しさん
NGNGそんなもんリンクしたらだめじゃん
0437デフォルトの名無しさん
NGNG0438デフォルトの名無しさん
NGNGいたとしたらうpして
0439デフォルトの名無しさん
NGNGいや、分かっているのならいいんだけど。
0440デフォルトの名無しさん
NGNGclass base {
public:
virtual int func(void) = 0;
};
class sub : virtual base {
public:
static sub& instance(void)
{
static sub inst;
return inst;
}
int func(void)
{
return 100;
}
};
void cstart(void)
{
sub &a = sub::instance();
// a.func() を表示
}
0441ひげぽん ◆zcp/NZpA
NGNG>ttp://www.skyfree.org/linux/references/ELF_Programmer.pdf
>の 3.1 Global Constructors and destructors in C++
>が参考になるかも。
ありがとうございます、参考にさせていただきます。
>というか、crt0のソースコードを見るのが手っ取り早いと思うけど
>なんでcrt0なんてものをくっつけるの?
>そんなもんリンクしたらだめじゃん
crt0というものを知らなかったので調べてみたら
#一般の C プログラムをコンパイルすると, 全体の先頭に crt0.s
#(をコンパイルして得られる crt0.o) というファイルが自動的に付加される. このファイルには, main 関数を呼び出す前に行なう処理が記述されている.
とでていました。これって勝手にリンクされているのでしょうか。
0442ひげぽん ◆zcp/NZpA
NGNG-- Sub.cpp --
#include<Sub.h>
int Sub::getNumber(void) {
return 777;
}
char* Sub::getName(void) {
static char* name = "BASE\n";
return name;
}
-- Sub.h --
#include<Base.h>
class Sub : virtual Base {
public:
static Sub& instance() {
static Sub theInstance;
return theInstance;
}
int getNumber();
char* getName();
};
0443ひげぽん ◆zcp/NZpA
NGNG-- Base.h --
class Base {
public:
virtual int getNumber(void) = 0;
virtual char* getName(void) = 0;
};
-- higeOperetor.cpp --
char* getName() {
Sub& sub = Sub::instance();
return sub.getName();
}
-- startKernel.cpp --
Sub& sub = Sub::instance();
_sysPrintInt(sub.getNumber()); /* 直接呼出しOK */
_sysPrint(sub.getName()); /* 直接呼出しOK */
_sysPrint(getName()); /* 間接呼び出しNG */
-- エラー内容 --
prefetch: running in bogus memory
write_virtual_checks(): write beyond limit, r/w
>>PANIC<< iret: return CS selector null
0444ひげぽん ◆zcp/NZpA
NGNGのような呼び出しは大丈夫だが。
関数getName()を介してSub::getNameを呼び出すと
エラーになってしまいます。
0445超先生@OS板 ◆OS/dd1Xc
NGNG_sysPrintInt(sub);
だとどうなるのかな?
0446名無しの組込みプログラマ
NGNG> crt0というものを知らなかったので調べてみたら
> #一般の C プログラムをコンパイルすると, 全体の先頭に crt0.s
> #(をコンパイルして得られる crt0.o) というファイルが自動的に付加される. このファイルには, main 関数を呼び出す前に行なう処理が記述されている.
> とでていました。これって勝手にリンクされているのでしょうか。
「一般のCプログラムをコンパイルすると」じゃなくて、「一般の
Cプログラムをリンクすると」だね。
勝手にリンクされるかどうかはあなたがどーやってリンクして
るか次第。
モノを見ずに憶測で言えば、リンクされてはいないと思う。
逆に言えば、crt0.o相当の処理を追加する必要があるって
こった。
超先生がソースを見ろって言ってるのもそういう意味だろ
ね。
0447ひげぽん ◆zcp/NZpA
NGNGSub* sub = &Sub::instance();
_sysPrintInt((int)sub);
としてみたところ。
10288(0x2830)と表示されました。
>>446
>「一般のCプログラムをコンパイルすると」じゃなくて、「一般の
>Cプログラムをリンクすると」だね。
そうですね。
>逆に言えば、crt0.o相当の処理を追加する必要があるって
>こった。
>超先生がソースを見ろって言ってるのもそういう意味だろ
>ね。
crt0ってmainを呼び出す処理とかをしているように思われるのですが
フロッピーブートするOS(もどき)にも必要なのでしょうか。
0448名無しの組込みプログラマ
NGNG> crt0ってmainを呼び出す処理とかをしているように思われるのですが
> フロッピーブートするOS(もどき)にも必要なのでしょうか。
「とか」の部分が重要なことがあるよ、ということです。
必要かどうかは、自分で判断ね。
0449ひげぽん ◆zcp/NZpA
NGNG>「とか」の部分が重要なことがあるよ、ということです。
>必要かどうかは、自分で判断ね。
なるほど。
では、今回のエラーは、もしかしたらcrt0の部分でやるべき
作業をしていないことが原因かもしれないということですね。
勉強になります。ありがとうございます。
0450デフォルトの名無しさん
NGNG静的に初期化出来ないデータ(プリミティブ型ではないもの)や
指定する初期値が定数でない(関数の返り値など)に対して
関数内staticなインスタンスを用いる場合、一般的なコンパイラの生成コードは、
staticなフラグとインスタンス用の領域だけを用意して
最初に到達した時に初期化するという形式になると思われます。
具体的には、
Singleton& Singleton::instance() {
static Singleton instancedata;
return instancedata;
}
は、実際には下のようなコードが作られるということです。
Singleton& Singleton::instance() {
static bool flag; // = false;
static char instancedata[sizeof(Singleton)];
if (!flag) {
flag = true;
new (instancedata) Singleton();
add_destructor_list(data, Singleton::~Singleton); // 擬似コード
}
return *(Singleton *)&instancedata;
}
0451デフォルトの名無しさん
NGNGまず、デストラクタを呼び出すために
thisとデストラクタ関数のアドレスをどこかに登録しています。
C++は、他の多くの言語と違い統一基底クラスがないため
インスタンスのポインタだけではデストラクタを呼び出せません。
ポインタと共に関数のアドレスも渡す必要があり、
これをどこかで管理しておいてプログラムが終了する前に呼び出すことになります。
次に、初期にstaticなフラグを使っていることです。
コンパイラの生成コードは、単独のコンテキストで実行される前提のため、
コストの増えるロック等は一般にはしていません。
このようなコードはマルチスレッド(あるいは非同期処理)において
支障をきたす可能性があります。
割りこみハンドラや複数の(ユーザー)プロセスから呼ばれる可能性があるのなら
flagをtrueにする前に排他制御を行い、再度flagを確認してから処理をすべきです。
最後に、非初期化データ領域が0で埋まっていることを前提としている事です。
flagやinstancedataに使う領域は、実行ファイルが無意味に大きくならないよう、
data領域ではなくbss領域に置かれ、スタートアップで0クリアされることが
期待されています。
別の言い方をすると、crt0をリンクしないのならば
非初期化データが0であることに依存してはならないのに、
コンパイラの生成するコードがそれに依存している(可能性が高い)ということです。
0452ひげぽん ◆zcp/NZpA
NGNGありがとうございます。
大変勉強になります。
もともとSingletonのコードを書くときに
flgを用いないようにしたのは、スレッドセーフにしようという意図だったのですが
見事にコンパイラが危険なコードを吐いてくれてるんですね。
>別の言い方をすると、crt0をリンクしないのならば
>非初期化データが0であることに依存してはならないのに、
>コンパイラの生成するコードがそれに依存している(可能性が高い)ということ
なるほど。
でもだからといって、crt0を安易にそのままリンクするというのも
問題がありそうですね。
今回の問題はいまだ解決せず、思うように進んでいないので
ちょっと逃避してクラス図を追加しました。
0453デフォルトの名無しさん
NGNG0454ひげぽん ◆zcp/NZpA
NGNG突っ込みありがとうございます。
MemoryManagerに関して言えばObjectをルートにする必要は多分ないと思います。
カーネル内のクラスでは、同一インターフェースを実装した
複数種類のオブジェクトがいる予定なので
デバッグ時にObjectのメソッドを活用しようかと・・・
0455デフォルトの名無しさん
NGNG他の部分の実装に入るのもありかと思うよ。
0456デフォルトの名無しさん
NGNG制作に入る前に知っておかなければならないことだし、
これは解決しておかないといつも詰まってばかりで進行が滞るんでない?
0457デフォルトの名無しさん
NGNGモチベーションが下がると思ってさ。
今どの段階でつまってるんだっけ?
0458デフォルトの名無しさん
NGNG>>442
じゃ、下みたいに継承を削ったらどうなる?
仮想関数が原因かどうか分かるんでない?
class Sub {
public:
static Sub& instance() {
static Sub theInstance;
return theInstance;
}
int getNumber();
char* getName();
};
アセンブラのコードは見てみた?手元のgccだと、
これどっちも同じコード吐くんだけど。
> _sysPrint(sub.getName()); /* 直接呼出しOK */
> _sysPrint(getName()); /* 間接呼び出しNG */
0460ひげぽん ◆zcp/NZpA
NGNGそうですね。保留にして先に進みたいのですが、
メモリ管理が出来ないとnewすらできないので
非常に困るのですよね。
0461デフォルトの名無しさん
NGNG先生方はどこへ行かれたのでしょうか?素朴な疑問です。
0462ひげぽん ◆zcp/NZpA
NGNG継承を削ってみたところ、
別のエラーが出ました。エラー内容は
00000775036e[CPU ] prefetch: running in bogus memory
です。
そのときのアセンブラコードは
[_sysPrintln(sub.getName());]
00000104 83EC0C sub esp,byte +0xc
00000107 FF75FC push dword [ebp-0x4]
0000010A E8F1080000 call 0xa00
0000010F 83C404 add esp,byte +0x4
00000112 50 push eax
00000113 E8EC000000 call 0x204
00000118 83C410 add esp,byte +0x10
[_sysPrintln(getName());]
00000120 83EC0C sub esp,byte +0xc
00000123 83EC04 sub esp,byte +0x4
00000126 E84F070000 call 0x87a
0000012B 83C404 add esp,byte +0x4
0000012E 50 push eax
0000012F E8D0000000 call 0x204
00000134 83C410 add esp,byte +0x10
0463ひげぽん ◆zcp/NZpA
NGNG>>459さん
継承をそのまま残した場合は
00000782814e[CPU ] load_seg_reg: GDT: ES: index(1fd8) > limit(00001f)
00000782849p[CPU ] >>PANIC<< fetch_raw_descriptor: LDTR.valid=0
というエラーで
[_sysPrintln(sub.getName());]
0000011D 83EC0C sub esp,byte +0xc
00000120 8B45FC mov eax,[ebp-0x4]
00000123 8B00 mov eax,[eax]
00000125 83E814 sub eax,byte +0x14
00000128 8B00 mov eax,[eax]
0000012A 0345FC add eax,[ebp-0x4]
0000012D 8B10 mov edx,[eax]
0000012F 83C204 add edx,byte +0x4
00000132 8B45FC mov eax,[ebp-0x4]
00000135 8B00 mov eax,[eax]
00000137 83E814 sub eax,byte +0x14
0000013A 8B00 mov eax,[eax]
0000013C 0345FC add eax,[ebp-0x4]
0000013F 50 push eax
00000140 8B02 mov eax,[edx]
00000142 FFD0 call eax
00000144 83C404 add esp,byte +0x4
00000147 50 push eax
00000148 E8F7000000 call 0x244
0000014D 83C410 add esp,byte +0x10
[_sysPrintln(getName());]
00000155 83EC0C sub esp,byte +0xc
00000158 83EC04 sub esp,byte +0x4
0000015B E874070000 call 0x8d4
00000160 83C404 add esp,byte +0x4
00000163 50 push eax
00000164 E8DB000000 call 0x244
00000169 83C410 add esp,byte +0x10
0464デフォルトの名無しさん
NGNGvirtual継承やめたら?
それから、vmmをprivate継承する必要はないでしょう。
0465ひげぽん ◆zcp/NZpA
NGNG>class X86MemoryManager:virtual MemoryManager;
>virtual継承やめたら?
>それから、vmmをprivate継承する必要はないでしょう
アドバイスありがとうございます。
今現在出ているエラーが継承に起因するものかきちんと切り分けること
ができたら、継承関係の整理もきちんとさせていただきます。
0466超先生@OS板 ◆OS/dd1Xc
NGNGthird.binの0x14e8が恐らくはスタートアップ時の関数テーブルだと思う。
_sysPrintln(sub.getName()) の呼び出しも vtbl 経由に
なっているので、_sysPrintln(sub.getName()) が動いて
_sysPrintln(getName()) が動かないのは信じられないのだが。
0468ひげぽん ◆zcp/NZpA
NGNG超先生@OS板さん いつもお世話になっております。
>やはりmain関数前に実行すべき処理があるはず。(おそらくcrt0相当)
>third.binの0x14e8が恐らくはスタートアップ時の関数テーブルだと思う。
なるほと。この間教えていただいた通りcrt0のソースをどこからか入手して
見るしかないのでしょうか。
>>467
>_sysPrintln(sub.getName()) の呼び出しも vtbl 経由に
>なっているので、_sysPrintln(sub.getName()) が動いて
>_sysPrintln(getName()) が動かないのは信じられないのだが。
vtblとは、仮想関数テーブルのことですよね。
でもgetName()だけだときちんと動くんですよね。
なせだろう。
0469ひげぽん ◆zcp/NZpA
NGNGttp://www.semantics.org/gotchas/gotcha50.pdf
0470デフォルトの名無しさん
NGNGたとえば、コンストラクタ/デストラクタが必要なクラスを静的持続時間を
持つオブジェクトに使わなければ、_atexit()は必要なくなる(はず)。
MemoryManagerをどうしてもsingletonにしたいなら、
inline void *operator new(size_t size, void *ptr) { return ptr; }
MemoryManager *mm;
void start()
{
char x86mm[sizeof(X86MemoryManager)];
mm = new (x86mm) X86MemoryManager;
mm.~X86MemoryManager;();
}
みたいにするとか。
純粋仮想関数呼び出しのハンドラは仕方ないね。
基本クラスのコンストラクタの実行時のvtblは基本クラスのものになるから、
純粋仮想関数を持つクラスでは必ず呼び出す可能性がありえる。
Visual C++のコンパイラみたいに、__declspec(novtable)があるなら平気だけど。
あと、仮想基本クラスは要らないと思うよ。多重継承が必要な場合は、Javaの
インタフェースみたいな使い方すればいいんだし。多分設計が間違ってる。
このあたりはコンパイラにアセンブリ言語のソース吐かせれば調べられるよ。
0471ひげぽん ◆zcp/NZpA
NGNG>たとえば、コンストラクタ/デストラクタが必要なクラスを静的持続時間を
>持つオブジェクトに使わなければ、_atexit()は必要なくなる(はず)。
なるほど、このような手もあるんですね。
>あと、仮想基本クラスは要らないと思うよ。多重継承が必要な場合は、Javaの
>インタフェースみたいな使い方すればいいんだし。多分設計が間違ってる。
>このあたりはコンパイラにアセンブリ言語のソース吐かせれば調べられるよ
元々私は、Java屋なのでX86MemoryManagerは、
インターフェースMemoryManagerをimplmentsしているイメージで設計しました。
つまり、
メモリ管理のコードをjava風に書くのであれば
MemoryManger mm = new X86MemoryManger();
mm.allocateMemory(size);
mm.freeMemory(address);
となります。メモリマネージャを使う場合は、そのインスタンスを
X86MemoryManagerとしてではなく、MemoryManagerとして扱います。
もし他のCPU向けに移植する場合は、
MemoryManger mm = new XXXXMemoryManger();
と書き直して
XXXXMemoryMangerを新たに実装するようにすれば良いのかと。
C++では、インターフェース継承を実現するには、
純粋仮想関数を基底クラスで宣言することにより実現し、そのクラスを
継承することで実現するのではないのでしょうか。
(Effective C++より)
あと、多重継承ですがObjectクラスを継承のことでしょうか。
ttp://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/higepos/higepos/doc/MemoryManager.png?rev=1.3&content-type=text/vnd.viewcvs-markup
をごらんいただければお分かりいただけるかと。
>このあたりはコンパイラにアセンブリ言語のソース吐かせれば調べられるよ
このあたりの重要さは、昨日より痛感しております。
0472デフォルトの名無しさん
NGNGvirtual継承してるから、多重継承(というか、菱形継承)を気にしてるんだろうけど、
少なくともこのケースでは菱形継承になるような設計は間違ってるって話だろ。
0473デフォルトの名無しさん
NGNGアセンブラコードを部分だけ載せるくらいなら、そのときのソース全部と
gcc の -S オプションしたのでUPした方が良いかも。
0474デフォルトの名無しさん
NGNG>もし他のCPU向けに移植する場合は、
>MemoryManger mm = new XXXXMemoryManger();
>と書き直して
こんなの条件コンパイルでいいじゃん
これだからJava屋って....
0475デフォルトの名無しさん
NGNGJavaだと条件コンパイルできないからAbstractFactoryとか使うだろ。
アンタの回りのJava屋がヘボいだけ。
MemoryManager mm = MemoryManager.getInstance();
mm.allocateMemory(size);
mm.freeMemory(address);
# 関係ないのでsage
0476ひげぽん ◆zcp/NZpA
NGNGフォローありがとうございます。
エラーに関していまだ解決できておりません。
逆アセンブラしたものを、↓に置かせていただきました。
http://oshigepon.tripod.co.jp/
主要部分にはasm("nop");などを埋めました。
ソースは
http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/higepos/higepos/src/
でご覧いただけます。
もしお気づきの点がありましたら、アドバイス、ご指摘いただけると
ありがたいです。
よろしくお願いいたします。
0477デフォルトの名無しさん
NGNGできればフォルダ作って取っておいてもらえるとうれしいかも・・・
0478デフォルトの名無しさん
NGNG0480デフォルトの名無しさん
NGNGハードアーキテクチャの違いを吸収するため抽象クラスを
使うってのが間違ってるんじゃないのと言いたいわけよ。
特にメモリアロケータのような低レベルクラスでね。
それが原因(かどうかわからんけど)でドツボにはまってるわけだし。
このケースでは条件コンパイルで十分でしょ。
0481デフォルトの名無しさん
NGNGsecondboot.asmの最後を
>; jmp 0x200 ← jump をコメントアウト&hangをコメントイン
>hang:
> jmp hang
とすると、「disk reading ... done」を表示して止まるのですが、
0を表示させようと思って、hang:の前に、
> mov al, '0' ; 0を表示してhang
> mov ah, 0Eh
> mov bx, 0h
> int 10h
を入れると、リブートしてしまいます。
プロテクトモードではもしかしてbiosを使った画面描写ってできないのでしょうか?
それとも基本的な間違いを犯しているのでしょうか?
あと、現在のファイル全てをmakeしてddでFloppyに書き込んでブートしても、
やはりリブートしてしまいます。(タイミング的には↑と一緒のあたり)
いずれも実機(自作機)でやっているのですが、もしよろしければヒントをいただけないでしょうか?
環境は、ひげぽんさんと同じく nasmw,djgpp です。(Windows2000)
#必要があればバイナリを逆アセンブルして出してみます。。
0482デフォルトの名無しさん
NGNG↑の後者についてですが、とりあえずはハングアップさせようと思い、cpstart.cppの
startKernel();
の直前に
while (true) {}
を挿入します。で、makeして出来たthird.listをみると、
00000000 55 push ebp
00000001 89E5 mov ebp,esp
00000003 83EC08 sub esp,byte +0x8
00000006 90 nop
00000007 EBFE jmp short 0x7 ←ここでループするはず?
となっています。そして、first second third を cat したバイナリを
バイナリエディタでのぞいてみると、
00000400: 55 89 E5 83 EC 08 ・・・・
となっていて、400番地から命令が正しく入っていると(自分には)思われるのですが、
ddで書き込んでブートすると、リブートしてしまいます・・・
おかしいと思った点は、
jmp short 0x7
のジャンプ先は 01207 であるべきのような気がします。
もしかして、このせいでしょうか?
板汚し、すみません。以上です。
0483超先生@OS板 ◆OS/dd1Xc
NGNG> プロテクトモードではもしかしてbiosを使った画面描写ってできないのでしょうか?
> それとも基本的な間違いを犯しているのでしょうか?
そのとおりです。
自力でVRAMへ書き込む必要があります。
>jmp short 0x7
>のジャンプ先は 01207 であるべきのような気がします。
eb feは相対jmp -1という意味になので
絶対的なアドレス(0x120n)は関係ないです。
0484481
NGNGありがとうございます。VRAMに直書でないといけないのですね。
>eb feは相対jmp -1という意味になので
そうでしたか。ということは、直前のnopあたりに戻ってループできそうですよね?
でもなぜかリブートしてしまいます。
ちょっと変ですね。secondbootから正しくジャンプしてきていないのかな?
少し考えてみます・・・。
0485481
NGNGすんません。jmp命令自身に戻るんですよね。(細かいことですが)
0486デフォルトの名無しさん
NGNG ̄∨ ̄ ̄ ̄ ̄ ̄ ∨ ̄ ̄ ̄ ̄ ̄ ̄ ∨ ̄ ̄ ̄ ̄ ̄
(´Д`;)ヾ (;´Д`) ヾ
∨) ( 人) (´Д`;)、
(( 〉 〉 ノノZ乙
http://www.gal-para.com/gal-channel/read.cgi?bbs=lounge&key=1028811476&ls=50
0487デフォルトの名無しさん
NGNGディスアセンブル結果を見たけど、::getName() からの sub.getInstance()
呼び出しのアドレスが間違っているように見えた。
sub::getInstance() は0a70h からなのに、::getName()からは0a50hをコール。
わけわからん。
1)開発ホスト用にコンパイル&リンクしたら正常に実行できるの?
2)-S とかつけてコンパイルしたアセンブリリストが見たいなあ。
昔、オレもOSを作ろうとしたことあったよ。
同人ソフトを作るのに、MSDOSを添付したくなかったから。
といっても、BOOT+ファイルシステム+極小DPMIみたいなのだけど。
シェル無しのヘボDOSだな。
ゲーム用のシングルタスクだから、メモリ管理もプロセス管理も無いヤツね。
仕事が忙しくなって中断したが楽しかったなあ(仕事が落ちついたら、HDD
あたりまえの時代になっていて無用になった)。
CPU、コンパイラ(アセンブラ含む)、リンカ(実行時含む)あたりの知識は
どんな分野のプログラムでも役に立つと思うから、なるべくアセンブリと額
つつき合わせてがんばれ!
0488ひげぽん ◆zcp/NZpA
NGNGこんばんわ。
ありがとうございます。
OS作りの先輩ですね。
>ディスアセンブル結果を見たけど、::getName() からの sub.getInstance()
>呼び出しのアドレスが間違っているように見えた。
>sub::getInstance() は0a70h からなのに、::getName()からは0a50hをコール。
>わけわからん。
コンパイル・リンクのどちらかでおかしくなっているのですが、
いったいどういう理由なのかがつかめていません。
>1)開発ホスト用にコンパイル&リンクしたら正常に実行できるの?
>2)-S とかつけてコンパイルしたアセンブリリストが見たいなあ。
週末にいろいろ実験してご報告させていただきます。
アドバイスありがとうございます。
0489ひげぽん ◆zcp/NZpA
NGNGgcc -Sオプションで吐かれたアセンブラソースを以下のURLに置かせて
頂きました。
http://oshigepon.tripod.co.jp/
引き続き調査中です。
もし何かお気づきの点がございましたらご指摘くださいm(__)m
0490ひげぽん ◆zcp/NZpA
NGNGとりあえず継承を一切やめて見たところ正常に動作しております。
(メモリをただ割り当てるだけバージョンのnew,malloc)
これから本格的にメモリ管理について実装する予定です。
メモリ割り当てのときにプロセスIDのようなものを引数で受け取ろうかどうしようか。
仮想メモリは、ファイルシステムができてからだろうか。
ファイルシステムと、プロセス管理も考えなくてはいけないことに気づいてきました。
以下ボヤキ
簡易版vectorをtemplate機能を使って作ってみたら、
リンク時にエラーが出た・・・
C++の機能が全然使えてない・・・・
0491デフォルトの名無しさん
NGNG複雑すぎるんじゃないの?
0492ひげぽん ◆zcp/NZpA
NGNGそうかもしれませんね。
C++でやるには、コンパイラ・リンカの知識が
Cで作る場合に比べてさらに必要ということではないでしょうか。
知識がないうちは(今の私)、害が出ない程度に
C++の機能を使うしかないのではと思っています。
0493デフォルトの名無しさん
NGNG漏れはCとアセンブラは7年前くらいに学んだが最近はC++
に移行しちまってほとんど忘れてるなぁ。Cは覚えてるが。
C++は、確かに複雑だが、やれない事はないと思うよ。
まぁ、漏れが慣れてしまってるからかもしれないが。
0494ひげぽん ◆zcp/NZpA
NGNGもしに何かご存知でしたらぜひご教授ください。
特にリンクcrt0関係やgccの吐くコード・リンクなどについて
困っています。
0495デフォルトの名無しさん
NGNG目を通して見るね。
でも、Winアプリ屋の漏れの知識は役に立たないかも(w
0496kso
NGNG0497デフォルトの名無しさん
NGNG基礎の基礎を作ってるとこだよ。
これからの仕様、設計によってどんなOSになるか決まる。
0498デフォルトの名無しさん
NGNG0499ひげぽん ◆zcp/NZpA
NGNG有用なリンクありがとうございます。
参考にさせていただきます。
0500ひげぽん ◆zcp/NZpA
NGNGあたりを参考にさせていただきます。
またbuiltin_のあたりも必須ですよね。
0501kso
NGNGLinuxのようなOSか、WindowsのようなOSか
どっちを目指す?
0502ひげぽん ◆zcp/NZpA
NGNGフリーですね。
宝くじが当たったら、仕事やめて開発に専念します(笑)
儲ける気はありませんが、自分の生活くらいは保障されるとうれしいかも
獲らぬ狸の・・・・でした。
0503デフォルトの名無しさん
NGNG0504デフォルトの名無しさん
NGNG0505デフォルトの名無しさん
NGNG0506デフォルトの名無しさん
NGNG0507ひげぽん ◆zcp/NZpA
NGNGを参考にbuiltin_new,deleteも追加しました。
http://ime.nu/www.mega-tokyo.com/os/os-faq-cpp.html#start
ところで
__builtin_vec_new
って引数・戻り値ってどこで調べれば分かるでしょうか。
googleで調べたら、変なバイナリばかり引っかかってしまいます。
0508487
NGNGしかし、-S で出力したファイルの拡張子が .o ってのはあまりに以外であったが、
Unix 方面では一般的なのか? 必死に .s .src .asm を探し回ったよ。
で、アセンブリリストを見てみたわけだが、特に問題はない。
おそらく、オブジェクトファイルの段階では問題ないのだろう。
すると、リンク時のアドレス解決時の問題ということになる。
俺に思いつく可能性は、
1)リンカスクリプトのミス
2)ld のバグ(ホントかよ!)
だが、考えにくい・・・。
マップファイルが欲しい・・・。他にもズレてるシンポルがあるだろうから、
そこから原因が推測できるかも知れんし・・・。
ま、今日のところは何も分からないことが分かったというところか。
ところで、intelのサイトの資料は読んでる?
日本語でもまあまあ色々あるし、英語ならそれなりに面白いのもある。
資料不足なら逝ってみるのもいいんじゃない?
あと、ちょと前に出てた crt0 だけど、djgpp のソースから持ってきたんなら、
どっかに crt0.s (アセンブリソース)があるから見てみたらいいんじゃない
かな。
俺が見たことあるのは、拍子抜けするくらい単純なヤツだけど。
ま、ある意味、組み込み系の仕事だし、当然なんだけど。
# あの Makefile は多少切ない・・・
0509487
NGNG000000E1 E88A090000 call 0xa70=__ZN3Sub8instanceEv; Sub::instance()
000000E6 8945FC mov [ebp-0x4],eax
000000E9 83EC0C sub esp,byte +0xc
000000EC 8B45FC mov eax,[ebp-0x4]
000000EF 8B00 mov eax,[eax]
000000F1 FF75FC push dword [ebp-0x4]
000000F4 8B00 mov eax,[eax]
000000F6 FFD0 call eax; ->getNumber() ?
000000F8 83C404 add esp,byte +0x4
000000FB 50 push eax
000000FC E827010000 call 0x228=__Z14_sysPrintlnInti; _sysPrintlnInt()
call__ZN3Sub8instanceEv
movl%eax, -4(%ebp)
subl$12, %esp
movl-4(%ebp), %eax
movl(%eax), %eax
pushl-4(%ebp)
movl(%eax), %eax
call*%eax
addl$4, %esp
pushl%eax
call__Z14_sysPrintlnInti
_sysPrintln(getName());
0000012F 83EC0C sub esp,byte +0xc
00000132 83EC04 sub esp,byte +0x4
00000135 E844070000 call 0x87e=__Z7getNamev; getName()
0510487
NGNGpushl%ebp
movl%esp, %ebp
subl$8, %esp
call__ZN3Sub8instanceEv
0000085C 55 push ebp
0000085D 89E5 mov ebp,esp
0000085F 83EC08 sub esp,byte +0x8
00000862 E8E9010000 call 0xa50
__Z7getNamev:
pushl%ebp
movl%esp, %ebp
subl$8, %esp
call__ZN3Sub8instanceEv
0000087E 55 push ebp
0000087F 89E5 mov ebp,esp
00000881 83EC08 sub esp,byte +0x8
00000884 E8C7010000 call 0xa50=__ZN3Sub8instanceEv
__ZN3Sub8instanceEv:
pushl%ebp
movl%esp, %ebp
subl$8, %esp
__ZN3Sub8instanceEv:
00000A70 55 push ebp
00000A71 89E5 mov ebp,esp
00000A73 83EC08 sub esp,byte +0x8
0511487
NGNG__builtin_vec_new prototype
でググったら普通にでてきたぞ。
どんぐらい普遍的なのかは知らんけど。
void* __builtin_new(size_t sz)
{
return kmalloc(sz, GFP_KERNEL);
}
void* __builtin_vec_new(size_t sz)
{
return __builtin_new (sz);
}
void __builtin_delete(void* ptr)
{
// if (ptr) //kfree checks against NULL pointer
kfree(ptr);
}
void __builtin_vec_delete(void* ptr)
{
__builtin_delete (ptr);
}
0512鬱
NGNG0513ひげぽん ◆zcp/NZpA
NGNGありがとうございます。
>まじ、すっかり忘れてた。
>しかし、-S で出力したファイルの拡張子が .o ってのはあまりに以外であったが、
>Unix 方面では一般的なのか? 必死に .s .src .asm を探し回ったよ。
いや私がサボったため起きた現象です。-o *.oにしてたの忘れてしました。
>1)リンカスクリプトのミス
>2)ld のバグ(ホントかよ!)
>だが、考えにくい・・・。
なるほどオブジェクトファイルの時点では問題ないということですね。
>ところで、intelのサイトの資料は読んでる?
>日本語でもまあまあ色々あるし、英語ならそれなりに面白いのもある。
>資料不足なら逝ってみるのもいいんじゃない?
そうですね。存在は知っているのですが、なかなか読まないですね。
読んでみようと思います。
># あの Makefile は多少切ない・
どの辺が切ないのでしょうか。確かに我流だし、汎用性0ですね。
せめてunixのかたがたもすぐ使えるようにしたほうがいいのかも。
0514ひげぽん ◆zcp/NZpA
NGNGbuiltin_vec_newもサイズだけ受け取ればよいんですね。
ありがとうございます。
配列用なので配列のサイズも必要なのかと思っていたのですが・・・
>>487さん
これからも、アドバイスいただけたらうれしいです。
OSを作ったことのある人の経験は大変貴重です。
0515ひげぽん ◆zcp/NZpA
NGNGやる気復活してきました。
Vectorがあるといろいろ便利なのだが・・・
0516FreeDOS教徒
NGNG理解しきれてないと、どうしてもどこかで行き詰まるもんです。
地味な作業みたいですが、地道にがんばってください。応援してます。
0517ひげぽん ◆zcp/NZpA
NGNGそうですね。資料を読んで勉強して、それからですよね。
どうも行き当たりばったりで、行き詰ってたりします。
0518ろうひ男爵
NGNG自分もアセンブラでですが作っています〜。
コンソールまで出来て、コマンド起動まで出来ました〜。
以前、DOSもどき+XMSの物は作ったことがあったので、
ここまではすんなりいきました。
次はint21hのエミュレーションです〜。
0519ただの通行人G
NGNG>宝くじが当たったら、仕事やめて開発に専念します(笑)
そんなに、Pentiumでオナニーしたいのか?
用途不明のOS作りとは(笑)
0520デフォルトの名無しさん
NGNGIComp比の分いいものができる・・・かもな
0521デフォルトの名無しさん
NGNGそれひけオーエス
0522ただの通行人G
NGNGでもそれは10年前の話、今それをやって何を作ろうとしているのか?
そこが疑問なんですよ
0523デフォルトの名無しさん
NGNG作ることが楽しいっていうのはないですか?
just for fan。これは何年経っても変わらないと思われ。
0524デフォルトの名無しさん
NGNGプログラマはクリエイティブな仕事. 何らかの形にしたいと思った中でOSっていう
選択肢があるのも悪くない…と俺は思うぞ.
0525デフォルトの名無しさん
NGNGそれは、
「いまさら富士山に登って何の意味があるの?」
と聞いてるのと同じだと思うが。
0526ただの通行人G
NGNGこれを否定するつもりはありません。
疑問に思うのは、2002年に開発を始めたOSの目指す姿が不明な点です。
0527デフォルトの名無しさん
NGNG0528デフォルトの名無しさん
NGNGこれを否定するつもりはありません。
疑問に思うのは、2002年に富士山に登り始めた登山者の目指す姿が不明な点です。
0529デフォルトの名無しさん
NGNGおれも趣味でごにょごにょやってるわけだが、正直、どんなのを作ろう
かってのはわかんないけどな。OSの専門家じゃないし、理想の OSを作ろ
うという目標があるわけでもない。作っていくうちにいろいろわかって
くるとは思うけどね。で、作りたい OSがわかってくればそこでもう一度
作り直せばいいし。
今はどんなものが作りたいのか模索している段階だね。
プログラムで言えば、とりあえずHello, World作って、いろんなアルゴリ
ズムとか勉強してる段階。
ひげぽんの考えは知らないけど。
0530ただの通行人G
NGNG0531デフォルトの名無しさん
NGNG〜〜〜〜〜〜〜〜〜〜〜〜◯〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
Ο
o
_____________
/ ∧_∧ )
/ ( ̄(´Д` ; ) ̄0 /
/~ ̄ ̄ ̄⌒⌒⌒⌒ ̄ ̄ ̄)
/ ※※※※※※※※ /
/ ※※※※※※※※ /
/ ※※※※※※※※ /
(____________ノ
0532デフォルトの名無しさん
NGNG読解力に致命的な問題があるのでは?
0533デフォルトの名無しさん
NGNGこんな奴に使って欲しいなんて思って作ってる人はいないんだから。
0534ろうひ男爵
NGNG目的としては学習用です。
第二弾、第三弾を作るときには目的は変わるかもしれませんが。
0535デフォルトの名無しさん
NGNG釣り師か?
DOSEXTENDERはOSじゃないぞ.
0536ろうひ男爵
NGNGちとことばか足りなかったのですが、
INT21の拡張って意味です。
ところで、使用側から見ると、
win3.1と同じでextenderもosと見なして良いのでは?
0537ろうひ男爵
NGNGint21hの拡張とは、32bit化への拡張です。
run386のファンクション程度を実装できたらと思っています。
機能的に、dos+extenderの機能を実装した簡易OSを作ろうと思っています。
dpmi機能よりは使用側がシームレスに使えると思っています。
次には、オリジナルの言語を作ろうと思っています。
c言語のプリプロセッサ機能+アセンブラのマクロ機能、
ここまでがプリプロセッサで実装しました。
その後、BASIC+PASCALの構造化言語を作っていますが、
プリプロセッサの実装までで力尽きました。
BASICインタープリターなら作ったことがあるので簡単ですが、
386コードへの変換が難しそう。
0538ろうひ男爵
NGNGところで、ひげぽんさんはDISKアクセスにはBIOSのリアルモードへ戻しますか?
あと、それとも関係しますが第一弾からマルチタスクにしますか?
0539ただの通行人G
NGNG答えられないなら黙ってろ
0540デフォルトの名無しさん
NGNG当然と言えば当然だけどね。
ひげぽんも前半ははじめての486レベルの話が多かったし、
今も資料をあさればイイ話が多いからね。
そんなレベルなのに色々大きいこと言ってるからただの通行人Gに
かみつかれたんじゃない?
オレは理由は必要ないんじゃないって思ってるけど、
ひげぽんの甘え具合見てるとただの通行人Gの何のためにやってるのって気持ちも分かるよ。
でも、こには超先生や487やろうひ男爵みたいに優しい奴らが多いから、
ただの通行人Gは口を出さずに無視してれば良いんじゃない?
ひげぽんは今までみたいにマターリやって、
作れても失敗してもイイから作るってなかなか出来ないけど、
ここの雰囲気は凄くイイから、
見ててムカつくのも分かるけど黙って無視してれば>G
0541540
NGNG勝手にやってればって無視してあげてよ。
でも、オナニーって言い方は言い得て妙だけど、
いちいち理由をつけてソフトを作ってる奴ってそんなにいないと思うよ。
>>535
いんや、Extenderはosの一部かもしくは微妙な部分だろ?
そんなのにいちいち反応するおまえが釣り師。
言葉尻に反応するのやめれ。
0542デフォルトの名無しさん
NGNG富士山に登るのも、まずは登り始めなければ始まらないし。
登り始めた登山者は最終的に富士山に登るのが目的。
ひげぽんが最終的にどんなOSのイメージを持っているかは
本人に聞かないと分からないが。。
まぁ、面白いスレだからマターリしましょう。
0543ひげぽん ◆zcp/NZpA
NGNG>>518 ろうひ男爵さん
>自分もアセンブラでですが作っています〜。
>コンソールまで出来て、コマンド起動まで出来ました〜。
すごいですね。
自分の勉強・力不足を感じます。
>ところで、ひげぽんさんはDISKアクセスにはBIOSのリアルモードへ戻しますか?
えーと私がソースをある程度読んだあるOSはリアルモードへ移行していました。
一応それを参考にしようかと思っています。
>あと、それとも関係しますが第一弾からマルチタスクにしますか?
まだ未定です。
もし自分の技術的に可能であればぜひマルチタスクにしたいです。
シングルタスクから入ったほうがメモリ管理等がシンプルそうなので
その辺の兼ね合いで考えようかと思っています。
0544ひげぽん ◆zcp/NZpA
NGNG>そんなに、Pentiumでオナニーしたいのか?
>用途不明のOS作りとは(笑)
>今、OSを作る理由が作るのが楽しいから
>これを否定するつもりはありません。
>疑問に思うのは、2002年に開発を始めたOSの目指す姿が不明な点です。
>疑問に対する答えはなしか、その程度だな。
まずはお返事が遅れてしまって申し訳ありません。
OSを作ってみたい、作る過程が楽しそうだというのが
プロトタイプOSの開発開始の動機のひとつです。
そのため、明確なビジョン・進もうとしている方向は
私自身の中でもあいまいです。
そろそろそういったことを意識しなくてはいけないのかもしれませんね。
>>529さん
>OSの専門家じゃないし、理想の OSを作ろ
>うという目標があるわけでもない。作っていくうちにいろいろわかって
>くるとは思うけどね。で、作りたい OSがわかってくればそこでもう一度
>作り直せばいいし。
私もそんな感じです。すでに作り直したい・こうすればよかったという箇所があります。
>>540
>今も資料をあさればイイ話が多いからね。
>そんなレベルなのに色々大きいこと言ってるからただの通行人Gに
>かみつかれたんじゃない?
大きい事言ってますよね。
以後なるべく気をつけます。
今まで通りマターリとやらせていただきます。
よろしくおねがいします。
0545デフォルトの名無しさん
NGNGこれも含めてひげぽんなので、今までのままでイイ!!と思うよ。
0546デフォルトの名無しさん
NGNG案外、先でひげぽんのOSが世の中に広まるかもしれない。
0547ただの通行人G
NGNGこれからは黙っていることにするよ。
ろうひ男爵のDOS-EXTENDER程度のOSは、わかりやすい言い方だと思う。
これぐらいの答えを期待していただけだし。
0548あぼーん
NGNG0549ひげぽん ◆zcp/NZpA
NGNG簡易的なものですが、なかなか難しいですね。
0550LightCone
NGNGアプリプログラムの経験があっても、メモリ管理は普段やらないこと
ですからね。
物理メモリの利用マップを管理するだけでも、なかなか難しいはず
です。最初、管理用のワークエリアを取る場所さえも自分で探す
必要がありますし。
物理メモリマップの壁をクリアしても、論理的なメモリ管理用の
管理領域自体を動的に伸張していくことも以外に難しいと
思います。
ページ単位でメモリを用意するためには、メモリブロックのヘッダ
を、メモリブロックの先頭にくっつける方法は取れないので、
別領域にまとめておかないといけなかったり。
ページテーブルへアクセスするために、自己参照的なページ
エントリを作っておかないといけなかったり、システム共通領域
に対するエントリは、全てのタスクのページテーブルに書き換えを
反映させないといけなかったり。
頑張ってください。
0551ひげぽん ◆zcp/NZpA
NGNGどうもお久しぶりです。
>アプリプログラムの経験があっても、メモリ管理は普段やらないことですからね。
そうですね。メモリ管理の勉強をしていて連想したのは、
HDDの断片化(デフラグしますよね) やデータベースのブロックでした。
>物理メモリの利用マップを管理するだけでも、なかなか難しいはず
>です。最初、管理用のワークエリアを取る場所さえも自分で探す必要がありますし。
最初、この部分で混乱しました。
空き領域をあらわすようなクラスを最初考えていたのですが、
そのクラスはどうやって自分自身のメモリを確保するんだろう?
newしたら無限ループに入るって事に途中で気づきました(笑)
実装前に気づいてよかったです。
結局、今回はあまり欲張りすぎず連結リストを用いた
メモリ管理をすることにしました。
上記実装が落ち着いてきて、他の部分も成熟してきたら
ページング等にも挑戦しようと思っています。
>ページテーブルへアクセスするために、自己参照的なページ
>エントリを作っておかないといけなかったり、システム共通領域
>に対するエントリは、全てのタスクのページテーブルに書き換えを
>反映させないといけなかったり。
>頑張ってください
ありがとうございます。
メモリ管理を実装中に、debugのために printfがほしくなったので
簡易版printfを実装中です。
ちょっと横道にそれてきました。
0552デフォルトの名無しさん
NGNGprintf…でなくてassertとかではダメかい?
0554552
NGNGでもデータのdumpとるのならprintfの方がいいかもね。
0556ひげぽん ◆zcp/NZpA
NGNG%s,%dしか使えませんが、かなり便利です。
もっと最初から作っておけばよかった・・・
0557デフォルトの名無しさん
NGNG俺はそこまでできない。
0558デフォルトの名無しさん
NGNGひげぽんに取って:たんにOSを作るうえでの技術相談所
厨房に取って:ひげぽんが何か大きなプロジェクトを立てようとしている
俺のが偉いんだ阻止するぞ阻止するぞ阻止するぞ阻止するぞ
ワラタ。本当にそういう奴(厨房)いるからねぇ。
俺にとっては何やろうね。実はひそかにpart1から読んでたりするんだけど(藁。
0562デフォルトの名無しさん
NGNG細かいことだけど、_sys_printf("xxx%"); とかやられると、ちょっとうれしく
ないことが起こる。また、現状の版では "%" を出力したい時は
_sys_printf("%s", "%"); とやるしかないので...
for (int i = 0; format[i] != '\0'; i++) {
if (format[i] == '%') {
i++;
switch (format[i]) {
case 's':
_sysPrint((char *)*list);
((char**)list) += 1;
break;
case 'd':
_sysPrintInt((int)*list);
((int*)list) += 1;
break;
> case '%':
> _sysPutCharacter('%');
> break;
> case '\0':
> i--;
> break;
}
} else {
_sysPutCharcter(format[i]);
}
}
とかすれば、どうでしょうか ?
0563ひげぽん ◆zcp/NZpA
NGNGどうなんでしょうか?
コテハンの人以外にどのくらいの人数の方がいるんでしょう。
>>562さん
採用させていただきます。ありがとうございます。
ついでにtypoを直しました。charcterって・・・(鬱)
ソースを見てくれている人がいるんですね。
ちょっとびっくりしました。
0564ひげぽん ◆zcp/NZpA
NGNGただいま逃避中。
0565age
NGNG0566デフォルトの名無しさん
NGNGwin2000系では何があるんでしょうか。
rawriteではエラー、dksimgも何故かダメ。
質問だけでスンマソン。
0567デフォルトの名無しさん
NGNG0568ろうひ男爵
NGNG自分はwin98seなのでint13hです。
以下の感じ。
; ipl の書き込み
movax,0301h; ah=03h,al=書き込みsec数
movcx,0001h; ch=シリンダ番号,cl=セクタ番号
xordx,dx; dh=ヘッド番号,dl=ドライブ番号
movbx,seg ipl_top; es:bx=書き込み先頭アドレス
moves,bx
movbx,offset ipl_top
int13h
0570ろうひ男爵
NGNGたいしたものではないんですが、
アセンブラでよければIPLのプログラムをupしませうか?
tasmとtlinkでコンパイル出来る奴で、多分masmでもokだとおいます。
0571デフォルトの名無しさん
NGNG0572ろうひ男爵
NGNGあ、ごめん。
自分は一本のプログラムに、IPL自体とIPLの書き込みルーチンをまとめてるので、
そういう意味でサンプルになるかなって思って書きました。
0573デフォルトの名無しさん
NGNG上げてほしいっす
0574ろうひ男爵
NGNGiplプログラムです。
ご自分のお作りになった、2nd ipl 以降を読み込むための物です。
>ipl1.exe 1000 1000:0000 2 1
で、iplにプログラムを書き込みます。
この例の場合、iplはブートアップの後、セクタ2から1セクタ分seg1000へ読み込みます。
そして、seg1000:offset0000へジャンプします。
dosフォーマット済みのブランクfdをドライブに入れて、
window95/98/meなどのコマンドプロンプトで
>ipl1.exe 1000 1000:0000 2 1[ret]
と入力して下さい。
その後、マシンをリブートしてfdから起動させて下さい。
起動したら、メッセージが表示されます。
サンプルとして、2nd ipl のサンプルの ipl2.exe をつけますので、
先ほどのfdをドライブに入れれて、
window95/98/meなどのコマンドプロンプトで
>ipl2.exe[ret]
と実行して下さい。
なお、dosフォーマットのdiskはipl2.exeを実行したとたんデーターが壊れます。
その後、マシンをリブートしてfdから起動させて下さい。
起動したら、メッセージが表示されますが、
今度は"2ndIPL BOOT OK"というメッセージも表示されます
0575ろうひ男爵
NGNGと思ったら、削除されてました。トホホ
どっかにプログラムをupするイイ所ってないっすか?
0576デフォルトの名無しさん
NGNGWindowsはそういうのに不向きだと思うけどなあ。
0577デフォルトの名無しさん
NGNG0579ろうひ男爵
NGNGhttp://www36.tok2.com/home/tok/cgi-bin/upboard/updir/ipl.lzh
iplプログラムです。
0580デフォルトの名無しさん
NGNGhttp://www.cs.vu.nl/pub/minix/dosutil/fdvol.exe
fdvol 1440 A: boot1st.bin
みたいに。
0581デフォルトの名無しさん
NGNG停滞中?
0582ひげぽん ◆zcp/NZpA
NGNG継承問題は棚上げにして
メモリ管理クラスの実装に入りました。
現在デバッグ中なのでここにあまり書き込む情報(質問???)がありません。
フロッピィへの書き込みは、サブマシンのlinuxのddを使ってます。
もっとも最近はbochsでしかテストしてませんです。
>>580みたいなのもあるんですね。
0583ろうひ男爵
NGNGメモリ管理ですが、連結リストってことは
DOSみたいなメモリブロック構造ってことですよね。
メモリーブロックの前に、管理ヘッダーを置くって形ですね。
出来上がったら、結構前進しますね。がんばって下さいね。
0584ひげぽん ◆zcp/NZpA
NGNG>メモリ管理ですが、連結リストってことは
>DOSみたいなメモリブロック構造ってことですよね。
>メモリーブロックの前に、管理ヘッダーを置くって形ですね。
DOSのメモリブロックはちょっと知らないのですが、
そんな感じです。
>出来上がったら、結構前進しますね。がんばって下さいね。
ありがとうございます。
余裕があったら他のメモリ管理の方法も試したいなとは
思っているのですが、当分は無理でしょうね。。。
0585デフォルトの名無しさん
NGNG0586デフォルトの名無しさん
NGNGページング使うんだから、タスクからはリニアに見えるんじゃないの?
もしかして、マジでMCBと同じにするつもり?
0587ひげぽん ◆zcp/NZpA
NGNG>ひげぽん仕事は大丈夫?
ちょっと忙しいですが、忙しいほうが
なぜか家に帰ってから30分でも集中してhigeposに時間をまわして
結果的には、開発状況は自分的には、アクティブです。
>連結リストってカーネル内の管理方法だろ?
そのとおりです。
>ページング使うんだから、タスクからはリニアに見えるんじゃないの?
>もしかして、マジでMCBと同じにするつもり?
いえいえ全然そんな意図はありません。
MCBというものも知りませんでしたし(それはそれで問題ですが)
例のMINIX本と、他のOSのソースを見て
とりあえず連結リストによるメモリ管理の実装を試みている状況です。
>>Memory Control Block(MCB) メモリー制御ブロック
>>DOS が管理するメモリーブロックの先頭に置かれた管理情報領域。
0588デフォルトの名無しさん
NGNGそうだよな、583を見ておいおいって思ったので。
0589デフォルトの名無しさん
NGNGそか。じゃしばらくしたらまた来てみよう。
0590デフォルトの名無しさん
NGNGOS板はKとLの対決で荒れてる荒れてる。
0591896
NGNG0592デフォルトの名無しさん
NGNG0593デフォルトの名無しさん
NGNG0594ひげぽん ◆zcp/NZpA
NGNGメモリ開放時の隣り合う空き領域の連結処理が実装できていませんが
一応順調に進んでおります。
最近仕事がまた忙しいのでちょっと進みが遅いですが、
何とかやっております。
0595デフォルトの名無しさん
NGNG0596ひげぽん ◇zcp/NZpA
NGNG0597デフォルトの名無しさん
NGNGもしそうならK&R読んできた方が・・とか。
0598デフォルトの名無しさん
NGNGそれは割り当てアルゴリズムだね。
隣り合う領域の連結はベストフィットでも同じ筈。
K&Rのはシンプルでいいですね。
0599ひげぽん ◆zcp/NZpA
NGNG>>597,598
>隣り合う領域の連結ってファーストフィット?
>もしそうならK&R読んできた方が・・とか。
ええ。ファーストフィットです。
いちばんシンプルですし。タネンバウムの本で知りました。
連結処理、今週末に出来れば良いなあって感じです。
0600ろうひ男爵
NGNG進んでるみたいですね〜。
自分の方は、本当にMCBライクな物を使っています。
ところで、バイナリのサイズはどれくらいですか?
自分はまだFDDが満タンになるにはほど遠いのですが、
バイナリの圧縮をlzssでやりました。
ファイルシステムをどうしようかと悩み中です。
0601ひげぽん ◆zcp/NZpA
NGNG>ところで、バイナリのサイズはどれくらいですか?
8KBくらいですね。
フロッピーを満タンにするには、あと何ヶ月かかるか・・・
>バイナリの圧縮をlzssでやりました。
初めて聞く、キーワードですあとで調べて見ます。
>ファイルシステムをどうしようかと悩み中です。
やはり、FAT12でしょうか。
0602デフォルトの名無しさん
NGNG何言ってんの、ファイルシステムはhgpfsに決まってるでしょうが。
ジャーナリングしてね(はーと)
0603名無しさん
NGNGひげっぷひげっぷ
0604名無しさん
NGNG0605ひげぽん ◆zcp/NZpA
NGNG■lzss
http://www.ingnet.or.jp/~kojif/mu/comp/lz77.htm
■hgpfs
見つからないと思ってたら、
>>603
>>604
やっと意味が分かった(笑)
0606デフォルトの名無しさん
NGNG> ■hgpfs
HiGh Performance File System. FD 上では FAT12 互換らしい...。
0607デフォルトの名無しさん
NGNG0608デフォルトの名無しさん
NGNGジャーナリングもLFSみたいな使い方ならFDに使ってもおもしろそうだ。
0609デフォルトの名無しさん
NGNGFATは不可能
0610デフォルトの名無しさん
NGNG> でも今のhigeposだと1セクタ目潰してるからDPB書けないっしょ
> FATは不可能
別に、JMP 命令入れてその後に DPB 書くだけだろ。そんなに難しいことじゃないと思うけど。
0611ひげぽん ◆zcp/NZpA
NGNG今のところ大体、意図どおりに動いている模様です。
次は、ファイルシステムでしょうか。
ちょっと勉強せねばと思っております。
■ジャーナリング
http://www-6.ibm.com/jp/developerworks/linux/010928/j_l-fs.html
ところで、どなたかhigeposをmakeして試してみた事ある人って
いるんでしょうか。
さすがにまだいないですよね。
0612デフォルトの名無しさん
NGNG試すよ
0613ひげぽん ◆zcp/NZpA
NGNG>試すよ
ありがとうございます。
何が起きても責任はもてませんが、もし良かったら試してみてください。
http://higepos.sourceforge.jp/higeboot.bin
0615ひげぽん ◆zcp/NZpA
NGNGありがとうございます。
はやいですねぇ。
現在は、全くインタラクティブではないので
張り合いがないかもしれません。
キーが押されても、key strokeってでるだけだし・・・
ちなみに、[U16-65536]とかはメモリーの情報です。
SIZE=16 ADDRESS=65536 Uは使用中。 Fはフリー
タネンバウム本でファイルシステム勉強中です。
0616デフォルトの名無しさん
NGNG0617デフォルトの名無しさん
NGNG0618617
NGNGs/storoke/stroke/でよろ。
higeposって、どういうOSにするつもり…とか構想はあるのかな?
0619デフォルトの名無しさん
NGNG過去ログ全部読んできてください。
0620ひげぽん ◆zcp/NZpA
NGNG最近平日はなかなか更新できませんが、何とか続けていこうと
思っています。
メモリ管理はリストでやったので
ファイルシステムはビットマップでやろうかな・・・
0621ひげぽん ◆zcp/NZpA
NGNGFDのREAD,WRITE部分を先に実現しないとどうにもならないので
資料を探している途中です。
カーネル内メモリ管理→ファイルシステムの順にこなして行こうと思うのですが、
その前にやっておいたほうが良いことってありますでしょうか。
→経験者の方
PJメンバー募集です。
OS作りに興味がある方で、開発に協力しくれる方を募集します。
ひげぽん宛にご連絡ください。
ttp://sourceforge.jp/developer/sendmessage.php?touser=2006
0622デフォルトの名無しさん
NGNGFDに関してはCQの『パソコンのレガシィI/O活用大全』(↓)を
http://www.amazon.co.jp/exec/obidos/ASIN/4789834336/
を参考にしますた(他にいい資料があるかもしれないけど、とりあえず)。
0623デフォルトの名無しさん
NGNG0624ひげぽん ◆zcp/NZpA
NGNGありがとうございます。
参考にさせていただきます、今度アキバに行ったときでも
探してみます。
0625デフォルトの名無しさん
NGNG技術無いんですけど、興味あるんでいいですか?
0626ひげぽん ◆zcp/NZpA
NGNG全然大丈夫です。
やる気があれば何とかなります(おそらく)
上記のURLからお願いします。
0628デフォルトの名無しさん
NGNG0629ひげぽん ◆zcp/NZpA
NGNGありがとうございます。
引き続け募集中ですので、よろしくお願いいたします。
>>627
いえいえ、もし機会がありましたらまたお願いします。
>>628
やる気があれば大丈夫かと思いますが
気が変わったら是非よろしくお願いいたします。
最近仕事が忙しくて、本当に週末しかあまり更新できていませんが
モチベーションは維持できているのでとりあえずは大丈夫です。
Meadowのsetup.exeを試しに使ってみたところ
今の開発環境(Meadow1.14)がおかしくなってしまったので
現在復旧作業中です。emacs-lispもそのうち勉強しよう・・・
0630と
NGNG例えばFDDならFDコントローラのデータシート等へのリンクが書かれていました
日本語のはなかったけど・・・。
参考になるかと・・
0631と
NGNGhttp://mudlist.eorbit.net/~adam/pickey/ports.html
こんなリンクが、 英語が読めればかなり参考になりそう
0632と
NGNG0633デフォルトの名無しさん
NGNG皆さん頑張ってください。
MSに一泡ふかせてやってくらさい。おながいします。
0634デフォルトの名無しさん
NGNGなかなか秀悦です。
OS製作を目指す方は、ぜひ一読をお勧めします。
とはいえ、私はIB*社員でも何でもありません。
AS/400の実物は触ったこともありません。
それどころか、I*Mとはライバル社の・・・・・・
0635デフォルトの名無しさん
NGNGICMか。なつかしいな。(違う
0636デフォルトの名無しさん
NGNG0638デフォルトの名無しさん
NGNG0639ひげぽん@Meadow
NGNG画面スクロールの部分が未実装だったので
実装中です。
考えだすと欲が出ますね。
上下にスクロールさせたいとか・・・
ところでLinuxでmakeに成功した方
いらっしゃいませんか。
0640デフォルトの名無しさん
NGNG0641ひげぽん
NGNGそうですよね。
失礼しました。
0642ひげぽん
NGNG理想は高かったのですが、結局簡易版となりました。
画面の一番下で改行するとスクロールします。
0643デフォルトの名無しさん
NGNG> 画面スクロール機能を実装しました。
スクロール時に、最下行はクリアしなくていいの ?
0644640
NGNGています。$ gcc --version 2.96 ですが、エラーは `operator new' takes
type `size_t' as first parameter が原因みたいです。
include/higeOperator.hとhigeOperator.cppです。私はC++分からないので、
このエラーに関してはコメント不能です。前もって $ mkdir ../bin ../list
が必要でした。# 改行数制限のため、エラーメッセージは割愛です。
0645Makeflle.linux 作者
NGNGすみません、その辺りの変更を今CVSにコミットしました。
bin と listディレクトリについてはどうしようか考え中です。
#Makefileの中で mkdirする?
が、現在 Linux上で makeしたバイナリはブートできない状態ですので
もうしばらくお待ちください(リンカの問題?)。
もちろん、こうしたらいいよというような意見は歓迎です。
0646ひげぽん
NGNG最下行クリアは必要です。
クリアしていないのになぜかうまくいっていて気づいていませんでした。
あまり考えもせずに実装して、反省中です。
>>644
おっと、もう試していただけたんですね。
こういう報告は大変助かります。
>ています。$ gcc --version 2.96 ですが、エラーは `operator new' takes
>type `size_t' as first parameter が原因みたいです。
私の環境はWindows djgpp gcc.exe (GCC) 3.1です。
higepos PJにもlinux環境の人がいるのですが、
そこでもこの現象が起こっています。
前提として
(1)operator newの引数は size_tでなければならない。
(2)higeposではとりあえずunsigned longにしておいた。
(size_tは処理系で定義するため??)
(3)linux gccはどうやら size_t = unsinged intとして
上記のエラーを出してくるらしい。
すいません、現在調査中ですのでしばらくお待ちください。
0647640
NGNG> すいません、現在調査中ですのでしばらくお待ちください。
このエラーは海外のMLで検索で引っかかりました。フォローアップが無いもの
がほとんどですが、GCCのバグとして処理されているものもあります。パッチ
はいくつかありますが、i386系のアーキテクチャのものは発見できてません。
GCC 3.2 の環境でも作って、試してみないと駄目かな?
0648ひげぽん
NGNGすいません調べていただいてありがとうございます。
#ifdef等でこのエラーを回避することは出来ると思うのですが
その前に何が正しいのかを調べないといけないですね。
operator new の引数は size_t? unsigned int? unsigned long?
0649ひげぽん
NGNGとの記述を見つけたのですが、関係あるのでしょうか。
C++の仕様を探してたら、17$と書いてあったんだけど
C++の仕様書を本で買ったら17$という意味なのかな?
0650645
NGNGtypedef __SIZE_TYPE__ size_t;
と型定義することで解決しました。
ということで、現在 DJGPPとLinux(gcc2.96)で buildできる状態です。
#Linux版は bootせずですが。。
0651ひげぽん
NGNGひとまず解決してホッとしていますが、Linux版で
ブートしないのはいずれきちんと調査しないとまずいですね。
0652デフォルトの名無しさん
NGNGg++-2.95 -I include -nostdlib -fno-exceptions -fno-rtti -ffreestanding -fno-builtin -Wall -c -DBUILD_ON_LINUX io.cpp -o ../bin/io.o
io.cpp: In function `void outportb(unsigned int, unsigned char)':
io.cpp:61: parse error before `::'
//g++-2.0の場合
ld: warning: cannot find entry symbol _start; defaulting to 00001200
../bin/higepos_kernel.o: In function `startKernel()':
../bin/higepos_kernel.o(.text+0xb6): undefined reference to `operator new(unsigned)'
../bin/higepos_kernel.o(.text+0xd4): undefined reference to `operator new(unsigned)'
../bin/higepos_kernel.o(.text+0xf6): undefined reference to `operator new(unsigned)'
../bin/higepos_kernel.o(.text+0x133): undefined reference to `operator delete(void*)'
../bin/higepos_kernel.o(.text+0x17e): undefined reference to `operator new(unsigned)'
../bin/higeOperator.o: In function `X86MemoryManager::instance()':
../bin/higeOperator.o(.gnu.linkonce.t._ZN16X86MemoryManager8instanceEv+0x2b): undefined reference to `__dso_handle'
../bin/higeOperator.o(.gnu.linkonce.t._ZN16X86MemoryManager8instanceEv+0x37): undefined reference to `__cxa_atexit'
0653デフォルトの名無しさん
NGNGg++-2.0じゃなくてg++-3.0ね。
0654Linuxたんとー
NGNG情報ありがとうございます。
gcc2.95 に関しては該当行を
asm volatile ("outb %%al,%%dx": :"d" (port), "a" (value));
にする(「::」の間にスペースを入れる)ことでコンパイルできますか?
(コンパイルファームの gcc 2.95.4で試したところ、上記でOKでした)
gcc-3.0 は今、手元にコンパイラが無いため確認できません。。
0655ひげぽん
NGNG早速の情報ありがとうございます。
g++ 2.95のほうはなんとなく解決しそうですが
g++ 3.0のほうは、完全にリンカエラーですね。
>../bin/higeOperator.o(.gnu.linkonce.t._ZN16X86MemoryManager8instanceEv+0x2b): undefined reference to `__dso_handle'
>../bin/higeOperator.o(.gnu.linkonce.t._ZN16X86MemoryManager8instanceEv+0x37): undefined reference to `__cxa_atexit'
この辺は_pure_virtualの仲間かな。
要調査ですね。
0656デフォルトの名無しさん
NGNGそれANSIのHPで買えるPDF版じゃないかな
0658654
NGNG確認ありがとうございます。
> 力なれなくてスマソ。
とんでもないです。ありがとうございます。
3.x系に関しては、gcc-3.0を見付けたのでこれからこちらでも調べてみます。
0659ひげぽん
NGNG>>656さん
>それANSIのHPで買えるPDF版じゃないかな
そういうことですね。
ありがとうございます。
>>652さん
いろいろとありがとうございました。
0660デフォルトの名無しさん
NGNG:が一個多いということでしょうか?
io.cpp: In function `void outportb(unsigned int, unsigned char)':
io.cpp:61: parse error before `::'
0661デフォルトの名無しさん
NGNGじゃなっくて,間にスペースを入れないと駄目なみたい。
0662デフォルトの名無しさん
NGNGエラーはこんなのが出ました。
ld: PE operations on non PE file.
0663640
NGNGg++ --version g++ (GCC) 3.2
nasm -r NASM version 0.98
な環境作成してみました。結果は、
ld: warning: cannot find entry symbol _start; defaulting to 00001200
../bin/higepos_kernel.o: In function `startKernel()':
../bin/higepos_kernel.o(.text+0xb6): undefined reference to `operator new(unsigned)' 以下略
でした。何もできませんが、頑張ってください。
0664ひげぽん
NGNG情報ありがとうございます。
こういう情報は、大変貴重でありがたいです。
これからもよろしくお願いいたしますm(__)m
0665デフォルトの名無しさん
NGNG0666デフォルトの名無しさん
NGNGおこちゃまは何を動かしたいのかな〜
0667640
NGNGhigepos_kernel.o: ELF 32-bit LSB relocatable, Intel 80386,(略)
なんだけどOSってELF32をそのままリンクして作るものなのでしょうか?
もしかしてクロスコンパイル環境が必要ですか? 無知ですまんです。
$ readelf -a higepos_kernel.o
の結果から、
R_386_PC32 00000000 _Znwj
R_386_PC32 00000000 _ZdlPv
がundefined referenceみたいですが結局分からんです。意味無しm(__)m
0668デフォルトの名無しさん
NGNGいま,gccをクロスコンパイルできるように構築中。
ターゲットのしていは --target=i686-pc-msdosdjgpp
0669640
NGNG> --target=i686-pc-msdosdjgpp
情報Tnx。Linux上でbinutils-2.13とgcc-2.95.2でクロス環境構築中です。
うまくいけば報告します。
0670デフォルトの名無しさん
NGNGはできたけど、gcc-2.95.3はうまく構築できなかった。gcc-3.2は無事クロス
環境だけど、
../bin/higepos_kernel.o(.text+0x278):higepos_kernel.cpp: undefined reference to `__Znwm'
こんな感じ。higepos_kernel.oは、
$ file ../bin/higepos_kernel.o
../bin/higepos_kernel.o: 80386 COFF executable not stripped - version 30821
だから、一応クロス環境にはなっているみたい。
gcc-2.95.3の環境作りに励みます。
>>668さんはどんな状況でしょうか?
0671デフォルトの名無しさん
NGNG結果、
../bin/KeyBoardManager.o(.text+0x11):KeyBoardManager.cpp: undefined reference to `__$_15KeyBoardManager'
になりました。最新のCVS版です。
io.cpp: asm volatile ("outb %%al,%%dx": :"d" (port), "a" (value));
は修正済みです。
0672ひげぽん
NGNG>../bin/KeyBoardManager.o(.text+0x11):KeyBoardManager.cpp: undefined reference to `__$_15KeyBoardManager'
最新版CVS updateしました。
KeyBoardManager周りを微妙に変えてみたので
試していただけないでしょうか。
0673デフォルトの名無しさん
NGNG> 最新版CVS updateしました。
コンパイルは無事通りました。これから起動テストに入ります。bochsがうま
く動かないので、再起動テストになるので、しばらくお待ちください。
0674673
NGNGしなかったので、私のマシンの問題のようです。(Intel入ってないです) ディ
スカッションフォーラム: Open Discussionにthird.binをおいておきました。
0675ひげぽん
NGNG確認ありがとうございます。
現在、bochsでは起動できるが、
ネイティブブートが出来ないという問題があがっています。
現在現象の原因究明中ですので、解決後に
もし良かったらご確認いただけたらとおもいます。
ありがとうございました。
0676デフォルトの名無しさん
NGNG構築できていません。(>_<)
だけどcygwinでもCOFFだし本当にクロス環境はいらないかも・・・
問題はリンカスクリプトあたりかも知れない。
0677デフォルトの名無しさん
NGNG>
>たとえば、上に上げた例外や、他言語(アセンブラが主かな)とのシンボル名の整合
>あとは、cだとランタイムを使わなければ良いだけでも、
>c++ではnew演算子とか言語自体の機能なんで、
>デフォルトでいらないコードがリンクされたり、それの準備のための初期化ルーチンが用意される。
C++もライブラリなんか必要無いんだけどな…
gcc使ったこと無いのかな…
0678673
NGNG> 問題はリンカスクリプトあたりかも知れない。
リンカスクリプトはdjgpp.djlを拾ってきてクロス環境のlibに配置しました。
また、stub.h stubify.cからstubifyを作成し、クロス環境のbinに配置しまし
た。Linuxとは違うかもしれませんが参考まで。
0679デフォルトの名無しさん
NGNG無事に起動することを確認しました。最初からWinで試せばよかった(^^;
binutils-2.13とgcc-2.95.3を--target=i686-pc-msdosdjgpp
でconfigureしたクロス開発環境です。
0680デフォルトの名無しさん
NGNG0681デフォルトの名無しさん
NGNGhigeposを構築するのに,gccの構築はいらなくてldだけでいいんじゃないだろうか。
と言うつもりでした。(cygwinでは)
でもこの情報は役に立つと思います。
ありがとう
0682デフォルトの名無しさん
NGNG確かにGNU BFDを利用すれば、LinuxでもELFからCOFFへの変換はldがやってく
れそうですね。--enable-targets=allでbinutilsを構築するだけで良かったの
かな?
0683682
NGNGは、前もってobjcopyとかで変換しておかなければ駄目かもしれませんね。
0684デフォルトの名無しさん
NGNGhttp://my.execpc.com/~geezer/osd/
http://nondot.org/sabre/os/articles
http://www.mega-tokyo.com/os/os-faq.html
http://www.acm.uiuc.edu/sigops/roll_your_own/
written in C++
http://www.cs.washington.edu/homes/tom/nachos/
まぁ知ってるだろう一応。
0685ひげぽん
NGNGありがとうございます。
皆様より寄せられた情報を元にMakeFile等改善していけたらと
思います。
>>684さん
ありがとうございます。
http://ime.nu/www.osdev.org/
のMessage Boardはなかなか有用な情報が多いですね。
0686デフォルトの名無しさん
NGNGtimes 510-($-$$)
times 512-($-$$)
となってるけど
逆にしたほうがいいんじゃないかな?
0687ひげぽん
NGNGhigeposがネイティブートできるようになりました。
higepos最新版をmake後、dd or rawriteでフロッピーに
書き込むと、私の環境ではネイティブブートできました。
0688デフォルトの名無しさん
NGNGld でbinaryの指定が出来ないので色々やってましたが
結局,stripかobjcopyでbinaryに変換するのがベストでしょう。
指定の仕方は -O binary になります。
0689デフォルトの名無しさん
NGNG0690ひげぽん
NGNG>firstboot.asmとsecondboot.asmの最後にそれぞれ
>times 510-($-$$)
>times 512-($-$$)
>となってるけど
>逆にしたほうがいいんじゃないかな?
なぜでしょうか。
firstbootは510byte目までは0埋めで2byteのマジックナンバー
をつけるのではなかったでしたっけ?(記憶があいまいです。)
0691ひげぽん
NGNG変更点は以下の通りです。
secondboot.asm
>set_cs_desc1:
> mov ax, 0x10 ; ds & es
> mov ds, ax ; selector is
> mov es, ax ; 0x10
> mov ax, 0x18 ; ss selector
> mov ss, ax ; is 0x18
> mov esp, 1024*1024*8 ; sp is 8MB (was mov sp, 0x1000)
> jmp 0x200
0692デフォルトの名無しさん
NGNG単にずれてると思ったのだけです(^^;)
0694デフォルトの名無しさん
NGNGhigeboot.binをddで書き込んだフロッピーで起動することを確認しました。お
めでとうございます。さらなる発展を期待しています。頑張ってください。
0695デフォルトの名無しさん
NGNGhigepos_kernel.cpp50行目の_sys_Unlock()つまりasm("sti")で止まっている。
コメントアウトしたらちゃんと動いたから。
しかし指摘されてないってことは俺の環境だけなのかな。
linux
gcc2.95.4
binutils-2.13
bochs1.4.1
0696デフォルトの名無しさん
NGNG0697ひげぽん
NGNG>さらなる発展を期待しています。頑張ってください
動作確認情報ありがとうございます。
これからもよろしくお願いいたします。
>>695
>bochsだと3thException吐いて止まるな。
私の環境ではでないですね。
うーん。なぜだろう。
0698695
NGNGsourceforgeに落ちてるbinary(higeboot.bin)ならいけたのでやっぱmake時の問題かねぇ。
ld: warning: cannot find entry symbol _start; defaulting to 00001200
0699ひげぽん
NGNG>ld: warning: cannot find entry symbol _start; defaulting to 00001200
これは私のところでも出ていますね。
今現在のCVS最新でもなりますか?
0700ひげぽん
NGNGhigepos PJのプロジェクトホームページを作っていただける人。
皆様にhigeposの動作確認等をしていただいた情報を
そこで公開しようと思っています。
ひげぽんは、はげしくデザインセンスがないので
カッコイイのを作ってくださる方お願いいたしますm(__)m
http://sourceforge.jpでアカウントを取得後
http://sourceforge.jp/users/higepon/より
ひげぽんまでご連絡ください。
0701デフォルトの名無しさん
NGNGクロスコンパイル環境がうまくできていない可能性はないですか?GCCがELF
フォーマットを吐く時は同じエラーでしたが、COFFを吐くようにすると起動で
きます。
# bochs-1.4.1 on Linux では"Key hit!"がまだみれていない。(泣
0702701
NGNG問題でした。higeposは無罪です。
0703695
NGNG>>701
具体的にはCOFF形式で吐かせるためにはgccの./configureの時点でサポートして、
-gcoffオプションをつけてコンパイルってことで良いですか?
調べてみるとそんな感じだったのですが。。。
gccもbochsもdebで適当にぶちこんだ物なので。。。
0704デフォルトの名無しさん
NGNG0705ひげぽん
NGNG>cygwinで構築することができました!!!
>ld でbinaryの指定が出来ないので色々やってましたが
>結局,stripかobjcopyでbinaryに変換するのがベストでしょう。
もし良かったらcygwinでのmake方法を詳しく教えていただけないでしょうか。
cygwinでmake出来るのであれば、あえてdjgppを使う理由はあまりないので・・・
0706デフォルトの名無しさん
NGNG>>679
0707デフォルトの名無しさん
NGNGリンカのオプションの--oformat binaryを消して,
リンク後にstripなどで-O binaryのオプションで変換します。
特に環境を替える必要はないはずですが,色々やった後なのでそのあたりは自信がありません。
0708ひげぽん
NGNGsourceforge.jpの cvs のディレクトリ構成に変更がありました。
CVSROOT/ CVSROOT/
higepos/ → higepos/
higepos_v1.1/
higepos/旧開発ディレクトリ
higepos_v1.1/新開発ディレクトリ
MakeFile、ファイル名等に変更がありますが
中身は同一です。
今日以降は新開発ディレクトリで、開発が進みますのでご注意下さい。
0709ひげぽん
NGNGbochs,ネイティブブートが確認できましたのでcvs addしました。
>>707さん
ありがとうございました。
0710695
NGNG情報thanks.
やっと回避できたよ。。。
>>708
LinuxのMakefileの記述にミス発見(tarball)
20行目のXが小文字になってる。
しかし1.1だと普通にMakeしても大丈夫なんだよなぁ。
0711ひげぽん
NGNG>LinuxのMakefileの記述にミス発見(tarball)
>20行目のXが小文字になってる。
修正しました。ご指摘ありがとうございます。
以前からあった記述ミスのようです。
しかしMakeFileが3つもあるとメンテが面倒ですね。
うまくまとめられないだろうか。
0712デフォルトの名無しさん
NGNG> しかし1.1だと普通にMakeしても大丈夫なんだよなぁ。
クロス環境なんていらなくなりましたね。なんでだろう?
# 開発者の方で把握していたら教えてください。
0713712
NGNG> クロス環境なんていらなくなりましたね。なんでだろう?
すみません。bochsrcファイルが以前のhigeboot.binを指定していただけでし
た。新たにhigepos_v1.1/bin/higeboot.binを指定し直したところ、3rd
exception with no resolutionで停止しました。
クロス環境で作成するとだと無事に起動しました。
# リターン入力でのハートがラブリー ♥
0714デフォルトの名無しさん
NGNGLunxとCygwinでは同じmakeファイルでokなはずです。
djgpp方ではツールの入ったフォルダにパスを通すとかして環境をmakeファイルに合わせればいいです。
0715ひげぽん
NGNG>クロス環境で作成するとだと無事に起動しました。
確認ありがとうございます。
># リターン入力でのハートがラブリー ♥
デバッグ中なので対応する文字コードが存在しないキーは
変な文字が表示されます。あまり気にしないでください・・・
>>714
>LunxとCygwinでは同じmakeファイルでokなはずです。
そうですよね。MakeFile.cygwinがLinuxでも普通に使えることが
確認できたら統一したいです。
djgppとの統合は うーん といった感じです。
これからはcygwinに移行する気がします・・・
0716LightCone ◆sSJBc30S5w
NGNGソース見てみましたが、アセンブラ部は僅かでほとんどC++で書いていらっ
しゃる点には驚きました。今後が楽しみです。
ところで、割り込みディスクリプタテーブルについてですが、本来は、
ハードウェア割り込みのベース番号を再プログラムする必要があります。
そうしないと、一般保護例外(13)などと、ハードウェア割り込みの区別が
付きません。
しかし、gccでも簡単に32BIT-OSが作れるようになっているのですね。
4、5年前は、ジャジャ馬のようでしたが(個人的には)。
0717LightCone ◆sSJBc30S5w
NGNGhigeposはシンプルで良いですね。
NWSOSの場合、16BIT BIOS を走行させるための16BITエミュレータ
を持っていることや、メモリ空間確保のため、カーネルを高位アドレスへ
転送しているからも有るでしょうけど。
最初に物理メモリの空きマップを調べてから、仮想アドレス空間へ
マップし、カーネルを転送しています。
GDTの位置(テーブルの位置)も上位へ転送するので、再構築
したりしてます。こんな複雑なことをする必要は無いんじゃないか
と思ったりするのですが。
話が厄介なのは、「ページテーブル管理ルーチン」が、カーネル
転送前と、転送後の両方で必要になることなんです。
ページング ON の状態でカーネルを転送するために、転送前の
アドレスにも管理ルーチンが存在している必要がありますが、
一方で、転送後にも当然必要です。しかし、転送後は、転送前の
メモリはゴミと化すので、どうしても二つ必要な気がします。
同じソースを流用できるかもしれませんが。
0718LightCone ◆sSJBc30S5w
NGNG割り込んだ時に、最低でも一回はシステムが用意したハンドラに
入ってから、必要に応じて、16BITハンドラと、32BITハンドラを
呼び出す、という仕組みになりますから。
16BITモードから、32BITモードへ「戻る」のもIA32では難しかった
ですね。
higeposでは、DISK周囲はどうされますか? 個別にドライバを
用意しますか? 画面モードの切り替えにも、BIOS呼び出しが必要
になると思いますが。
ちなみに、VESA の プロテクトモードインターフェースはNWSOSでは
使わず、16BITモードインターフェースをエミュレーション実行
しています。
0719デフォルトの名無しさん
NGNG0720デフォルトの名無しさん
NGNG> そうですよね。MakeFile.cygwinがLinuxでも普通に使えることが
> 確認できたら統一したいです。
CC, LD, STRIP, NASM, NDISASMとかの変数を別途用意した定義ファイルに書く
ようにすると大丈夫ではないでしょうか?djgpp, cygwin, Linuxではすべて
GNU makeだと思うので、includeが利用できると思います。クロスコンパイル
では、CC = prefix/bin/i686-pc-msdosdjgpp-g++,
LD = prefix/i686-pc-msdosdjgpp/bin/ld のようにする必要があるので、
修正は必須になります。
0721ひげぽん
NGNG>ソース見てみましたが、アセンブラ部は僅かでほとんどC++で書いていらっ
>しゃる点には驚きました。今後が楽しみです。
ありがとうございます。
ご期待に沿えるかどうかは分かりませんが、気長にやっていくつもりです。
> ところで、割り込みディスクリプタテーブルについてですが、本来は、
>ハードウェア割り込みのベース番号を再プログラムする必要があります。
>そうしないと、一般保護例外(13)などと、ハードウェア割り込みの区別が
>付きません。
はい、上記はhigepos PJメンバーの指摘により認識しています。
現在の課題のひとつです。
> しかし、gccでも簡単に32BIT-OSが作れるようになっているのですね。
>4、5年前は、ジャジャ馬のようでしたが(個人的には)。
そうですね。
確かに現在では、海外のOS Devサイトでかなりの情報が
取得出来るのが大きいですね。
また、2chのような情報交換の場があるのもありがたい話です。
>ちなみに、NWSOSでは、初期化がかなり複雑で好ましくないのですが、
>higeposはシンプルで良いですね。
シンプルというよりは、むしろ必要な初期化が足りていないと
いうのが現状です。
0722ひげぽん
NGNG> ・
> ・
> ・
>16BITモードから、32BITモードへ「戻る」のもIA32では難しかった
>ですね。
現在の私の力量ではとても手を付けられそうなところですね。
さすがですね。
私も精進せねば・・・
> higeposでは、DISK周囲はどうされますか? 個別にドライバを
>用意しますか? 画面モードの切り替えにも、BIOS呼び出しが必要
>になると思いますが。
higeposは、現時点ではFDD動くことを目標としているので
FDDドライバを用意する予定です。
いろいろとアドバイスありがとうございます。
0723ひげぽん
NGNG>CC, LD, STRIP, NASM, NDISASMとかの変数を別途用意した定義ファイルに書く
>ようにすると大丈夫ではないでしょうか?
はい、現在DJGPPの私の環境ではBATファイルを用意して対応しています。
>djgpp, cygwin, Linuxではすべて
>GNU makeだと思うので、includeが利用できると思います。クロスコンパイル
>では、CC = prefix/bin/i686-pc-msdosdjgpp-g++,
>LD = prefix/i686-pc-msdosdjgpp/bin/ld のようにする必要があるので、
>修正は必須になります。
なるほど貴重なご意見ありがとうございます。
higeposの一課題として取り組んでいきます。
0724LightCone ◆sSJBc30S5w
NGNG>>ちなみに、NWSOSでは、初期化がかなり複雑で好ましくないのですが、
>>higeposはシンプルで良いですね。
>シンプルというよりは、むしろ必要な初期化が足りていないと
>いうのが現状です。
シンプルなことは素晴らしいことです。
アセンブラ部とC言語部を「リンク」せずに、単にcatするアイデアなど
は面白いと思いました。リンクしたほうが恐らく複雑になるので、
少なくとも現状の規模では、catの方がいいと思います。
また、OSを作り始めるときに、アセンブラでなく、ほぼいきなり
C/C++からやってしまうのは凄いことなんじゃないかと思いました。
C/C++だとセグメント配置などが厄介なはずなので。
ld がOSを作りやすいように出来ているのかもしれませんが。
タスクを制御しだすと、スタックを細かく扱う必要がありますが、
そこもC++でどこまで出来るか興味があります。
話は変わりますが、個人的に一番労力を割いたのは、IA32の複雑な
アーキテクチャの理解だったかもしれません。
初期化やモード遷移には物凄く悩まされました。
どのゲートを使うべきか等も、しばらく検討していたように
思います。
そうこうしているうちに、4GB では足りなくなって、物理メモリと、
仮想メモリが、順に拡張されましたね。SSE/SSE2まで理解し様と
するとほどんどパニック状態になりそうです。SSE/SSE2命令を
使えるようにするためにはOS側のサポートも欠かせないのですが。
0725LightCone ◆sSJBc30S5w
NGNG多分、今後の higepos に必要なのは、ページング関係と割り込み
関係だと思います。
各種例外ハンドラを整備するのはOSとしては必須ですので避け
られませんが、例外が起きた時の処理は以外に面倒でした。IA32
の膨大な資料とにらめっこしながらコーディングしていたのですが、
当時詳しいドキュメントが無くて、実験しながら正しい理解を得ていか
ざるを得ませんでした。今でもこの辺はやってみながら薦めていかないと
正しく理解するのが難しいのではないでしょうか。
ページング関係は早い段階で実装してしまう必要が有ると思います。
後になってページングをサポートし様としても修正が大規模になり、
デバッグが大変になるかもしれませんので。
最近まで、実験機と開発機が共通でしたが、
OS開発ではまると、ブートさせても「停止」すらしてくれないん
ですよね。止まってくれただけで一安心みたいな境地でした。
なんらのメッセージすら見えずに一瞬にして再リセットなんて事の
方が普通だった時期もありましたね。こんなことを話しても、飲み屋
の愚痴みたいで何の参考にもならないと思いますが、すみません。
0726ひげぽん
NGNG>また、OSを作り始めるときに、アセンブラでなく、ほぼいきなり
>C/C++からやってしまうのは凄いことなんじゃないかと思いました。
ここは、私の技術的背景もあると思います。
端的に言うならばアセンブラ初心者であったので
なるべくアセンブラ部分を少なくしようという意図が
働いたのだと思います。(C++も初心者ですが・・・)
>タスクを制御しだすと、スタックを細かく扱う必要がありますが、
>そこもC++でどこまで出来るか興味があります。
なるほど。
私がhigeposをC++で書こうといろいろと調べてたり、
2chの方にアドバイスを頂いたときに感じたのですが。
0727ひげぽん
NGNG実際にソースを公開している
いわゆる売り物ではないOSで
C++で実装している物があまり見つからないのです。
これはC++でやってやろうという人が少ないのか
それともC++で通すと、いずれ壁にぶつかるのか・・・
いずれ答えは出ると思いますが。
ただhigeposはC++を使っているものの
私が当初想定したより、かなりの制限を受けています。
・例外処理が使えない
・継承が使えない
・テンプレートが使えない
上記はおそらく、私の技術レベルが低いために
OSを作る際に、該当機能を使う環境が整えられない
のが原因なので、いずれは解決したいです。
0728ひげぽん
NGNG> 多分、今後の higepos に必要なのは、ページング関係と割り込み
>関係だと思います
現在のhigeposは、いろいろと手を入れるべきところがあります。
プライオリティづけが必要であると感じています。
特にページングは、LightConeさんのおっしゃるとおり
早いところ手を付けたいところですね。
>こんなことを話しても、飲み屋
>の愚痴みたいで何の参考にもならないと思いますが、すみません。
いえいえ大変参考になります。
OSを作っているかたで、しかも大先輩の
お話を聞ける機会はなかなかないので・・・
少しでもNWSOSに追いつけるようにがんばります。
0729デフォルトの名無しさん
NGNG0730デフォルトの名無しさん
NGNGがんがれ。情報無しでsage
0731LightCone ◆sSJBc30S5w
NGNG>ただhigeposはC++を使っているものの
>私が当初想定したより、かなりの制限を受けています。
>・例外処理が使えない
>・継承が使えない
>・テンプレートが使えない
テンプレートはマクロなので使えない方がむしろ不思議ですね。
継承も多分少し工夫すると使えるようになると思います(思うだけ
ですが)。
例外処理だけは、容易には使えないかもしれません。
一年位前まで、C++の例外処理は単に言語レベルで解決されていて、
OSに依存せずに処理されているのかと思っていたのですが、
コンパイラによっては、OSの機構にモロに依存しているようなのです。
極端な話、ページ例外や、一般保護例外といった CPU 例外と、
throw,catch などの機構を統合して処理できるOSもあるみたいです
(実はWindowsがそうらしい)。
Windowsの catch機構は、throw したものだけでなく、他人が作
ったライブラリのバグなども拾うことが出来るようになっているよう
です。これは非常に興味深い機構で異常に強力なのですが、当然
OS側からの前面的なサポートが必要なので、新しいOSを作る際には
基本的に使えません。ただし、純粋に言語レベルでソフト的に処理
する方法もあると思います。「スタックの逆戻し」とか中々、乙な
仕組みをやってるみたいですが。
0732LightCone ◆sSJBc30S5w
NGNGいずれにせよ、例外処理はかなりスタックを複雑に走査する必要がある
ので、作りたてのOSの、しかも、カーネルを記述する際に使用するとな
ると、難しい問題を招き入れてしまうことになりそうです。
カーネルのスタックの容量を自動伸張したりするのは、技術的に
高度で、新規のOSでは避けて通るに越したことは無いと思います。
例外処理を使うとスタック消費量も予想しづらくなりそうなので、
個人的には避けたほうがいいように思います。ただでさえ、
カーネル内の「スタック」の利用は伸張になる必要があります
から。
実は、NWSOSでは、カーネルも、ユーザープログラムも、
タスク毎に独立したスタック(つまり、タスク数*2本の
スタック)を持っています。このようにすると、カーネル
が使うスタックが不足することは考えなくて済むかも
しれません。ただ、それでも、ファイル名格納用のメモリは、
スタックに取らずに SysMalloc() というメモリ確保関数
から取得した領域を使うようにしています。スタックでも
問題ないかもしれませんが、、、。
同一タスクに、複数のスレッドを起動する場合は、
カーネルスタックはやはりスレッドの数だけ用意するべき
なのかもしれませんね。何が良いかは良く分かりませんが。、
0733LightCone ◆sSJBc30S5w
NGNG優先順位付けは、腕の見せ所でも有るかもしれませんね。
何が必要で、何がそれほどでもないか。または、何を先にやれば、
うまくいくか、を決めていくのは、一番大事なところかもしれませ
んし、、、。OS作りでは、細かいロジックも重要みたいですが。
僅かでも間違いがあるとどこかで露呈しますし、いくら大局的に
立派な思想に基づいていても、細かいロジックが「解け」なければ
「もの」として出来てきませんからね。OSを作っていると、
つくづく、そういうところで自分の愚かさ加減がいやになりますが。
話は変わりますが、マルチタスクOSを作っていると、よく
ロック、アンロックを使う必要がありますよね。ご存知かもしれま
せんが、
「デッドロックを起こさない絶対的な基準」
を知っていると得ですね。
これを知っていると楽ですね。
「入れ子のロックの順序を統一せよ」
ってだけなんですが、、、。
0734LightCone ◆sSJBc30S5w
NGNG何度も連続投稿してすみませんが、
>これはC++でやってやろうという人が少ないのか
>それともC++で通すと、いずれ壁にぶつかるのか・・・
>いずれ答えは出ると思いますが。
特に壁は無いとは思いますが、低レベル言語の方が楽な場合も多いから
じゃ無いでしょうか。
保守性や拡張性や可読性は、高級言語のほうが遥かにいいのですが、
フラグ操作や、スタック操作、iret命令、例外ハンドラ書き、などは、
一部にはどうしてもアセンブラの助けが必要になるのですが、
そういう部分で高級言語と連携させようとすると通常一手間増えてしま
います。
ただし、C++の本領発揮できる部分も沢山有ると思います。
リストを多用しやすいことや、自動的なコンストラクタ、デストラクタ
挿入によるでミスの無い記述ができること、などは非常に有利では
ないでしょうか。
ただし、大まかに言って、カーネルは必要最低限のものの集合体で、
いわば、互いに素というか、各部分の共通部分がすくないため、
似たもの同士を結びつける時に威力を発揮する「継承機能」は余り使う場面
が無いかもしれませんね。
0735LightCone ◆sSJBc30S5w
NGNG単純に考えても、ファイルシステムの各APIは、そんなに共通の性質が
有るとは思えません。オープンとクローズは関連の仕方が、恐らく継承で
解決できるものではありませんよね。ReadとWriteは似ているので、「継承」
が使える余地は有ると思いますが。
ディレクトリ作成とファイル作成は内部処理は似た部分が多いので、
「継承」で簡単化できる可能性もあることはありますが、別の方法で
共通部分を上手く処理する方法もあると思いますので、C++が有利
になるかどうかは個人的には良く分かりません。
例外処理なども、各ハンドラに似た部分も多そうなので、C++が有利そう
ではあります。しかし、もしかすると、
「どんな、割り込みハンドラを登録しても、矛盾無く調停される」
ということが出来る方が、オブジェクト指向で矛盾を減らすことよりも、
安定性や汎用性が高くなるため、理想的では有ると思います。
0736デフォルトの名無しさん
NGNGつもりで、ひげぽんの独断で方針決めて、がんがん作っちまえばよいと思われ。
んで、ひととおり動いたら、また新しく目標立ててプロジェクトおこせばいい。
最終的にはQNXを凌ぐオープンなOSを個人的には希望(笑
0737ひげぽん
NGNG>テンプレートはマクロなので使えない方がむしろ不思議ですね。
>継承も多分少し工夫すると使えるようになると思います(思うだけ
>ですが)。
LightConeさんのご意見を受けて、テンプレートを試したところ
うまくいきそうです。どうやら私知識不足でリンクエラーになっていたみたいです。
これから簡易版Vectorでも実装してみます。
>優先順位付けは、腕の見せ所でも有るかもしれませんね。
>何が必要で、何がそれほどでもないか。または、何を先にやれば、
>うまくいくか、を決めていくのは、一番大事なところかもしれませ
>んし、、、。
全くその通りですね。しかもご指摘の通りOSを作成する場合には
細かいところにも気を配らないといけませんね。
0738ひげぽん
NGNG>いわば、互いに素というか、各部分の共通部分がすくないため、
>似たもの同士を結びつける時に威力を発揮する「継承機能」は余り使う場面
>が無いかもしれませんね。
そうですね。私が想定しているのは
完全にインターフェースとしての継承機能を用いることです。
例が悪いかもしれませんが、
外部記憶装置のドライバーの機能は外から見た場合
大雑把に言って
init:初期化
read:読み込み
write:書き込み
close:終了処理
となると思います。
0739ひげぽん
NGNGですので上記のようなインターフェースを持つ基底クラスとして
抽象クラスBaseDiskDirverを作成します。
具体的なハードウェアのドライバー担当者は
こいつを継承した具象クラスを実装する形になります。
OS側では
BaseDiskDrier* p = new FloppyDiskDriver1();
や
BaseDiskDrier* p = new FloppyDiskDriver2();
や
BaseDiskDrier* p = new HardDiskDriver();
としてドライバーインスタンスを生成しますが
どのドライバーを用いているかを気にするのは
インスタンスの生成のところだけで
それ以降は、pが一体どのドライバーオブジェクトなのか
を気にせずに処理が出来るようになります。
p->write(・・・・);
ドライバーの例はあまり適切ではありませんで
分かりづらいかとは思いますが
このような使い方が出来たらと思っています。
0740ひげぽん
NGNG>所詮習作なので、作ってて気に入らなくなったらまたゼロから作るぐらいの
>つもりで、ひげぽんの独断で方針決めて、がんがん作っちまえばよいと思われ。
>んで、ひととおり動いたら、また新しく目標立ててプロジェクトおこせばいい。
ありがとうございます。
「動けばいいや」精神が弊害になってきているので
そこだけ注意して、これからもやっていきます。
0741デフォルトの名無しさん
NGNG> 例が悪いかもしれませんが、
全然適切。
現在のモダンな OS では、基本的にひげぽんさんが考えているようになっている。
例えば FreeBSD 2.x では...
struct cdevsw {
d_open_t *d_open;
d_close_t *d_close;
d_read_t *d_read;
d_write_t *d_write;
d_ioctl_t *d_ioctl;
...
};
と言うような、デバイス処理ルーチンの関数テーブルがあって、OS はデバイスから読みたい時は、device->d_read(...); と間接コールをする。
これらのテーブルは、デバイスの初期化ルーチンが呼ばれる時にセットされる。
要するに、C++ の仮想関数と同じことを手でやってると言うこと。
だから、ここら辺を C++ で書くと結構きれいにかけるかもしれないと思っているので、ひげぽんさん頑張ってください。
0742デフォルトの名無しさん
NGNG0743LightCone ◆sSJBc30S5w
NGNG基本的には、面白そうなのですが、一つ注意することがあると思います。
それは、カーネル自体を C++ で書いていたとしても、
ユーザーレベルに公開するインターフェースとは別の話ではあることです。
例の様にドライバの機能を仮想関数で呼び出せるようにするには、
「ドライバの公開仕様」として、「仮想関数テーブル」を出す必要がある
ことになると思います。
しかし、通常仮想関数テーブルは、コンパイラ依存になりますが、
正式なドライバの仕様は、もっと固定的で無ければならないわけで、
単純なコンパイラの吐くコードで直接カーネルから、ドライバの
仮想関数を呼び出せるわけではないと思うのですが、どうですか。
0744LightCone ◆sSJBc30S5w
NGNGそれと、ドライバであってもある程度の保護下で動かすのが普通ですので、
ドライバを呼び出す際には「特権レベルの遷移」が必要です。
仮想関数呼び出しは、当然ならが、単純な near call が生成される
だけですので、そのままでは使えないと思います。
具体的には、スーパーバイザレベルに近いものへのコールは、
コールゲートやトラップゲートなどを利用できるのですが、逆向きレベル
への遷移は、IA32 では iret 命令を使う方法しかないため、ドライバを
非特権レベルで走行させるためには、通常のコンパイラで自動生成される
コードは使えないと思います。その辺はどうしても、インラインアセンブ
ラか、純粋なアセンブラで書く必要があると思います。
仮にドライバをカーネルと同一の保護レベルで動かすことにするとしても、
メモリ空間などで、「断絶」がある可能性が高く、少なくとも、gcc など
が吐くコードを魔法の様に、ドライバとカーネルの垣根を越えて利用する
ことは出来ないと思います。
ただし、カーネルを、C++ で記述するのは面白い試みだとは思いますので、
どうなっていくか楽しみです。
0745ひげぽん
NGNGFreeBSD 2.x ではそのような仕組みが使われているのですね。
私のやりたい事に近いと感じました。
勉強になりましたありがとうございます。
LightConeさん
懸念事項までご指摘・アドバイスいただきありがとうございます。
確かに、ドライバーの場合、いろいろ問題がありそうですね。
ドライバー作成者にどのような環境を用意するかというのも
大きな問題だということが分かりました。
ありがとうございます。
0746LightCone ◆sSJBc30S5w
NGNGそうでしょうね。Linux などでもそんな感じだったと思いますし、
MS-DOS や CP/M でも似たようなものでしたし。
ドライバに限らず、システム側からユーザーが作ったソフトウェアを
呼び出すときには、似たり寄ったりになるのがある意味当然なのですね。
N 個の公開関数があるときに、N 個の関数アドレスを出すか、
「関数アドレス取得関数のアドレス」を一つだけ出して、その
関数で N 個の関数のアドレスを間接的に貰う方法等があると思います。
後者では、
void (*EnumFuncAddr(int k))();
みたいな関数を公開するわけですね。一つで N 個分を網羅できる
わけです。
ioctl などは、一つの関数で、可変種類で、可変長パラメータ
の関数を公開しているようなものだと考えられると思いますが、
これも、後者に近い方法ですね。
いくらでも仕様のバリエーションあっても、根本的な部分
では、何も変わらないわけですね。
0747デフォルトの名無しさん
NGNG> それは、カーネル自体を C++ で書いていたとしても、
> ユーザーレベルに公開するインターフェースとは別の話ではあることです。
ユーザーと言うのがちょっと不明確。
ドライバを書く人のことを言っているのか ?
> 例の様にドライバの機能を仮想関数で呼び出せるようにするには、
> 「ドライバの公開仕様」として、「仮想関数テーブル」を出す必要がある
> ことになると思います。
> しかし、通常仮想関数テーブルは、コンパイラ依存になりますが、
> 正式なドライバの仕様は、もっと固定的で無ければならないわけで、
> 単純なコンパイラの吐くコードで直接カーネルから、ドライバの
> 仮想関数を呼び出せるわけではないと思うのですが、どうですか。
ここは考え方次第。ドライバを書く人は、必ずこのコンパイラを使えというのもありだと思う。
もちろん、各種の処理系でドライバを書きたいとなると、インターフェースは関数テーブル等のように処理系にできるだけよらないものにする必要はある。
その場合でも、ドライバ用のライブラリを作ってドライバ自体は C++ で書けるようにするのがいいと思う。
> それと、ドライバであってもある程度の保護下で動かすのが普通ですので、
の場合も基本的に同じ。これをやりたいなら、そこはインラインアセンブラ等で作成する必要はある。
0749LightCone ◆sSJBc30S5w
NGNG>ユーザーと言うのがちょっと不明確。
>ドライバを書く人のことを言っているのか ?
そうです。
保護なし、同一セグメント、であるなら、可能でしょうね。
0751デフォルトの名無しさん
NGNGlightタン、ちゃんと足は生えてますか?
0752デフォルトの名無しさん
NGNGグロではないかな。気持ち悪い人形。
NWSOSの方、頑張ってくれい。
0753デフォルトの名無しさん
NGNG0754ひげぽん
NGNGありがとうございます。がんばります。
Templateが使えるようになったので簡易版Vectorを追加しました。
これでいろいろと楽になるかも・・・
今までで追加して便利だったのは簡易版printfの_sys_printfかな。
debug時にすごい重宝します。
でも16進表示機能が未実装なのが不満。
やろうと思えばできるんだろうけど、
どうしてもほかの事を優先してしまいますね。
うーん。
0755デフォルトの名無しさん
NGNGコンパイラに渡すオプションの-DBUILD_ON_LINUXを外せば構築できました。
動作することも確認しました。
0756デフォルトの名無しさん
NGNGいそがばまわれ。
0758デフォルトの名無しさん
NGNG0759デフォルトの名無しさん
NGNG#いくらカコ(・∀・)イイ!!HPでも、名前で(´・ω・`)ショボーン
0760デフォルトの名無しさん
NGNG0761ひげぽん
NGNG>HPの前に、そろそろ名前考えた方がよさげ。
前スレを読んでいただくと分かりますが
higepos(仮称)です。
確かに、そろそろ本気でいい名前を付けないといけませんね。
ということで、
higepos(仮称)の正式名称は何が良いかご意見をお聞かせください。
ちなみに過去に挙がっていた名前は、
・GATES FREE
・2chOS
・2chdows
・超ひげぽん
カコ(・∀・)イイ!!のをお願いします
0762名無しさん
NGNG0763ひげぽん
NGNG>今までで追加して便利だったのは簡易版printfの_sys_printfかな。
>debug時にすごい重宝します。
>でも16進表示機能が未実装なのが不満。
実装しました。
便利っす。
>>762
なんか強そうな名前・・・
0765ひげぽん
NGNGやっぱり強そう。
2chos(ニコス)なーんて案もあります。
今日はキーボードドライバーを書いてました。
なかなか難しいですね。
0766デフォルトの名無しさん
NGNGお相撲さん
0767デフォルトの名無しさん
NGNG0768デフォルトの名無しさん
NGNG0769ひげぽん
NGNGしゃれ系も良いですが、英語圏の人は面白さが分からないかも。
2004年バージョンは、OS mou 3 2004
ここまで来ると暗号です。
>>767
Gnuっぽいですね。かっちょいい。
でもなんだか、OSが安定していないイメージを受けますね。
0770ひげぽん
NGNG・2chOS
・2chdows
・超ひげぽん
・ゲイツクライシス
・ゲイツバスター
・2chos
・OS mou 3
・CHAOS
・explosion
皆さんの一押しはどれでしょう。
2chに関連する名前たちは捨てがたいですね。
0771デフォルトの名無しさん
NGNGyaccみたい
0772デフォルトの名無しさん
NGNGそれによって以下略
過去ログ読むの面倒以下略
0773超先生@OS板 ◆mz/OS/KoRM
NGNG0774ひげぽん
NGNG・多くの人に使ってもらえるOS
・フリーのOS
・日本発信のOS
・いい意味で過去の遺産を引き継がないOS
・使いやすくて、センスのあるインターフェースを持つOS
・内部の実装が出来るだけシンプルなOS
・もちろんマルチタスク
うわー、現段階ではほとんどさっぱり実現できていない。
大きな事ばかり言っていますが、あまり突っ込まないでください・・・
0775ひげぽん
NGNGお久しぶりです。
いつぞやアドバイスいただきありがとうございました。
>>OS/RealReality ・・・どうすれバインダ。
解説をお願いいたします
0776デフォルトの名無しさん
NGNGギコ猫のAAをフラッシュに使用。
∧ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
〜′ ̄ ̄( ゚Д゚)< 逝ってよし!
UU ̄ ̄ U U \_____________
・AssOS
アッソーのAAをフラッシュに使用。
| 。
|⌒ヾ
|冫、)
|` / ジー
| /
|/
|
・はシラネーヨ
∧ ∧ ┌─────────
( ´ー`) < はシラネーヨ
\ < └───/|────
\.\______//
\ /
∪∪ ̄∪∪
0777デフォルトの名無しさん
NGNG/ ̄ ̄ ̄ ̄\
/ ● ●、 _____
|Y Y \ /
| | | ▼ | < ぞぬっす
| \/ _人.| \_____
| ___ノ
\ ./
| | |
(__)_)
・DomOSumimasen
________
〈 ドウモスミマセン
∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄
(´Д`;)ヾ
∨)
((
・UmaibOS
うまい棒っす
0778デフォルトの名無しさん
NGNG0779デフォルトの名無しさん
NGNG0780デフォルトの名無しさん
NGNGその中でというのならCHAOS。
0781デフォルトの名無しさん
NGNGCHAOSで真っ先に浮かんだイメージは『無限の可能性を秘めてる』だった。漏れはね。
0782デフォルトの名無しさん
NGNGイイ━━━━━(゚∀゚)━━━━━!!!!
0783デフォルトの名無しさん
NGNG0784FreeDOS教徒
NGNGたぶん一度に読むセクタ数が問題かと‥‥
>>ひげぽ
ChaOSはすでにLEGO MINDSTORMS用OSとして存在してます。
>>783
なんて読むんですか?
0785デフォルトの名無しさん
NGNG0786ひげぽん
NGNG・2chOS
・2chdows
・超ひげぽん
・ゲイツクライシス
・ゲイツバスター
・2chos
・OS mou 3
・CHAOS --すでに使われている名前なので却下
・explosion
・GikOS
・AssOS
・はシラネーヨ
・Zonux
・DomOSumimasen
・Swodniw
・Whiskers
今のところ上記のものが候補に上がっています。
ただ、日本語表記のもは難しいかも。
ひげぽん的には、2chos,2chOS,GikOS,Zonux,Whiskersかな。
0787デフォルトの名無しさん
NGNG0788戸塚ヨット
NGNGGikoOSに一票
0789デフォルトの名無しさん
NGNG0790デフォルトの名無しさん
NGNG俺も〜〜〜。
0791デフォルトの名無しさん
NGNG0792デフォルトの名無しさん
NGNG糞OS
イイ━━━━━(゚∀゚)━━━━━!!!!
0793デフォルトの名無しさん
NGNGせめてkernelに相当する部分だけでも完成してから議論しる。
まだメモリ管理がやっとこできたかどうかで笑わせんな。(w
0794デフォルトの名無しさん
NGNGヤレヤレ
0795FreeDOS教徒
NGNGなんとなく複数形。もちろん起動画面は大量のギコで(w
0796ひげぽん
NGNGGikoに限定しないけど、起動画面に表示するなら
使える文字がかなり限られる。
0797デフォルトの名無しさん
NGNG最初から2バイト文字前提で作っちゃダメなんか?
0799デフォルトの名無しさん
NGNG0800デフォルトの名無しさん
NGNGなるほど、逆読みか。
0801デフォルトの名無しさん
NGNG0802デフォルトの名無しさん
NGNG0803デフォルトの名無しさん
NGNGそれをKernelレベルでやれと言っておる
0804デフォルトの名無しさん
NGNGOSはなんもしない方がいいと思うけどね。
0805デフォルトの名無しさん
NGNG0806デフォルトの名無しさん
NGNGHigex(・∀・)イイ!!
0807デフォルトの名無しさん
NGNGSPATRA〜スパトラ
0808ひげぽん
NGNGhigeposにおいて、国際化をどう扱うかは一切決めていません。
まだまだ先にやらなければいけないことが山ほどあるので・・・
という事で現時点では半角英数字記号しか出力できません。
国際化の資料といえばInterface12月号は、なかなか勉強になりました。
OSの名前ですが
・ひげは出来るだけ卒業 ex)higepos,higex
・商標問題がありそうなのは避ける ex)Giko,モナー
という方針でいくと何が残るんだろう・・・
0809ひげぽん
NGNG現在の最新のhigeboot.binをuploadしました。
自環境でmake出来ない場合にお使いいただけたらと思います。
0810デフォルトの名無しさん
NGNG0812デフォルトの名無しさん
NGNG今作っているの?
0815デフォルトの名無しさん
NGNGひげぼんさん
これは、どうやってインストールすればいいのかな?
0816ひげぽん
NGNG申し訳ありません。
>SPATRA〜スパトラ
Spicy
Portable
A?
Try
Revolution
Architecture
思いつきません。
0817ひげぽん
NGNGx86エミュレータbochsを使う場合、
higeboot.binをフロッピーイメージに指定すればよいです。
vmwareでもほぼ同様です。
フロッピーにインストールしたい場合
unix系
ddコマンドでhigeboot.binを書き込む。
Windows
rawrite.exeというアプリケーションでhigeboot.binをかきこむ。
書き込んだら、フロッピーを起動させたいマシンに挿入して
リブートでいけるはずです。
ただし何が起きても一切責任はもてませんのでご了承ください。
Portable思いつかなかったです。安易にいくとこんな感じに
Spicy
Portable
And
Try
Revolution
Architecture
0820名無しさん
NGNG0821デフォルトの名無しさん
NGNGいえ、スパトラは語感のみです。
アルファベットは1byte指定に合わせて適当に振りました。
意味の方は、レス欲しさに付けたおまけです。フルネームは
SPATRA Operating System
0823デフォルトの名無しさん
NGNGOperating system
Named
After
eXcitement
祭りにちなんで名づけられたマイクロカーネルOS
MONAX
0824LightCone ◆sSJBc30S5w
NGNG#809 のイメージから、
Win2000 の、cygwin で、dd if=higeboot.bin of=/dev/fd0
としてブートディスクを作ってみたところ、起動画面にはなりますが、
disk reading ... が表示されつづけたままになりました。
起動を試した機種は、ノート型の、FUJITSU FMV-5233 NA/X (BIBLO) です。
0825LightCone ◆sSJBc30S5w
NGNGhttp://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/higepos/higepos_v1.1/src/firstboot.asm?rev=1.2&content-type=text/vnd.viewcvs-markup
このソースを見て気付くのは、ss=cs に設定しているのに、
sp の初期化がされていないことです。
mov ax,cs
mov ss,ax ;自動的に直後の命令実行中はcli
mov sp,7c00h
としてみてください。
0826LightCone ◆sSJBc30S5w
NGNG#825 のソースで、mov ah,02h, int 13h で、cf=1 のときそのまま
繰り返していることに原因がありそうです。
PC/AT の BIOS では、int 13h で失敗した時は、必ず
mov ah,00h, int 13h を実行して、disk reset しなければ
なりません。そうしないと何度でも失敗します。
私も PC-98x1 から移行したとき、ここではまりました。
これで、この現象はfixされると思います。
0827デフォルトの名無しさん
NGNGどこかに doxygen の吐き出したドキュメントがあったりするのでしょうか?
0828デフォルトの名無しさん
NGNG0829デフォルトの名無しさん
NGNG0830デフォルトの名無しさん
NGNG0831デフォルトの名無しさん
NGNG0832デフォルトの名無しさん
NGNG詳しい起動法がわからない・・・
bochs.exe -> メインメニューで1を選択 -> higeboot.binで開く
じゃ違うのか?
0833デフォルトの名無しさん
NGNG> じゃ違うのか?
OSが分からんけど違う。higepos.binがあるディレクトリにbochsrc.txtを作成
した方が楽だと思う。bochsrc-sample.txtみたいなファイルがどこかにあれば
それを修正するのが吉。
0834ひげぽん
NGNG平日はなかなか忙しい・・・
>>823
MONAXいいかも。Monax・・・
ところでLinux,Monax みたいに最後にxつくと
unixクローンて誤解されるのかな?
>>LightConeさん
返事が遅くなりまして申し訳ありません。
バイナリを試していただいたようで
ありがとうございます。しかもBugおよび
修正箇所まで指摘していただいてありがとうございます。
週末にでも確認・修正して、反映させていただきます。
0835ひげぽん
NGNG>higepos は doxygen 準拠のソースっぽいですが、
>どこかに doxygen の吐き出したドキュメントがあったりするのでしょうか?
今はどこにおいていません。
もし、higeposをMake出来る環境があり、doxygenがインストールされていれば
Make時に生成されます。
ご希望であればどこかに置きますよ。
>とりあえずマイルストーン決めて、目標バージョン番号とコードネーム決めよう
今のところOS名が決まればいいかなと考えています。
マイルストーンを決めても気分次第でふらふらしそうですし(笑)
0836ひげぽん
NGNG>>833さんフォローありがとうございます。
.bochsrcの関係ありそうな部分抜粋
vgaromimage: ./VGABIOS-elpin-2.40
boot: a
floppya: 1_44=../../higepos_v1.1/bin/higeboot.bin, status=inserted
0837832
NGNGサンクスです。
早速試してみます
ちなみにOSはWinMeです。
0838デフォルトの名無しさん
NGNGPOSIXになんとなく準拠していく予定ってことにしとけば最後にXついててもいいんじゃない?
EXCITEMENT(騒動、騒ぎ)のXでそれ以上深く考えなくてもいいと思うけど。(笑)
祭りってのは若干意訳な気もするけど、まあ、いわゆる2chの「祭り」と考えれば意味はあってる。
0839832
NGNGって出るのはどう対処すればいいんでしょうか…
これが出たあとちょっとしてからBochsが終了します。
0840832
NGNG0841がんばれひげぽん
NGNGオペレーティングシステム<第二版> 設計と理論およびMINIXによる実装」
著:A.S.タネンバウム + A.S.ウッドハル
訳:千輝 順子
監修:今泉 貴史
プレンティスホール出版 ¥8,800
かって読んだんだけど・・・・・・
何を書いてあるのか全くわかりません。
こんなの読んでわかる人いるの?
というか、わかる人は今までどんな人生送ってきたのよ?
0842デフォルトの名無しさん
NGNG0843デフォルトの名無しさん
NGNG実際にコードいじるとなると全然次元が違うけど。
0844電波5号
NGNG全部よみました。
前スレは読んでいません。
僕はプログラミングは得意じゃないですが
Monaxに一票・・・とかだ投稿させて頂きます。
0845デフォルトの名無しさん
NGNGそれはOS関係では古典的かつ易しい部類の本だぞ
いわば基本
0847デフォルトの名無しさん
NGNG多分日本語が読めてない。
多分ちょn
0848デフォルトの名無しさん
NGNG0849デフォルトの名無しさん
NGNG0850デフォルトの名無しさん
NGNGエロゲ板へ(・∀・)カエレ!
0851ひげぽん
NGNG>かって読んだんだけど・・・・・・
>何を書いてあるのか全くわかりません。
>こんなの読んでわかる人いるの?
>というか、わかる人は今までどんな人生送ってきたのよ?
>>845
>それはOS関係では古典的かつ易しい部類の本だぞ
>いわば基本
まじめにレスします。
ひげぽんはかなり理解力がないので、1回目に軽く目を通したとき
5%位しか理解できませんでした。
その後読んでみた感想は、
1章オペレーティングシステム概論→まあ言っていることは分かるかな?
2章プロセス→プロセスの競合等の理論はなんとなく分かったが、実際実装してみないと分からないかな・・
3章入出力→つまみ食い程度・・・まだちゃんと読んでない。
4章メモリ管理→カーネル内メモリ管理の実装の前に熟読しました。でも理解したのは40%位かな。
5章ファイルシステム→面白かったです。iノードとか勉強になります。一番理解したかも・・
0853デフォルトの名無しさん
NGNGWoodchuck(ウッドチャック)っつー北米産のリスの学名が
Marmota monax だぞ!!!!
http://museum.nhm.uga.edu/gawildlife/mammals/rodentia/sciuridae/mmonax.jpg
早くもマスコットが決定w
オライリーの表紙に使ってもらえ。
0854ブー
NGNG私もOSを作ってみたいと思っていたのですが、その力がないのと、
なかなか行動に移せないでいました。
ですが、このひげぽんさんのスレをみて、私もOSを作成する決心がつきました。
私は、ひげぽんさんのずっと後ろのほうにいますが、早く追いつくように、
がんばって行きます。
先を行っているひげぽんさんに、質問させていただくときがあると思いますが、
そのときは、なにとぞよろしくお願いします。
0855デフォルトの名無しさん
NGNGひげぽん殿、
そういえばファイルシステムどーいう形式にすんの?
あと、プロセス管理とかは?マルチスレッド対応するんでつか?
プロセス管理わかんねならシングルタスクOSにするのもありかも。(w
0856ひげぽん ◆Ngzcp/NZpA
NGNGお互いプログラム版@2chで成長して行けると良いですね。
是非いろいろ情報交換させてください。
0857ひげぽん ◆Ngzcp/NZpA
NGNG>ひげぽん殿、
>そういえばファイルシステムどーいう形式にすんの
FDDの間は、FAT12にするのが有力ですが、勉強のため
ヘボファイルシステムを実装するかもしれません。
プロセス管理は、マルチタスクにするのが目標です。
分かるまで勉強するつもりです。
マルチスレッドに対応するかどうかは、まだ考えていません。
0858FreeDOS教徒
NGNGhttp://guriponn.tripod.co.jp/guri/2chos.lzh
日本語表示できなくても、起動時はこれで大丈夫?
0859デフォルトの名無しさん
NGNG0860デフォルトの名無しさん
NGNG0861デフォルトの名無しさん
NGNG0862デフォルトの名無しさん
NGNGあんたは、何か作ったのか?
その言葉は実際に作ってからいえ。
0863FreeDOS教徒
NGNGそう言われるとネタ準備してよかったなと思いまス。
>>860
実はたくさん手抜きしてます。まあ動いたからよかったな、と。
まともなAAに書き換えたりしたやつを上げときました。
0864ひげぽん
NGNGおもしろいっす。最高です。
こいつをhigeposで実現するのは難しいでせうか?
どういう技術を使っているのかいまいちピンときません。
0865デフォルトの名無しさん
NGNGダンプしてみたら"FF FD FD FF FF"ってな具合に出てきたから、
で、キーボードを押したらリセットすると、
逆アセンブラとか使ってみたらいいじゃん?>ひげぽん
0866デフォルトの名無しさん
NGNG0867デフォルトの名無しさん
NGNG0868超先生@OS板 ◆mz/OS/KoRM
NGNGttp://www.piece-me.com/
0869デフォルトの名無しさん
NGNGいや、それならWSの方が遙かに良いと思うんだが…
0870デフォルトの名無しさん
NGNGP/ECEはカーネルからなにから全部いじれる。
0871デフォルトの名無しさん
NGNGぜんぜん知らんかった…というより、モッテナイ。
0872デフォルトの名無しさん
NGNG0873デフォルトの名無しさん
NGNG[CPU ] exception(): 3rd exception with no resolution
になりました。FDCDriver.cppの変更後です。
# 昨日までは大丈夫だったんだけどなー
0874832
NGNGこれがひげぽすの起動画面になったら(・∀・)イイ!な・・・
0875デフォルトの名無しさん
NGNGいけないんじゃないかな。
0876デフォルトの名無しさん
NGNGhigeKenel.cppのvectorのテストの辺りじゃないかな。
0877デフォルトの名無しさん
NGNGこれって,
isShift_ = !(modifiers & KEY_MODIFIER_UP)
と同じじゃない?
0878ひげぽん
NGNG申し訳ありません。現在調査中です。
>>877
仰るとおりです。あとで直しときます。
ソースを公開するとバカコードが発見されて品質が上がります(涙)
ご指摘ありがとうございます。へこみますた。
0879デフォルトの名無しさん
NGNG> higeKenel.cppのvectorのテストの辺りじゃないかな。
Bochs上に "idt set done\n" が出力されないので、その前かもしれません。
よく分からんです。ちょっと調べてみます。
# 報告無かったら分からんかったと言うことでスマソ
0880デフォルトの名無しさん
NGNGテストの部分をコメントアウトしてみれば,すぐにわかります。
0881デフォルトの名無しさん
NGNGみなさん凄いです。
0882デフォルトの名無しさん
NGNG> テストの部分をコメントアウトしてみれば,すぐにわかります。
_sysUnlock();
をコメントアウトしたら
[CPU ] exception(): 3rd exception with no resolution
が無くなりました。当然動きませんが ;-)
0883PJメンバ
NGNGめのようです。
が、読み込む量を増やそうとしても今度は一定量以上読み込ませようとする
とそこで止まってしまう現象が起きるようです。
ということで差し戻しを行いました。お騒がせしました。
0884デフォルトの名無しさん
NGNG役に立つかどうかわかりませんが、Interface誌2001年7月号に、
FATの概要があります。
0885ひげぽん
NGNG情報ありがとうございます。バックナンバーあるかな・・・
>>883
ということでhigeposPJメンバーが改善に努めております。
今しばらくお待ちください。
悪いのはひげぽんの書いたfirstboot.asmです。
ご迷惑をおかけいたします。
0886ひげぽん
NGNG勉強せねば。
しかもあほなコード書くし・・・
バグよりも性質が悪い・・・
と、ぼやきでした。
0887デフォルトの名無しさん
NGNG自分が馬鹿だと気づいただけでも上出来です。
あなたには向上する余地が残っているということです。
安心めされい。
0888デフォルトの名無しさん
NGNG0889デフォルトの名無しさん
NGNG0890デフォルトの名無しさん
NGNG0892謎の探偵X
NGNG俺も勉強してみようかな・・・・
ひげぽんさん、ファイ�d!
0893デフォルトの名無しさん
NGNGIntelのPDF読んだ?
俺やっとフォーマット理解できたよ写し
0894ひげぽん
NGNGありがとうございます。
一緒に勉強しましょう(巻き添え)
>>893
>ひげぽーん
>IntelのPDF読んだ?
>俺やっとフォーマット理解できたよ写し
どの部分ですか。まだ1/4も読んでいないです。
ごめんなさい。
0895デフォルトの名無しさん
NGNG何のPDF?
0896デフォルトの名無しさん
NGNG0897デフォルトの名無しさん
NGNG0898デフォルトの名無しさん
NGNGIntelプロセッサーマニュアル
のことだよね?
0899デフォルトの名無しさん
NGNG開発環境はどんなもんですか?
Win+VisualCではなさげだけど・・・
0900デフォルトの名無しさん
NGNG過去ログ読め
0901ひげぽん
NGNG開発環境
Windows + gnu_tool@cygwin + nasm
または
Linux + gnu_tool + nasm
です。
0902デフォルトの名無しさん
NGNGwindwowsではwin用のnasmwを使ったほうがいいです。
nasmだと動きがチョット変じゃないですか?
0903デフォルトの名無しさん
NGNGそんなこと無いと思います
windowsね!
0904デフォルトの名無しさん
NGNG一度エミュレーションが走って過去のコンソールバッファが消えるとかじゃない?
0905ひげぽん
NGNG言葉足らずでした。Windows環境ではnasmwを使っています。
すいませんm(__)m
ちょっと仕事が忙しくてあまり進展していないhigeposですが
週末にはブートストラップ問題を片付けられればとおもいます。
新名称は Mona はどうでしょうか。
読み方は もなー または、 もな 。
0906デフォルトの名無しさん
NGNG個人的には『x』を付けると響きが良いなぁと思うけど、LinuxとかUnixとは違いますもんね。
MOna is Not unix. it is new operAting system かなり苦しいです。w
0907デフォルトの名無しさん
NGNGこんであかんのか?
gnuだってそんなもんだろ?
マスコットのリス、いいなぁと思いました。
0908デフォルトの名無しさん
NGNG…古!!
0909デフォルトの名無しさん
NGNG0910デフォルトの名無しさん
NGNG0911デフォルトの名無しさん
NGNG滅茶苦茶必死臭いな(藁
0913デフォルトの名無しさん
NGNG次世代のマイクロカーネルオペレーティングシステム。
0914デフォルトの名無しさん
NGNGリスの名前はmonaではなくmonax
0915デフォルトの名無しさん
NGNG0916デフォルトの名無しさん
NGNGHiGESTEPかMoNASTEPで
0917デフォルトの名無しさん
NGNG0918FreeDOS教徒
NGNG原因わかった。ディスク読み込みでブートコード破壊してた。
ブートコードをいったん上位のアドレスに移したらふつーに動いた。
・・・吊ってくるぽ(汗
0919ひげぽん
NGNGMONAPONって英語圏の人にはなじむ語感なのかな?
ぽんぽんぽん
>>913
いいっすね。でもちょっとまじめすぎ?
0920デフォルトの名無しさん
NGNG0921デフォルトの名無しさん
NGNGunixクローンと誤解されるのがいやなんじゃ?
0922ひげぽん
NGNG>原因わかった。ディスク読み込みでブートコード破壊してた。
>ートコードをいったん上位のアドレスに移したらふつーに動いた。
直します。詳細を是非教えてください。
>>920
>>921
>unixクローンと誤解されるのがいやなんじゃ?
POSIX準拠だと思われたらかなわない・・・という意図はあります。
0923デフォルトの名無しさん
NGNG0924デフォルトの名無しさん
NGNG0925デフォルトの名無しさん
NGNG現に>>1はそう申しておりますが
漏れも言うだけなら言えるぞ
0926FreeDOS教徒
NGNGstart:
xor ax,ax
mov ds,ax
mov si,0x7c00
mov ax,0x9e00
mov es,ax
xor di,di
mov cx,0x0200
rep movsb
jmp 0x9e00:next
next:
mov ds,ax
mov ax,0x8e00
mov ss,ax
mov sp,0xfffe
以下略(ぉ
まさか携帯でニーモニック打つとは思わなんだ。。
0927デフォルトの名無しさん
NGNGん?それをFDのブートセクトに書き込むと、起動するの?
0928FreeDOS教徒
NGNGこのままでも一応動くけど・・・
>>ひげぽん
これを適切な位置に置き換えて使ってぽ。
firstboot.asmが手元にないけど、ちょっと書き替えたら動くはず。
0929デフォルトの名無しさん
NGNGx86なんて糞ですよ(マジで)。
0930デフォルトの名無しさん
NGNGMIPSなんて糞ですよ(マジで)。
0931デフォルトの名無しさん
NGNGARMなんて糞ですよ(マジで)。
0932ひげぽん
NGNG携帯からの入力thanx!!
ところで
>原因わかった。ディスク読み込みでブートコード破壊してた
これは、
最初の512byteだけですか、それとも???
ブートコードを破壊してる場所が明確で、修正が簡単に可能ならば
そちらを修正しようと思っています。
>start:
>xor ax,ax
>mov ds,ax
>mov si,0x7c00
>mov ax,0x9e00
>mov es,ax
>xor di,di
>mov cx,0x0200
>rep movsb
0x7c00:0000→0x9e00:0000へ1024byte分コピー
0933ひげぽん
NGNG>next:
>mov ds,ax
>mov ax,0x8e00
>mov ss,ax
>mov sp,0xfffe
上位アドレス0x9e00:nextにて実行を続行???
ちょっと今日は、特に頭が回らない・・・
明日考えます。
0935FreeDOS教徒
NGNG54セクタ読もうとすると
0x1000+(0x200*0x36)=0x7c00
でブートコードを破壊するのは分かりますよね。
だからブートコードを上位の空きメモリに移してそこで実行を続けています。
こうすることで最大640KB程度のカーネルまで読み込めるはずです。
0936FreeDOS教徒
NGNG×0x7c00:0000
○0x07c0:0000(0x0000:7c00)
×1024バイト読み込み
○512バイト読み込み
0937929
NGNG0938デフォルトの名無しさん
NGNGまぁ、過去ログでも読めや
0939ひげぽん
NGNGひげぽんの遅い理解を以下にまとめて見ます。
間違い等ありましたら、突っ込みをお願いいたします。
512byteのブートコードは 0x07C0:0000(0000:0x7C00) に読み込まれます。
そのブートコード中では 0x0100:0000(0000:0x1000) をバッファの先頭として
後続のコードをFDより読み込みます。
ところが54セクタ読み込むと
読み込まれるサイズは 512byte * 54 = 0x6C00 となり
0x0100:0000(0000:0x1000) から読み込んだ場合
0x07C0:0000(0000:0x7C00) にあるブートコードを上書きしてしまいます。
これが問題となるのは
secondboot.bin + third.binのコードサイズが
54セクタ(512 * 54 = 27Kbyte)を超えたときです。
これを回避するためにFreeDOS教徒さんは
ブートコードが 0x07C0:0000(0000:0x7C00) が読み込まれて実行されている
途中でブートコードを
まるごと 0x9E00:0000(0000:0x9E000) へコピーしてそちらで実行を続けるという策を
とられています。
この方法を使えば理論上
(0x9E000 - 0x1000) = 628kbyte まで読み込むことが可能になります。
0940ひげぽん
NGNGいぜんhigeposのブートコードを書くときに
エイッと読んでいたのですが、すっかり忘れていました。
もう一度読み返しているところです。
0941デフォルトの名無しさん
NGNG0942FreeDOS教徒
NGNGそれで正解です。ただ実際に示したコードや移すアドレスは詰めが甘いので、適宜書き換えて使われてください。
0943デフォルトの名無しさん
NGNG>それで正解です。
ありがとうございます。
>ただ実際に示したコードや移すアドレスは詰めが甘いので、適宜書き換えて使われてください。
~~~~~~~~~~~~~~~
↑
この辺が重要なんでしょうね。
ちょっとうまくいっていないのですが、もう少しがんばってみます。
0944ひげぽん
NGNGブートコード問題多分解決しますた。
今現在higepos PJメンバーに動作確認してもらっています。
0945デフォルトの名無しさん
NGNG0946ひげぽん
NGNGありがとうございます。
原因は後ほど、報告いたします。
0947ひげぽん
NGNG■現象
最新版マルチセクタ読み込みfirstboot.asmで正しく
読み込まれているはずなのに、
int_trap_gate(): selector nullのエラーがでる。
■原因
idtrのアドレスがhigeIdt.hで0x6800に設定されていました。
これじゃあ上書きされてしまいます。
■対処
higeIdt.h:0x6800→0x0500(ここなら安全か??)
0948LightCone ◆sSJBc30S5w
NGNGひげぽんさん。お久しぶりです。
お忙しいならご返答は適当でいいのですが、DISK BIOSでセクタを
読むとき、複数回のBIOS呼び出しで、1セクタずつ読むより、
連続セクタを一回のBIOS呼び出しで読んだ方がやはり速いんでしょうか?
0949超先生@OS板 ◆mz/OS/KoRM
NGNG< `ー´>-~~~
PC/AT機のBIOSだと、readコール発行する毎に
シリンダをシークしてるような機械的挙動ですね。
1セクタ毎だと倍程度の読み込み時間がかかってしまう。
0950デフォルトの名無しさん
NGNG>■原因
>
>idtrのアドレスがhigeIdt.hで0x6800に設定されていました。
>これじゃあ上書きされてしまいます。
>
>■対処
>
>higeIdt.h:0x6800→0x0500(ここなら安全か??)
配列を使えば,そんなもんだいは解決します。
ソースはこんな感じで
idt_st idt[HANDLER_NUM];
for (int i=0;i < HANDLER_NUM; i++)
{
void* p = handlers[i].handler;
idt[i].offsetL = (int)(p) & 0xFFFF;
idt[i].offsetH = ((int)(p) >> 16 & 0xFFFF ;
idt[i].selector = 0x08;
idt[i].type = 0x8E;
idt[i].unused = IDT_UNUSED;
}
idtr.limit = sizeof(idt_st) * HANDLER_NUM -1;
idtr.highbase = (int)(&idt) >> 16 & 0xffff;
idtr.lowbase = (int)(&idt) & 0xffff;
0951ひげぽん
NGNGLightConeさんwrote
>お忙しいならご返答は適当でいいのですが、DISK BIOSでセクタを
>読むとき、複数回のBIOS呼び出しで、1セクタずつ読むより、
>連続セクタを一回のBIOS呼び出しで読んだ方がやはり速いんでしょうか?
超先生@OS板さん wrote
>PC/AT機のBIOSだと、readコール発行する毎に
>シリンダをシークしてるような機械的挙動ですね。
>1セクタ毎だと倍程度の読み込み時間がかかってしまう。
数値で具体的に示せないのが申し訳ないのですが
1セクタ毎だと60セクタ程度でもちょっと遅いと体感できます。
1秒にも満たない時間ですが・・・
0952ひげぽん
NGNGありがとうございます。
なるほどそんな方法があるのですね。
ちょっと良く考えてみます。
0953FreeDOS教徒
NGNG0954ひげぽん
NGNG次スレたてますた。
こちらへ移行をお願いします。
http://pc3.2ch.net/test/read.cgi/tech/1037096449/
0955LightCone ◆sSJBc30S5w
NGNGお忙しい所、返答有難うございます。
>数値で具体的に示せないのが申し訳ないのですが
>1セクタ毎だと60セクタ程度でもちょっと遅いと体感できます。
>1秒にも満たない時間ですが・・・
これは、60セクタ程度を、1セクタずつBIOSコールで読み込むのが、
トータル1秒未満で行える、ということですか。
間違っていたらすみません。
0957デフォルトの名無しさん
NGNG0958デフォルトの名無しさん
NGNGだめ?
0959デフォルトの名無しさん
NGNG協力しましょう。
0960デフォルトの名無しさん
NGNGいいと思うよ。
0961デフォルトの名無しさん
NGNG0962ひげぽん
NGNG0963デフォルトの名無しさん
NGNG0964sage
NGNG0965デフォルトの名無しさん
NGNG0966デフォルトの名無しさん
NGNG0967デフォルトの名無しさん
NGNG0968sage
NGNG0969デフォルトの名無しさん
NGNG0970みとこ ◆AEqcy/sQU6
NGNG0971超先生@OS板 ◆leaf/RYZgY
NGNG0972超先生@OS板 ◆leaf/RYZgY
NGNG0973ひげぽん
NGNG0974デフォルトの名無しさん
NGNG0975偽ひげぽん
NGNG0976うふぅ
NGNG0977うふぅ
NGNG0978うめ
NGNG0979ひげぽん
NGNG0980デフォルトの名無しさん
NGNG0981デフォルトの名無しさん
NGNGレス数が950を超えています。1000を超えると書き込みができなくなります。