Mercurial > hg > Papers > 2021 > anatofuz-master
changeset 41:e25a073180de
add file
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 01 Feb 2021 11:15:01 +0900 |
parents | 66b32f3ec7fa |
children | 8d779a8c8029 |
files | paper/chapter/02-cbc.tex paper/chapter/04-interface.tex paper/drawio/stackTest1.drawio paper/drawio/stackTest1.pdf paper/master_paper.pdf paper/src/xv6_syscall.cbc |
diffstat | 6 files changed, 51 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/chapter/02-cbc.tex Mon Feb 01 08:32:58 2021 +0900 +++ b/paper/chapter/02-cbc.tex Mon Feb 01 11:15:01 2021 +0900 @@ -1,4 +1,34 @@ \chapter{Continuation Based C} +Continuation Based C(CbC)とはC言語の下位言語であり、 関数呼び出しではなく継続を導入したプログラミング言語である。 +CbCでは通常の関数呼び出しの他に、 関数呼び出し時のスタックの操作を行わず、次のコードブロックに\texttt{jmp}命令で移動する継続が導入されている。 +この継続はSchemeのcall/ccなどの環境を持つ継続とは異なり、 スタックを持たず環境を保存しない継続である為に軽量である事から軽量継続と呼べる。 +またCbCではこの軽量継続を用いて\texttt{for}文などのループの代わりに再起呼び出しを行う。 +これは関数型プログラミングでのTail callスタイルでプログラミングすることに相当する。 +Agda よる関数型のCbCの記述も用意されている。 +実際のOSやアプリケーションを記述する場合には、GCC及びLLVM/clang上のCbC実装を用いる。 + +CbCでは関数の代わりにCodeGearという単位でプログラミングを行う。 +CodeGearは通常のCの関数宣言の返り値の型の代わりに\texttt{\_\_code}で宣言を行う。 +各CodeGearはDataGearと呼ばれるデータの単位で入力を受け取り、 その結果を別のDataGearに書き込む。 +入力のDataGearをInputDataGearと呼び、 出力のDataGearをOutputDataGearと呼ぶ。 +CodeGearがアクセスできるDataGearは、 InputDataGearとOutputDataGearに限定される。 -Continuation Based Cとは、 C言語から関数呼び出しとループ処理を取り除いた言語である。 -Cの下位言語と言え、 C言語とアセンブラの中間のような言語として利用することが出来る。 \ No newline at end of file +CbCを利用したシステムコールのディスパッチ部分をCode \ref{src:cbc_syscall_example}に示す。 +この例題では特定のシステムコールの場合、 CbCで実装された処理に\texttt{goto}文をつかって継続する。 +例題ではCodeGearへのアドレスが配列\texttt{cbccodes}に格納されている。 +引数として渡している\texttt{cbc\_ret}は、 システムコールの返り値の数値をレジスタに代入するCodeGearである。 +実際に\texttt{cbc\_ret}に継続が行われるのは、 \texttt{read}などのシステムコールの一連の処理の継続が終わったタイミングである。 + +\lstinputlisting[label=src:cbc_syscall_example, caption=CbCを利用したシステムコールのディスパッチ]{src/xv6_syscall.cbc} + + +CodeGearは関数呼び出し時のスタックを持たない為、一度あるCodeGearに遷移してしまうと元の処理に戻ってくることができない。 +しかしCodeGearを呼び出す直前のスタックは保存される。 +部分的にCbCを適用する場合はCodeGearを呼び出す\texttt{void}型などの関数を経由することで呼び出しが可能となる。 + +この他にCbCからCへ復帰する為のAPIとして、 環境付きgotoという機能がある。 +これは呼び出し元の関数を次のCodeGearの継続対象として設定するものである。 +これはGCCでは内部コードを生成を行う。 +LLVM/clangでは\texttt{setjmp}と\texttt{longjmp}を使い実装している。 +したがってプログラマから見ると、通常のCの関数呼び出しの返り値をCodeGearから取得する事が可能となる。 +
--- a/paper/chapter/04-interface.tex Mon Feb 01 08:32:58 2021 +0900 +++ b/paper/chapter/04-interface.tex Mon Feb 01 11:15:01 2021 +0900 @@ -84,15 +84,24 @@ \lstinputlisting[label=src:insertTest1, caption=別Interfaceからの書き出しを取得するCodeGearの例]{src/pop2test.cbc} 当初Perlスクリプトが生成した\texttt{pop2Test1}のstub CodeGearはソースコード\ref{src:pop2stub-origin}のものである。 +CodeGear間で処理されるデータの流れの概要図を図\ref{fig:stackTest1}に示す。 \lstinputlisting[label=src:pop2stub-origin, caption=生成されたStub]{src/pop2stub-origin.cbc} \texttt{\_\_code pop2Test}で遷移する先のCodeGearはStackInterfaceであり、 呼び出しているAPIは\texttt{pop2}である。 pop2はスタックから値を2つ取得するAPIである。 取得したAPIはGearsOSのInterfaceの処理ルールにより、 Context中のStack Interfaceのデータ格納場所に書き込まれる。 しかしソースコード\ref{src:pop2stub-origin}の例では\texttt{Gearef(context, StackTest)}でContext中の\texttt{StackTest} Interfaceのdataの置き場所から値を取得している。 これではpop2でせっかく取り出した値を取得できない。 + ここで必要となってくるのは、 呼び出し元のStack Interfaceからの値の取得である。 どのInterfaceから呼び出されているかは、 コンパイルタイムには確定できるのでPerlのトランスコンパイラでStub Codeを生成したい。 +\begin{figure}[htp] + \begin{center} + \includegraphics[width=130mm]{drawio/stackTest1.pdf} + \end{center} + \caption{stackTest1のstubの概要} + \label{fig:stackTest1} + \end{figure} 別Interfaceから値を取得するには別の出力があるCodeGearの継続で渡されたCodeGearをまず確定させる。 今回の例では\texttt{pop2Test1}が該当する。
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/drawio/stackTest1.drawio Mon Feb 01 11:15:01 2021 +0900 @@ -0,0 +1,1 @@ +<mxfile host="Electron" modified="2021-02-01T01:32:29.584Z" agent="5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/14.1.8 Chrome/87.0.4280.88 Electron/11.1.1 Safari/537.36" etag="YTomVDGOcZOXO6guQPNA" version="14.1.8" type="device"><diagram id="L6o57hW9iriXD6tJ89yx" name="ページ1">5Vtdk5MwFP01ndEHHUKAto/b3XV1RmfU6qw+RshClBImpNvWX29SQmkI21aXr9anTS5JSs453Hu5YUfwerG+YyiNPtAAxyPbCtYjeDOybeBOXfFHWja5xZU9aQgZCdSg0jAnv7EyWsq6JAHOtIGc0piTVDf6NEmwzzUbYoyu9GEPNNZ/NUUhNgxzH8Wm9Z4EPMqtE3tc2t9iEkbFLwNvml9ZoGKw2kkWoYCu9kzwdgSvGaU8by3W1ziW4BW45PPePHF1d2MMJ/yUCdHVnWWv+NfMef/JuXvz+cvcvX8FFD2PKF6qHau75ZsCAkaXSYDlKtYIzlYR4XieIl9eXQnShS3ii1j0gGhmnNFfO6igsDzQhCtewVj2SRxf05gyYUhoIuyzAGXR9gfkCua+1FYfMeN4vWdS+7zDdIE524ghxVWotqVE5xRqWpUUAk/Zoj36bEcZkZJNuFu7RFY0FLh/A7RzmUBbGtBu/zgbMGcc+b+eh3UVWRP7JrB0dSzHNVjaNVh6bUFpG1AGiKMzRHKn0t6ghLVQgnPEcto3lk070l5grPWUncLYdODvBUZYF9g7hdG7CBh7jzXj+rD9BWf8DPF0eg84k0uJ3U7v8WZ6MbHb7T3oADOnnOfpufUu4Zg9SLyqwIrdch09FJMwEW0fy0nCIDEh4qX9Sl1YkCCQ02cMZ+Q3+rFdStKSUpLw7a7c2ci9kWstOc0UE10RA52pRgxwXJMYWEMMbI0YM47NSwf8X5HzaqIXD1yrhpy6l9r2yDGjo8FDFqFUNv0lizczJqjD/LgbKn3WEyUFs4RgVBlikr4tFsjt1mu3oefE0p8T12TCqSGiRSbMuDo8JqwWmBhXCmo1z0THTJhh2Rd4SG90+S4KVOjwavL3cZceyoYG6jgI8Vx1KeMRDWmC4tvSOtMTpnLMe0pTheZPzPlGwSmB1mnEa8K/7bW/7xQvezdrtfK2syk6idjvt/3O3izZLadte8W8Z/Ca0SXz8SH0FC0csRDzQwPzcRLagzJhOEacPGLtNpon3TFIb4hEcJDCKhW6jo7rrhfq4LCoswzvmdLUjGViKZJm+Hj4Qlman749kLWk4t8iWBPZGwD6S0/d+2NdqAKtHUnYZqltxQSawwpUDWBv61HJBmaS4HYalSZ9RiXrZId2/ChPO7eTnY+IC0EkW4ttHTzNO+7DvBN92LRpH7adesUY2uwNUMotV/4oDaXKXA9oMnMnVkUp+Yqlbna39owDHLPe05OUrINS2qU34O/Sm3OR4HiQEnS8LiRYE557kuCRHPtcxDQZhpicSpXW7kBMtlnv2x24iA16sUxEfjDRCmXrRULZAsUvLyBBrMLt1NVeO04QzVoGwyi4uPzQqX4tNOk5QYTmG+xZRXV74GEdwrMK686k8q0LAPsSOzq+0PdT4yF85njlqtpNM9zBPBPDTjNOFnfjVbt/SzNsPWctwlm7YvKGIqZBv4GfLKVhVRGh+VnjwSQyLzHKT/U5SZbiBmlyERll5clqs+IouuV/DORPafl/F/D2Dw==</diagram></mxfile> \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/src/xv6_syscall.cbc Mon Feb 01 11:15:01 2021 +0900 @@ -0,0 +1,9 @@ +void syscall(void) +{ + int num; + int ret; + + if((num >= NELEM(syscalls)) && (num <= NELEM(cbccodes)) && cbccodes[num]) { + proc->cbc_arg.cbc_console_arg.num = num; + goto (cbccodes[num])(cbc_ret); + } \ No newline at end of file