なぜこれが必要なのかという質問は省略します。 これは、ロシア語をサポートする数少ないコンパクトなオープンソースオペレーティングシステムの1つであり、概念バージョンを超えています。
Hummingbird OS(CBS)の開発を開始するには何が必要ですか?
情報源は次のとおりです ( ここから始まります )。
- どの方向に進むべきかを知るフォーラム。
- Wikiは、残念ながらかなり断片化されていますが、必要な最小限の概要情報を提供します。
- Subversionリポジトリ(SVN)のプログラムのソース。
- ロシア語および英語SVNのシステム関数の参照:/kernel/trunk/docs/sysfunc*.txtまたはWiki
開発に使用するものとこれに必要なもの:
- システムを起動するための作業環境またはマシンを準備します。 ライブハードウェアで作業できます(ハードウェアサポートの問題がある可能性があります)。 個人的に、私はOSをVMware Playerで実行します。これは非営利的な使用は無料ですが、HummingbirdはQEMUとVirtualBoxの両方、およびBochsエミュレーターで動作します。
選択したSVNクライアントをインストールします。たとえば、コマンドラインにはSlikSVN 、視覚的RapidSVN 、 SubTile (Firefoxランタイムが必要です)、Windows Exporer TortoiseSVN拡張があります。
ネットワーク上でSVNを操作するための完全なチュートリアルを探しています。SlikSVNの典型的なコマンドの例を、正しいディレクトリに置いて説明します。
>
svn co svn://kolibrios.org/contrib/sdk sdk
実際のコピーを取得します。
>svn status --show-updates
サーバーと比較して変更されたファイルを表示します。
>svn up
サーバーからコピーを更新します。
>svn add *.c
制御下にあるすべての新しいCファイルを追加します。
>svn commit --username XXXX --password YYYY -m " "
-変更をサーバーにアップロードします(最初に、ステータスを分析することを忘れないでください)。
SVNからソースをダウンロードするためにパスワードは必要ありません。 SVNサーバーのWeb機能を使用してHummingbirdコードとアプリケーションを表示できますが、CP1251でエンコードされたロシア語のコメントは表示できません(CP866がサポートされています)。
- FASMアセンブラーとTinypadエディターには、インストールされたシステムが付属しています。これは、アセンブラーで記述されたシステムにとっては当然のことです。 エディターから直接、システム機能ガイド、ボードデバッグメッセージボードを開き、プログラムをブロードキャストして、独立して、またはMtdbgシステムデバッガーで実行できます。 サンプルプログラムもISOイメージにあります。SVN上のプログラムをSVNパスに沿って見ることができます:/ programs / demos。
- C--。 このシステムの2番目のネイティブ言語。多くのシステムユーティリティで記述されています。 Cに似ていますが、標準のCライブラリの代わりに直接システムコールを使用し、プロセッサレジスタを直接操作できるため、プログラムがよりコンパクトになります。 ここにあります、プログラムの例、非常に快適に書かれています-SVN:/ programs / cmm。 SVNライブラリ:/ programs / cmm / lib。 Windows用のハチドリとクロスコンパイラがあります。 それについては、 Punk_JokerのHabré に関する詳細な記事があります。
- クロスコンパイラC / C ++ GCC。 ホストはLinuxまたはWindowsです。 ここにある 、msys-kos32またはlinux-kos32およびSDKをCBS用の既製のCライブラリでダウンロードする必要があります。 GCC dllをWindowsで実行するために必要なものの一部は、マシン上にまだない場合は、 mingwページから個別にダウンロードする必要があります。 CBS用に変更されたnewlibライブラリを使用します。これは、SVNからダウンロードする必要があります:/ contrib / sdk / sources / newlib(その隣はlibstdc ++-v3です)。 SDKには、動的ロード用のビルド済みlibc.dllがあり、静的リンクの場合、ライブラリを自分でビルドする必要があります。
クロスコンパイルの唯一の不便は、結果のプログラムを毎回システムにコピーする必要があることです。 オプション-サーバーがネットワークカードで動作している場合はFTP経由、USBフラッシュドライブ経由、またはシステムのISOイメージを変更し(たとえば、Magic ISO Makerを使用)、再起動します。 このコンパイラには、 makefileを取得できるpascualleのHabr に関する記事があります。 近い将来(テスト中)、 ion2からのバージョンgcc 5.4ポートのリリース
- Windows用のネイティブおよびクロスコンパイラの形式のシンプルなTinyCコンパイラ(Linux用にビルドすることもできます)。 ここに例を含む完全なセットを用意してください。Hummingbirdのプログラムでコピーして、そこで使用するのが最も簡単です。 純粋なCのみがサポートされ、属性やアセンブラーの挿入など、一部のGCC言語拡張機能がサポートされます。
クロスコンパイル用のエディターとして使用するものは何ですか? あなた自身のビジネス、私はCodeBlocksに別のツールチェーンを登録しました。
コンパイルとデバッグ
Cにはソースコードデバッガーがないため、システムMtdbgを使用する必要があります。
便利なように、gccの.mapファイルとtccのデバッグファイルを使用してコンパイルできます。これは、tccの関数名と部分的にソース行の形式でデバッガーにヒントを提供します。
GCCでは、静的および動的リンクがサポートされています-したがって、2つのmakefileオプションがあります。 / libのシステムイメージを動的にリンクして、libc.dllとstdlibc ++。DLLを追加することを忘れないでください(これらはシステムのISOバージョンにすぐに存在します)。
デバッグ用のコンパイル行の例:
- gcc(静的libc)-文字列は複雑であるため、既製のメイクファイルを使用することをお勧めします
>
kos32-gcc -c -g -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32 -I $(SDK_DIR)/sources/newlib/libc/include -o hello hello.cpp
通常のコンパイル
>kos32-ld -static -nostdlib -T $(SDK_DIR)/sources/newlib/static.lds -Map=hello.map -L $(SDK_DIR)/lib -L /home/autobuild/tools/win32/mingw32/lib -o hello hello.o -lstdc++ -lsupc++ -lgcc_eh -lc -lapp -lgcc -lc
-Hummingbirdに必要なファイル形式とリンクし、デバッガー用の.mapファイルを作成します
>kos32-objdump -d -M intel -S hello.o > hello.asm
便宜上、ソースcppファイルの行でkos32-objdump -d -M intel -S hello.o > hello.asm
ファイルを作成します
>kos32-objcopy hello -O binary
、実行可能なハチドリを生成します
少し複雑ですが、最終的にはマップファイルからデータと関数の物理アドレスを調べ、アセンブラーとCコードの一致を確認できます。
- GCC(.dll形式のlibc)-静的アセンブリとの違いは、リンク行のみです。
>
kos32-ld -static -S -nostdlib -T $(SDK_DIR)/sources/newlib/app.lds --image-base 0 -Map=hello.map -L $(SDK_DIR)/lib -L /home/autobuild/tools/win32/mingw32/lib -o hello hello.o -lstdc++ -lsupc++ -lgcc_eh -lc.dll -lapp -lgcc -lc.dll
- Tinyc
>
tcc hello.c -o hello -lck -g
コンパイラはHummingbirds専用に変更されているため、ここではすべてが簡単です。
よりエキゾチックなオプションですが、あなたにとって便利なように見えるかもしれません:
- この記事で説明されている他のCコンパイラまたは言語を使用します 。
Cプログラムの例を検討する際、システムAPI呼び出しが異なるさまざまな歴史的エポックで開発されたシステム内の異なるバージョンのlibを使用するプログラムが異なることに特に注意してください。
- menuetOSの先祖である<menuet / os.h>から継承された古いmenuetlibcは、__ menuet関数プレフィックスによって区別され、DJGPPポートです。 GCCでよく使用されますが、廃止されたと考え、newlibc <kos32sys.h>を使用することをお勧めします。
- Tccには独自の簡略化されたlibckがありますが、API呼び出し<kos32sys1.h>はGCCと統合されています。 <kolibrisys.h>の古いtccバージョンはまだありますが、個人的にはテストしていません。
- MSVCの最小機能セット。 ファイル「kosSyst.h」、「KosFile.h」によって決定されます。 時代遅れ
- BCC「menuet.h」の最小関数セット
- WatcomC「kolibri.h」のかなり完全なライブラリ
- menuetOSの先祖である<menuet / os.h>から継承された古いmenuetlibcは、__ menuet関数プレフィックスによって区別され、DJGPPポートです。 GCCでよく使用されますが、廃止されたと考え、newlibc <kos32sys.h>を使用することをお勧めします。
- Oberonを使用します。 これは標準のPascalに似ており、優れているだけであり、構文はObject Pascal(Delphi)より簡単です。 言語の説明はわずか13ページです。 コンパイラとドキュメントはこちら 、使用例はfbreaderです。 ところで、この記事の準備中に、コンパイラの著者はすでにOberonの使用に関する記事を作成しています。 すぐに期待してください。
- PascalProポートもあります。FreePascal 、 TinyPy 、 Lua 、 Forth 、 Basicを使用してさまざまなレベルの準備ができています。 おそらく、これらのトピックは別の記事で取り上げられます。
アプリケーションプログラムの作成の詳細
コンソールアプリケーション開発:
システムは、システムAPIを介したコンソールアプリケーションをサポートしていません。これは奇妙なことに、グラフィカルインターフェイスを備えたシステムで十分です。 このようなアプリケーションは、console.objシステムライブラリとSVNのドキュメントを使用して作成できます。/programs/develops/librarys/console。 アセンブラでの使用例は同じ例にあります。
小さな余談-Hummingbirdsでは、.obj形式はリンカの通常のオブジェクトファイルではなく、特別な方法で作成されたエクスポートテーブルを備えた動的にロードされたCOFF形式ライブラリです。 各プログラムで、システムAPIを介してロードし、明示的にリンクする必要があります。 GCCは、PE形式の.dllのダウンロードもサポートしています。
GCCの場合、標準機能用のコンソールの使用はlibc Cライブラリに組み込まれています。
TinyCの場合、libckも使用できますが、コードサイズが小さくなったtiny_printf関数と、conio.hの形式のconsole.objの直接ラッパーもあります。
Hummingbird OSのニュアンスは、入出力ストリームとそのリダイレクトがないことです。これは、
cat a.txt > aaa.txt | more
cat a.txt > aaa.txt | more
失敗します。
コンソールプログラムと対話するには、4つの方法があります。
- shell.c関数を使用する
- IPC(プロセス間通信)にAPIを使用、SysFn 60
- 共有メモリ用のAPI、SysFn 68.22を使用
- クリップボードクリップボード、SysFn 54.1にAPIを使用
また、console.objを使用する場合、アプリケーションは同じ名前の2つのプロセスで構成されるため、心配する必要はありません。
グラフィックアプリケーション開発:
これは非常に広範なトピックであるとすぐに言わなければなりません。この記事では、Helloworldよりも少し複雑なレビューに加えて、他の場所を探すためのヒントを紹介します。
現在、システムコール、box_libウィジェットライブラリ、およびCのgui.hを使用して、グラフィカルアプリケーションを開発できます。 box_libバインディングもCで行われました。一部はGSoC 2016の一部として、2016年秋にGUIライブラリの拡張が計画されています。
ウィンドウGUIはカーネルに組み込まれているため、標準ウィンドウの準備は非常に簡単です。
SVN:/programs/develop/examples/example/trunk/rus/example.asm
; KolibriOS
;
;
; FASM'
; example.asm FASM (
; )
; F9 Tinypad'.
; ( BOARD)
;
; :
; eax.
; "int 0x40".
; , ,
; eflags, .
;
; :
; mov eax, 1 ; 1 -
; ; . DOCPACK - sysfuncr.txt
; mov ebx, 10 ; x=10
; mov ecx, 20 ; y=10
; mov edx, 0xFFFfff ;
; int 0x40 ;
;
; :
; mcall 1, 10, 20, 0xFFFfff
;---------------------------------------------------------------------
use32 ; 32-
org 0x0 ;
db 'MENUET01' ; 8- MenuetOS
dd 0x01 ; ( 1)
dd START ;
dd I_END ;
dd 0x1000 ;
dd 0x1000 ;
dd 0x0 ;
dd 0x0 ;
include "macros.inc" ; !
;---------------------------------------------------------------------
;--- ----------------------------------------------
;---------------------------------------------------------------------
START:
red: ;
call draw_window ;
;---------------------------------------------------------------------
;--- ----------------------------------------
;---------------------------------------------------------------------
still:
mcall 10 ; 10 -
cmp eax,1 ; ?
je red ; - red
cmp eax,2 ; ?
je key ; - key
cmp eax,3 ; ?
je button ; - button
jmp still ; -
;---------------------------------------------------------------------
key: ;
mcall 2 ; 2 - ( ah)
mov [Music+1], ah ;
; 55-55: ("PlayNote")
; esi -
; mov eax,55
; mov ebx,eax
; mov esi,Music
; int 0x40
; :
mcall 55, eax, , , Music
jmp still ;
;---------------------------------------------------------------------
button:
mcall 17 ; 17 -
cmp ah, 1 ; 1,
jne still ;
.exit:
mcall -1 ;
;---------------------------------------------------------------------
;--- ----------------------------------
;---------------------------------------------------------------------
draw_window:
mcall 12, 1 ; 12:
mcall 48, 3, sc,sizeof.system_colors
; : ()
;
; mov eax,0 ; 0:
; mov ebx,200*65536+300 ; [x ] *65536 + [x ]
; mov ecx,200*65536+150 ; [y ] *65536 + [y ]
; mov edx, [sc.work] ;
; or edx, 0x33000000 ; 3
; mov edi,header ;
; int 0x40
mov edx, [sc.work] ;
or edx, 0x33000000 ; 3
mcall 0, <200,300>, <200,150>, , ,title
;
mov ecx, [sc.work_text] ;
or ecx, 0x90000000 ;
mcall 4, <10, 20>, 0x90000000, message
mcall 12, 2 ; 12.2,
ret ;
;---------------------------------------------------------------------
;--- ----------------------------------------------
;---------------------------------------------------------------------
; "".
;
Music:
db 0x90, 0x30, 0
sc system_colors
message db ' ...',0
title db ' ',0
;---------------------------------------------------------------------
I_END: ;
box_libを使用したアセンブラーの例。
SVN:/programs/develop/libraries/box_lib/asm/trunk/ctrldemo.asmおよびeditbox_ex.asm
Cの例-。 SVN:/programs/cmm/examples/window.c
#define MEMSIZE 4096*10 #include "../lib/io.h" #include "../lib/gui.h" void main() { word id; dword file; io.dir.load(0,DIR_ONLYREAL); loop() switch(WaitEvent()) { case evButton: id=GetButtonID(); if (id==1) ExitProcess(); break; case evKey: GetKeys(); if (key_scancode == SCAN_CODE_ESC ) ExitProcess(); break; case evReDraw: draw_window(); break; } } void draw_window() { proc_info Form; int i; DefineAndDrawWindow(215,100,350,300,0x34,0xFFFFFF,"Window header"); GetProcessInfo(#Form, SelfInfo); for (i=0; i<io.dir.count; i++) { WriteText(5,i*8+3,0x80,0xFF00FF,io.dir.position(i)); } DrawCaptButton(100, 10, 100, 22, 22, 0xCCCccc, 0x000000, "Button"); WriteText(100,50,0x80,0,"Textline small"); WriteText(100,70,0x90,0,"Textline big"); DrawBar(100, 110, 100, 100, 0x66AF86); }
gcc / tccの例:
» SVN:/プログラム/開発/ライブラリ/ newlib_example /
» SVN:/プログラム/開発/ ktcc / trunk /サンプル/
»Cからbox_libを使用する例: SVN:/ contrib / C_Layer /例/
上記のコンパイル、GCCの場合、コンソールウィンドウを使用しない場合は、アプリケーションを
--subsystem windows
(または
--subsystem native
)キーにリンクする必要があります。
ライブラリのリストは、Wikiにあります。 これには、画像とフォント、OpenGL実装、システム全体のライブラリの操作が含まれます。