タグ

ブックマーク / blog.kmckk.com (28)

  • KMC Staff Blog:RustからRTOS APIを使う

    2021年06月14日 RustからRTOS APIを使う 最近Rustという新しいプログラミング言語が多くの分野で注目を浴びています。RustC++のような低レベルなコンパイル型言語であり高い効率で動作する一方、強力な型システムやメモリ安全性を保証するための仕組みを備えており、バグの少ないコードを書くことができます。記事では、TOPPERSカーネルや弊社のSOLID-OS上でRustで書かれたプログラムを動かし、カーネルAPIを使用する方法を紹介します。 ビルド環境を整える Rustコンパイラのインストールは簡単で、 https://rustup.rs/ からダウンロードしたインストーラを実行することでホームディレクトリにインストールできます。rustupはインストールされているコンパイラ、ドキュメント、および標準ライブラリのバージョンを管理するコマンドラインツールです。rustup

  • KMC Staff Blog:GCC10の最適化によるmemsetでの無限ループの発生

    2020年11月17日 GCC10の最適化によるmemsetでの無限ループの発生 以前、「GCCの最適化による予期せぬ無限ループの発生」という記事を書きました。この時は -fno-builtin-malloc や __asm __volatile("":::"memory"); などで対策できました。 しかし今回、現状最新の GCC 10 で、memset、しかもナイーブな *(char *)s++ = (char)c; みたいな実装ではなく、NetBSD の格的な実装のもので発生し、-fno-builtin や -fno-builtin-memset、-ffreestanding などでも抑制できず、-fno-tree-loop-distribute-patterns というあまり一般的ではないオプションが必要になりました。 これは一見 GCC のオプションが効いてない、バグのように思

    masterq
    masterq 2020/11/17
    -fno-tree-loop-distribute-patternsするとこの最適化を除去できるとのこと。このオプションは-O2に含まれる
  • KMC Staff Blog:GCCの最適化による予期せぬ無限ループの発生

    2019年09月13日 GCCの最適化による予期せぬ無限ループの発生 コンパクトな独自の libc を実装していて、GCC のテストを通したところ、WARNING: program timed out. が原因による FAIL が多発しました。調べた結果、非常に意外な結果だったのでメモします。 問題は、calloc の実装でした。以下のように、全く問題無さそうな簡単なコードです。 #include <stdlib.h> #include <string.h> void *calloc(size_t n, size_t size) { size_t bytes = n * size; void *p = malloc(bytes); if (p) { memset(p, 0, bytes); } return p; } これが、GCC 6.4.0 の arm-eabi で O2 でコンパイル

    masterq
    masterq 2019/09/14
    "この最適化を抑制するためには、-fno-builtin オプションしか無いようです" これは怖すぎる。。。
  • KMC Staff Blog:#include_nextの疑問メモ

    2014年09月18日 #include_nextの疑問メモ 前回の記事で、GNU CPP の独自拡張 #include_next 指令を紹介しました。 「GNU CPP(GCC)の独自拡張#include_next指令」 このドキュメントは簡単な概要と例だけなので、ちょっと複雑なケースになると、この挙動は仕様なのか?バグなのか?という判断が難しくなります。 この間、私が悩んだ疑問は、過去に以下の ML で取り上げられた疑問とほぼ同じものでした。 gcc-help ML: #include_next: wrong search order? この疑問を単純化して解説した後、私なりの解釈を説明します。 まず、GNU CPP は、#include や #include_next 指令を見つけると、gcc-include-dir(GCC 独自のインクルードファイルが含まれるディレクトリ)、sys

    masterq
    masterq 2016/09/26
    #include_next
  • KMC Staff Blog:GNU CPP(GCC)の独自拡張#include_next指令

    2014年09月11日 GNU CPP(GCC)の独自拡張#include_next指令 Warp の挙動を調べている時に、GCC のプリプロセッサの #include_next 指令の挙動にかなり悩んだので、備忘録も兼ねてドキュメントの日語訳をアップロードします。 厳密な仕様が無く、あまり有名でもない(?)独自拡張なので(ARM CC や IBM XL C/C++ など、一応 GCC 以外のコンパイラのプリプロセッサにも取り入れられているようですが)、情報が少なく、実際にいろいろ動かして実験してみないと挙動がよくわからず、かなり混乱しました。以下の翻訳もあまり自信が無いので、何かお気づきの点があれば、コメント欄にてご指摘いただけると幸いです。(ただし、現在スパムコメントがあまりにも多いため、半角英数字のみのコメント、国外の IP アドレスからのコメント、改行が 10 個以上あるコメント

    masterq
    masterq 2016/09/26
    #include_next
  • KMC Staff Blog:U-Bootのデバッグ

    2013年03月07日 U-Bootのデバッグ 先日のKMCセミナーでU-Bootの話をしました。その中から一部をピックアップして紹介します。 U-Bootのブートシーケンス まずは古典的でシンプルなブートシーケンスです。電源投入するとCPUはNORフラッシュ上のU-Bootを実行します。U-BootはDRAMなど必要なハードウェアの初期化を行った後に、なんらかの方法でLinuxカーネルをDRAM上にロードし、制御を移します。Linuxカーネルをロードする元としては、NORフラッシュや、NANDフラッシュ、SDカード、あるいはtftp等のプロトコルでネットワーク経由でロードしたりします。 U-Bootのデバッグを行うには、まずはこの方法で試すのがよいでしょう。KZM-A9-GTボードにはこれが可能なようにNORフラッシュメモリを搭載しています。 最近のブートシーケンスはもっと複雑になってい

  • KMC Staff Blog:QEMUでARM Ubuntuを動作させる

    2012年12月05日 QEMUでARM Ubuntuを動作させる Linaro が公開している ARM Ubuntu を QEMU で動作させる方法を解説します。 ホスト環境は、Windows7 64bit です。(基的には Linux 環境でも同じはずです。) ターゲット環境は、QEMU の ARM Versatile Express 評価ボードです。 QEMU は、以前解説した環境でビルドした、32bit Windows 版を使用しました。バージョンは 1.1.2 です。 ※ pragma で coroutine-win32.c の最適化をオフにしてビルドしました。現在 QEMU ON WINDOWS のサイトでは、MinGW gcc-4.7.2-1 を使用しているようなので、gcc をアップデートすれば、このハックは不要になるかもしれません。(未確認) ARM Ubuntu の構

  • KMC Staff Blog:QEMUのsemihostingサポート

    2012年10月12日 QEMUのsemihostingサポート QEMU は ARM semihosting をサポートしているので、QEMU の標準入出力に対して、QEMU 上で動作するターゲットプログラム (ARM) から直接 printf() や fgets() ができます。 (ちなみに、弊社の PARTNER デバッガソフトウェアと exeGCC は、同様のメカニズムを VLINK として提供しています。これは ARM プロセッサに限定されない、MIPS や SH でも使用可能な、汎用のしくみです。) 環境は、以前 Interface に記事を書いた時に作った VMWare の Ubuntu 11.10 64bit と、その時ビルドした QEMU 1.0 をそのまま使用しました。 以下のブログ記事を参考にしました。 QEMU ARM semihosting ツールチェインは、So

    masterq
    masterq 2012/10/12
    semihosting面白いですね
  • KMC Staff Blog:QEMU 1.1.0 で MIPS Debian GNU/Linux を動作させてみる

    2012年06月20日 QEMU 1.1.0 で MIPS Debian GNU/Linux を動作させてみる Android と言えば ARM ですが、最近は MIPS ベースの Android にも注目が集まっているようです。 (私はあまり詳しくないのですが。) そういえば、x86 と ARM 以外の Linux は動作させたことが無いなと思ったので、まずは QEMU 1.1.0 で MIPS Linux を動作させてみることにしました。 QEMU のビルドは、前回の記事の configure オプションに、mips-softmmu と mipsel-softmmu を追加する以外は同じです。(大してビルド時間は変わらないので、ARM もまとめて作っています。不具合回避のために、coroutine-win32.c だけ -O0 でコンパイルする必要があるのも同じです。) ./confi

  • KMC Staff Blog:Ubuntu 12.04LTS Beta2でMultiarchを試す

    2012年04月10日 Ubuntu 12.04LTS Beta2でMultiarchを試す Ubuntu 12.04LTSではMultiarchが拡充されていると聞いたので、12.04LTS Beta2をインストールしてarm-linux-gnueabihfのクロスビルドと実行を試してみました。 Rubyのクロスビルドとインストールを追記しました。 Ubuntu 12.04LTS正式版では変更がありました。以下も参照してください。 Ubuntu 12.04LTS 正式版でMultiarchを試す Multiarchについて ELC2012での以下のセッションを参照してください。 "Multiarch and Why You Should Care: Running, Installing and Crossbuilding With Multiple Architectures" Woo

    masterq
    masterq 2012/04/10
    すばらしいまとめ
  • KMC Staff Blog:AndroidのLooperとHandlerの実装

    2011年04月07日 AndroidのLooperとHandlerの実装 今回はAndroidのLooperとHandlerの話。 LooperはActivityのメインスレッドでも使われています。それはstacktraceを見るとわかります。(こちら) スレッド間のメッセージの受け渡しに使われています。こちらのページがわかりやすいです。 今回はこの実装を見ていきます。 JavaDocに載っているLooperとHandlerの使い方の例です。 class LooperThread extends Thread { public Handler mHandler; public void run() { Looper.prepare(); mHandler = new Handler() { public void handleMessage(Message msg) { // proce

  • KMC Staff Blog:AndroidのBinderによるプロセス間のメソッド呼び出し(メモ2:AIDL)

    2011年03月22日 AndroidのBinderによるプロセス間のメソッド呼び出し(メモ2:AIDL) 今回はAIDLとは何かを調べてみました。前回のことがわかっているとAIDLの理解は簡単です。 前回のまとめ 前回は frameworks/base/core/java/android/app/ActivityManagerNative.java をみてみましたが、他にも同様な構成のものがいつくかあります。 $ cd frameworks/base/core $ find . -name "*Native.java" ./java/android/content/ContentProviderNative.java ./java/android/os/ServiceManagerNative.java ./java/android/database/BulkCursorNative.j

    masterq
    masterq 2011/03/31
    すごい既視感が。。。
  • KMC Staff Blog:Androidのdebuggerd

    2011年02月08日 Androidのdebuggerd Androidのポーティング作業や、NDKでネイティブライブラリの開発をしている方は、ネイティブのプログラムの部分で不正なメモリアクセスなどで例外が発生したときに、logcatでのログに、その例外を起こしたプロセスのレジスタやスタックがダンプされるのを見ることがあると思います。 これは一体どのような仕組みでこのダンプがログに出ているのでしょうか? (English version of this page) ダンプの例 以前書いたページでSIGBUS(バスエラー)の例外が発生した時のログです。 I/DEBUG ( 543): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** I/DEBUG ( 543): Build fingerprint: 'gene

    masterq
    masterq 2011/02/08
    例外系シグナルがアプリで発生すると、debuggerdにtidを密告するlibcなんですね。
  • KMC Staff Blog:Androidのキー入力イベント処理のメモ

    2011年01月27日 Androidのキー入力イベント処理のメモ Androidでキー入力があったときに、それはどういう経路を伝わるのか? 電源キーを長押しするとシャットダウンのメニューが表示されるが、これはどこでやっている? このあたりのことを調べるためにソースコードを追いかけたときのメモです。Androidのフレームワークの中の話で、アプリケーションからは見えない部分です。 Android 2.2のソースを見ました。2.3では少し変わっているようです。 カーネルからキーインプットイベントを得るところ frameworks/base/libs/ui/EventHub.cpp システムコール inotify_add_watch を使って /dev/input以下をまとめて監視しています。 キー入力は /dev/input/event0 で タッチパネルは /dev/input/event

  • KMC Staff Blog:Androidのinit

    2010年12月09日 Androidのinit Androidで一番最初に起動するユーザープロセスであるinitについて調べたのでそのメモ。 (注:この記事はAndroid 2.2のソースコードに関するもの。) /init initはルートディレクトリの直下に置かれている。すなわち、/init 通常のLinuxではinitは /sbin/init Linuxカーネルはデフォルトの設定では最初のプロセスを /sbin/init /etc/init /bin/init /bin/sh の順に探しにいく。(kernelのinit/main.c init_post参照) このため、Androidを起動するときにはカーネルのブートパラメータに "init=/init" を追加して明示的にinitのパスを指定しなければならない。それを忘れると "No init found. Try passing

  • KMC Staff Blog:QEMU(MIPS)の、整数ローテート命令の謎実装

    2010年11月25日 QEMU(MIPS)の、整数ローテート命令の謎実装 QEMU(MIPS)の整数ローテート命令(ROR、DROR、DROR32、RORV、DRORV)の実装に、よくわからない点がありました。 以前も整数積和演算系命令に不具合があったわけですが、どうもQEMU(MIPS)は、VR5432から増えた命令周りがあまりテストされていないような印象です。 記事執筆時のQEMUのgitレポジトリのHEAD(2010-11-18 20:30:12)では、以下のように、MIPS32R2以外のCPUでは、RORやRORVなどを、SRLやSRLV(ローテートではなくシフト)として解釈するという謎の実装になっています。 なぜこのような実装になっているのでしょうか? ちょっと理由がわかりませんでした。 target-mips/translate.c static void decode_op

  • KMC Staff Blog:DWARF と有限状態機械 (3)

    2009年09月24日 DWARF と有限状態機械 (3) これまでの流れ - DWARF と有限状態機械 - DWARF と有限状態機械 (2) 概要、プログラムヘッダときて、今回のバイトコードで行番号プログラムの仕様は最後です。 行番号プログラムの目的は、1つのコンパイル単位中の行番号情報表を構築することです。つまり、プログラムを実行すると、表が出力として得られます。 この表は、命令アドレス、ファイル名、行、列、各種位置フラグ(ブレークポイント関係など)など、有限状態機械の状態と1列が対応するようなものです。つまり、行番号プログラムの実行過程における有限状態機械の状態遷移の記録=行番号情報表となります。 この表において、命令アドレスは増加する一方ですが、行番号はコンパイラの最適化などによる命令の並び替えによって減少する場合もあります。 行番号プログラムのバイトコードには、12種類のst

    masterq
    masterq 2010/09/03
    ちゃんと勉強しないと。。。
  • KMC Staff Blog:Non-stop multi-threaded debugging

    2009年10月02日 Non-stop multi-threaded debugging GDBの7.0からReverse Debugging(ヒストリの逆実行)が入るということで、一部で話題になっているようです。 http://www.gnu.org/software/gdb/news/reversible.html http://d.hatena.ne.jp/hayamiz/20090930/1254323169 (ネタ元は、私がtwitterに張ったURLのようです。すごいブックマークの数ですね。) ちなみに私は、greenteaさんの獲物で知ったのですが、同僚の佐藤さんやkobaさん、社長などは既に知っていました。 この機能は、GCC Summit 2007で発表されたようです。 http://ols.108.redhat.com/2007/GCC-Reprints/GCC200

    masterq
    masterq 2010/09/03
    スレッドライブラリのサポートが必要ですよね。。。
  • KMC Staff Blog:クロス開発でのQEMU まとめ(基礎編)

    2010年02月23日 クロス開発でのQEMU まとめ(基礎編) ここまでのQEMUの記事のリンク集です。 なお、CELFテクニカルジャンボリーにて、時間をいただきましたので、このあたりについて話をさせていただきます。 (3月5日 中野サンプラザ 入場無料) よろしければご参加ください。 まず使ってみる Debian/Ubuntu ならば apt-get install qemu で簡単にインストールすることができます。 それを使ってARMのDebianをネットインストールしてみるのがよいでしょう。 ARMのQEMUにDebianをnetinstallする QEMUをソースからビルドする アーカイブをダウンロードしてのビルド (LinuxでのビルドとWindowsのMSYS環境でのビルド) ARMのQEMUをソースからビルドして, その上でDebianを動かす gitで最新のソースを取得し

    masterq
    masterq 2010/09/03
  • KMC Staff Blog:QEMUにデバッガをつなぐ

    2010年03月03日 QEMUにデバッガをつなぐ 今回はQEMUにデバッガをつなぐ話をします。 QEMUそのものをgdbで追いかける QEMU上の仮想マシンにgdbをつなぐ QEMUそのものとその上の仮想マシンを同時に2つのgdbで追いかける QEMUそのものをgdbで追いかける インストールされたqemu-system-armはシンボル情報が削除されています。(stripped) $ file /usr/bin/qemu-system-arm /usr/bin/qemu-system-arm: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped なので、QEMUをソースからビルドして、arm-s