[ C++で開発 ] CPUクロックに基づく相対時刻の計測 CPUのクロックに基づき電源ONからの相対時刻を取得する方法を調査し記述します。最近のCPUは、クロックに従ってカウントアップするレジスタを保持しているので、このレジスタの値を読み出すことでCPUが起動してからのクロック数を取得することができます。例えば1GHzの動作周波数のCPUであれば、分解能は1ns(ナノ秒)となります。非常に高精度な分解能です。 2012-09-22 TSCの種類について追記 RDTSCP命令について追記 VisualC++のコンパイラ組み込み関数__rdtsc/__rdtscpについて追記 Intel x86系CPU RDTSC CPU命令を直接利用 Intel x86系のCPU(AMDのAthlon等も含む)では、CPUクロックごとに加算される64bitのタイムスタンプカウンタ(IA32_TIME_ST
gccとVC x86/x64環境で開発する上で, gccとVCはどちらも非常に優れたC/C++コンパイラです. ただLinuxとWindowsのどちらの環境でも動作するようなC/C++コードを書くためには, gccとVC, およびそれらが動作するOSの違いが問題になることがあります. ここではそれらの違いについてまとめていきたいと思います. なお説明を簡単にするためにマクロを多用していますが実際には可能なら別の手段をとるか, 名前がぶつからないような命名規則に則ったマクロ名をつけることをお薦めします. 対象 定義済みマクロ 有用なマクロ コンパイルオプション 演算子の代替表現の抑制 日本語のコメント 型 pragma attributeとdeclspec ファイル入出力 テキストとバイナリ 巨大なファイル static変数の初期化 snprintf 例外ハンドラ intrinsic関数
以前同僚の光成さんが、以下の warning オプションを使っていると書かれていたのが気になったので調べてみました。 -Wall -W -Wformat=2 -Wcast-qual -Wcast-align -Wwrite-strings -Wconversion -Wfloat-equal -Wpointer-arith もし上記以外にも良さげなオプションがありましたら教えてください<(_ _)> 情報源 man と info と http://sugarpot.sakura.ne.jp/yuno/?gcc%2Fwarning 。 最初は日本語版の man だけを見ていたのですが、id:kazuhooku に info を見るべしと教わりました。 man も info もそうですが、日本語版は情報が少なかったりするので注意。 LANG=C man gccなどとしましょう。 -Wforma
23:41 06/11/30 べくたー GreenPad - 新着ソフトレビュー だそうです。 ソフト作者からひとこと、という欄を書きました。 今時のエディタなら GreenPad でできてる程度の多言語混在はできるんじゃないかと思うので、 ポイントというほどポイントかなーとかちょっと思ってしまったりもしつつ。 ひとことに書いたように、あれは 「既存のエディタコンポーネントを一切使わずに『テキストエディタ』を作るのって、 どうやるんだろう?」 が自分的には全てですね。作ってて、エディタの作り方という よりは、"この機能のこの実装って実は死ぬほど重くない?だいじょぶ?でも あとはこれを定数倍のチューニングするしか思いつかないんだけど" と行き詰まったときは 大抵その実装で十分うまく回るのでどんどん作っちゃえばOK、ということを経験的に 学びました。特に車輪の再実装をしてる時は。今の自分ならな
ようこそ PC-UNIX上でのシステムプログラミングや、ハードウェアとの対話を楽しむページです。 テーマは「理解 (understanding)」。 西 田 亙 (NISHIDA Wataru) 主な著作 GCCプログラミング工房 (UNIX USER 連載) Linuxから目覚めるぼくらのゲームボーイ (ソフトバンクパブリッシング) Interface 2002年7月号特集 Linux 徹底詳解 -- ブート&ルートファイルシステム Linuxシステム縮小計画 (Embedded UNIX 連載) GNU開発ツール (Oversea Publishing) -- Computer Architecture Series の第一作 Linux/GNU開発環境入門? (Web 連載) -- 近日公開予定 関連リンク http://memo.wnishida.com/ -- Wataru
LilyVMのコード読んでいるとき、asmlinkageのマクロが出てきたが定義がされていない。Linuxカーネルなどにも使用されているので調べてみた。 asmlinkageマクロとは Linuxカーネルなどによく見かけるマクロの一つとして、asmlinkageマクロがある。このマクロは関数の整数引数を確実に、スタックに渡すことを保証するマクロである。Linuxではシステムコールなどに使われる。システムコールの引数の渡しかたは次の様になる。 システムコールの引数を各レジスタに代入 ソフトウェア割り込み(int0x80)を行う。 カーネル権限に移行後、レジスタから各引数を取り出す。 システムコールの引数は、スタックから各レジスタに代入を行う実装なので、asmlinkageマクロを使用する。 GCC拡張 regparm (number) asmlinkageのコードは以下の様になっている。 #
main() の前に関数を呼ぶ C/C++ のプログラムで、main() の前に関数を暗黙的に呼びたいときがあります。ここでは GCC の拡張を使った方法と、C++ のコンストラクタを使った方法を紹介したいと思います。 GCC では main() の前に呼ばれる関数を __attribute__((constructor)) という拡張機能を使って定義できます。たとえば、次のプログラムでは main() の前に foo() が呼び出されます。 #include <stdio.h> __attribute__((constructor)) void foo() { printf("hello, before main\n"); } int main (int argc, char **argv) { printf("hello, world\n"); return 0; } 実行結果は以下の
Binary 2.0カンファレンス2006 に動画とIRCで参加してきました。 http://0xcc.net/blog/archives/000149.html 動画をキャプチャしながら見ていたので、IRCとのタイムラグが結構ありました。 技術的にはブログなどで既知のものが多かったんですが、PS3 LinuxでのプレゼンにWiiリモコン使うなど、ネタとしては面白かったです。 最初の質問で「gccの__attribute__はなぜ括弧が二重になっているのか?」というのがあって、そのときには思いつかなかったのですが、休憩中にひらめいてIRCにちょっと書き込みました。 19:32 >hamigaki< 多分、gcc以外でマクロで代用するためですよ>括弧 19:32 >hamigaki< 二重でないと、コンマがかけない これだけだと、分からない人もいたと思うのでちょっと解説しておきます。 そもそ
One of the best (but little known) features of GNU C is the __attribute__ mechanism, which allows a developer to attach characteristics to function declarations to allow the compiler to perform more error checking. It was designed in a way to be compatible with non-GNU implementations, and we've been using this for years in highly portable code with very good results. Note that __attribute__ spell
背景 最近、前職の友達や後輩、またその後輩の会社の方々などで「Linuxカーネル勉強会」なるものをはじめました。勉強会といっても読書会に近く、「Linuxカーネル解読室」という本を使っての勉強会で、この前早速第1回があり、第1章の「プロセススケジューリング」について行いました。 みんなで議論などをして、書かれてることは大体理解できましたが、やはり前提知識がたくさん必要などの理由から不明な所が何点かあったので、その一つについて調べてみました。 (以降の説明はlinux kernel 2.6.15(x86)を元にしています。) わからなかった事 そのわからなかった事について説明します。 以下は、Linuxカーネルが行うコンテキススイッチの部分の核となるswitch_to というマクロです。 include/asm-i386/system.h #define switch_to(prev,n
gcc を使う人は info gcc をくまなく読むべきだと言われたらそれでおしまいなのですが、info gcc の中で「Declaring Attributes of Functions」が面白かったので紹介します。 実は Mona のカーネル内で GDT(Global Descriptor Table) 関連のコードが最適化オプション -O2 では動くけど -O3では動かないという現象に出くわしました。 /* TSS. Mona has only one TSS */ setSegDesc(&g_gdt[4], (dword)g_tss, 0x00000067, SEGMENT_PRESENT | SEGMENT_DPL0 | 0x00 | 0x09);のように TSS を設定したあとに /* prepare dpl0 stack */ memset(g_tss, 0, sizeof(
gcc4.1の__attribute__のメモ。 関数属性 † __attribute__((alias("name"))) 関数を他の関数のエイリアスにする。 void foo() __attribute__((alias("bar"))); __attribute__((always_inline)) 最適化がオフのときでも、関数をインライン展開する。 __attribute__((flatten)) 関数のサイズやインライン化パラメータを無視して、常にインライン展開する。 __attribute__((cdecl)) 386専用。 __attribute__((const)) 関数に副作用がなく、戻り値が引数のみに依存すると仮定する。 __attribute__((constructor)) 関数がmainに入る前に自動的に呼ばれるようにする。 __attribute__((dest
Written by Yashiro Takeshi <yashiromann@nifty.com> 2004/1/14 IA-32(x86)上のgccでの関数呼び出し規約について、まとまっている文書がgoogleで検索してもなかなか見つからず苦労したので、他のものと一緒についでにまとめておくことにします。私もよく分かっていないので、何か間違いがありましたら(掲示板でもメールでも)教えてください。 確認の際、抜けがないようにここにも書いておくと、関数呼び出し規約とは、 関数呼び出しの前後で保存されなければならないレジスタ 引数渡しの方法 (ex. レジスタ渡し・スタック渡し・共有メモリ渡し) 引数渡しの順序 関数呼び出し前後でのスタックポインタの保存方法 返り値の戻し方 の全てをあわせたものであって、どれか一つでも曖昧にしてミスしてしまうと思わぬところでエラーが発生してしまいます。(私の
Sandeep.Sv0.1, 01 March 2003. この HOWTO では、GCC により提供されるインラインアセンブリの機能の目的と、その使用法について説明します。前提とされる知識は、x86 アセンブリと C 言語の 2 つだけです。 1. イントロダクション. 1.1 著作権およびライセンス. 1.2 フィードバックと訂正. 1.3 謝辞. 2. 全体の概要. 3. GCC アセンブリ構文. 4. 基本的なインライン構文. 5. 拡張アセンブリ構文. 5.1 アセンブリテンプレート. 5.2 オペランド. 5.3 破壊されるレジスタのリスト. 5.4 Volatile ...? 6. オペランド制約の詳細. 6.1 よく使われる制約. 6.2 制約修飾子. 7. 有用なレシピ集. 8. 最後に. 9. 参考文献. 1. イントロダクション. 1.1 著作権およびライセンス. C
小ネタ2。 GCCで複数行からなるインラインアセンブラを書くとき、 __asm__ ("movl %0,r9\n\t" "movl %1,r10\n\t" "call _foo" :: "g" (from), "g" (to) : "r9", "r10");のように \n\t 区切りで書くひとと、\n\t のかわりにセミコロン区切りで書く*1ひとがいます。GCCのマニュアル上は、どちらでもOKよん、ということになってるんですが、世間では \n\t 派が多いです。...で、 ; の方が読みやすいだろうに、なぜ世間では\n\t派が多いのか、ちょっと前まで疑問でした。というわけで、\n\tの利点説明です。 gccコマンドが.cを食って一時ファイル(/tmp/ランダム文字列.s)を生成するとき、前者(\n\t)の書き方だと.sは ラベル: #APP movl %0,r9 movl %1,r10 c
○GCC x86インラインアセンブラ asm ("命令 source,dest"); ■グローバル変数 --------------------------------------------------------- そのまま使えます #include <stdio.h> int i; int j; main(){ i=10; asm ("movl i,%eax"); asm ("add $10,%eax"); //数値は先頭に$マークを付ける asm ("movl %eax,j"); printf("%d %d\n",i,j); } ▼上のプログラムの書き方を変えたもの #include <stdio.h> int i; int j; main(){ i=10; asm ( "movl i,%eax \n\t" "add $10,%eax \n\t" "movl %eax,j"
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く