コグノスケ


link 未来から過去へ表示  link 過去から未来へ表示(*)

link もっと前
2019年5月9日 >>> 2019年6月5日
link もっと後

2019年5月9日

ROCKPro64とPCI Express - 解決編

目次: ROCK64/ROCKPro64

ROCKPro64のPCIeが動かなくて、しばらく放置(2019年3月16日の日記参照)していたのですが、今日久しぶりに見てみたところ、意外とあっさり直せました。

PCIeが動かなかった理由は単純で、PERST# 信号を全く制御しておらず、PCIeカードのリセットを解除していなかったためでした。それは動かないわ。

不思議なことにlinux-nextではROCKPro64以外のRK3399搭載ボードはPCIeが使えるように対応が入っているのに、ROCKPro64だけハブられています。悲しいので、作ったパッチをLKMLにぶん投げておきました。誰かの役に立てば嬉しいですね。

ちなみにROCKPro64のPCIe PERST# 信号は、こんな経路で来ていました。
RK3399 GPIO2_D4 -> PCIE_PERST_L -> PCIE_PERST_3V3_L -> PERST#

実験

我が家にはPCIeのカードが3つあります。あります、というか、わざわざROCKPro64のPCIe接続テストのために買ったという方が正しいです。

  • USB 3.0増設カード
  • SATA増設カード
  • PCIe - PCIブリッジカード

リセットを制御していない場合、基本的にはどのボードも動きません。しかしUSB拡張カードだけはたまに動きます。不思議な挙動です。カードがPERST# を無視しているのか、偶然か、深追いしていないのでわかりません。

PERST# の制御をするように直したところ、USB 3.0カードと、SATAカードはバッチリ認識するようになりました。PCIe - PCIブリッジカードは起動中になぜかROCKPro64にリセットが掛かってしまい、うまくいきませんでした。

ROCKPro64からの給電では足りないのかと疑って、外部からブリッジカードに電源を供給してみましたが、ダメでした。PCでも使えたり使えなかったりする、割と特殊なカードらしいので、ROCKPro64では動かないのかもしれません。

さらに調べるにせよ、何にせよ、また次の機会ですね。

メモ: 技術系の話はFacebookから転記しておくことにした。多少修正。

編集者:すずき(2022/05/26 02:21)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2019年5月13日

GCCを調べる - その1 - ビルド

目次: GCC

最近GCCのコードを書き換えたり、デバッガで追ったり、GCCとお友達になろうとしています。まだ仲良くなれていませんが、入り口に立つまでが色々大変だったのと、間違いなく数カ月後に手順を忘れるので、方法を書き残しておこうと思います。

GCCのコードを書き換えて、結果を反映させるには、何らかの方法でGCCをビルドする必要があります。クロスビルド用ツールチェーンの構築は、昔の日記(2019年4月28日の日記参照)に書いたとおりです。コンパイラを追うだけで、ルートファイルシステムが必要なければ、おそらくcrosstool-NGを使うのが無難です。差分ビルドがうまく行かないので、何か変更した後に再ビルドするのがちょっと面倒ですが、それ以外は簡単で便利です。

私は再ビルドが遅くてイライラしたのと、ビルドの仕組みにも興味があったので、以前の日記(2019年4月29日の日記参照)に書いたとおり、昔作ったクロスコンパイラをビルドするMakefile(GitHubへのリンク)を改造して使っています。ブランチはorigin/develop/separate-makefileです。もうこちらを本線にしても良い気がしてきたな。

オレオレGCCビルド環境

これも使い方を忘れるのでメモしておきます。手動でビルドするのとあまり変わりません。

オレオレGCCビルド環境、ソースコード取得
#### ビルド用ディレクトリ

$ mkdir build_my_toolchain
$ cd build_my_toolchain


#### 環境構築用のリポジトリ

$ git clone https://github.com/katsuster/crosstool-builder
$ cd crosstool-builder
$ git checkout -t origin/develop/separate-makefile
$ cd ../


#### GCCだけリポジトリで取得する(git diffしたいから)

$ git clone https://gcc.gnu.org/git/gcc.git


## GCC-8.3.0を使う、他のバージョンでもある程度ビルドできるはず

$ cd gcc
$ git checkout gcc-8_3_0-release
$ cd ../


#### その他の依存モジュールはtarballを使用する

$ mkdir tmp
$ cd tmp
$ wget https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.19.1.tar.xz
$ wget https://ftp.gnu.org/gnu/binutils/binutils-2.31.1.tar.bz2
$ wget https://ftp.gnu.org/gnu/glibc/glibc-2.28.tar.xz

$ wget https://ftp.gnu.org/gnu/gmp/gmp-6.1.2.tar.lz
$ wget https://ftp.gnu.org/gnu/mpc/mpc-1.1.0.tar.gz
$ wget https://ftp.gnu.org/gnu/mpfr/mpfr-4.0.2.tar.xz
$ cd ../


#### ツールチェーンに必要なモジュール

$ tar xf tmp/linux-4.19.1.tar.xz
$ tar xf tmp/binutils-2.31.1.tar.bz2
$ tar xf tmp/glibc-2.28.tar.xz

$ ln -s linux-4.19.1    linux
$ ln -s binutils-2.31.1 binutils
$ ln -s glibc-2.28      glibc


#### GCCに必要なモジュール

$ tar xf tmp/gmp-6.1.2.tar.lz
$ tar xf tmp/mpc-1.1.0.tar.gz
$ tar xf tmp/mpfr-4.0.2.tar.xz

$ cd gcc
$ ln -s ../gmp-6.1.2  gmp
$ ln -s ../mpc-1.1.0  mpc
$ ln -s ../mpfr-4.0.2 mpfr
$ cd ../

自分で書いていて面倒くさいなあと思いました。スクリプトにしたほうが良かったかもしれない。もしbinutilsも変更したりデバッグしたければ、tarballの代わりにリポジトリをチェックアウトしてくると良いです。

オレオレGCCビルド環境、ビルド
$ source crosstool-builder/env.sh

$ cd crosstool-builder

$ make -j4 install

デフォルトではRISC-V 64bit Linux向けのクロスコンパイラをビルドします。env.shを書き換えればAArch64やARM向けもビルド可能です。RISC-V 32bit向けはgcc-static(ベアメタル用コンパイラとして使用可能)までしかビルドできません。以降はglibcのビルドでエラーになりLinux用のクロスコンパイラはビルドできません。

オレオレGCCビルド環境、部分ビルド
$ cd crosstool-builder

$ make -f gcc-static.mk -j4 install

GCCに何か修正を入れてビルドし直すときは、ビルドし直したい *.mkファイルを指定してmake します。

編集者:すずき(2023/09/24 11:46)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2019年5月15日

ARM SBCリスト

目次: ROCK64/ROCKPro64

最近はたくさんのARMのシングルボードコンピュータ(SBC)が市販されています。嬉しい時代になりました。これからのお買い物の参考としてリストアップしました。値段は変動するので参考です。

NVIDIA Parker
ボードJetson TX2、Denver/2GHz x 2、A57/2GHz x 4、8GB LPDDR4、16nm、$600
NVIDIA Tegra X1
ボードJetson TX1、A57/1.9GHz x 4、4GB LPDDR4、20nm、$500
HiSilicon Kirin 970
ボードHiKey 970、A73/2.36GHz x 4、A53/1.8GHz x 4、6GB LPDDR4-1866、10nm、$299
HiSilicon Kirin 960
ボードHiKey 960、A72 x 4、A53 x 4、3GB LPDDR4、16nm FinFET、$239
MediaTek Helio X20
ボードMediaTek X20、A72/2.1GHz x 2、A53/1.95GHz x 4、A53/1.4GHz x 4、2GB LPDDR3、$199
Rockchip RK3399
ボードNanoPC-T4、A72/2GHz x 2、A53/1.5GHz x 4、4GB LPDDR3-1866、$109
Samsung S5P6818
ボードNanoPC-T3 Plus、A53/1.4GHz x 8、2GB DDR3、$75
Amlogic S912
ボードが見当たらない、A53 x 8、
AllWinner H6
ボードPINE H64、A53 x 4、2GB LPDDR3-1600、$36

少し古い世代のSoCを採用したボード達です。

Amlogic S905
ボードODROID C2、A53/1.5GHz x 4、2GB DDR3、$39
Rockchip RK3328
ボードROCK64、A53/1.4GHz x 4、4GB LPDDR3-1866、$24.95 (1GB) $34.95 (2GB) $44.95 (4GB)
AllWinner H5
ボードNanoPi NEO2、A53/1.5GHz x 4、1GB DDR3、$20
Broadcom BCM2837B
ボードRaspberry Pi 3 Model B、A53/1.2GHz x 4、1GB LPDDR2、28nm、$35

以前(2018年8月12日の日記参照)載せた情報も含んでいます。

編集者:すずき(2023/09/24 12:55)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2019年5月17日

GCCを調べる - その2 - デバッグ環境

目次: GCC

GCCをデバッグする入り口まで辿り着くのも案外大変だったので、方法を書き残しておこうと思います。

GCCはコンパイラ?

C言語(じゃなくても良いですが)をコンパイルする際に、gcc a.cのようにコマンドを起動します。一般的にgccコマンドをコンパイラと呼びますが、正確にいえばgccはコンパイラドライバ(コンパイラ、アセンブラ、リンカを順に呼び出すプログラム)です。

GCCの場合、コンパイラはcc1という名前で、コンパイラドライバgccとは別のプログラムとして存在します。コンパイラの役目は高級言語(Cなら *.cファイル)からアセンブリ言語(*.sファイル)に変換することです。

DebianのGCC 8.0だと /usr/lib/gcc/x86_64-linux-gnu/8/cc1に置かれています。クロスコンパイラの場合は様々ですが、crostool-NGでRISC-V 64bit Linux向けにビルドした場合(ビルド方法は 2019年2月26日の日記参照)は、~/x-tools/riscv64-unknown-linux-gnu/libexec/gcc/riscv64-unknown-linux-gnu/8.2.0/cc1に置かれます。ローカルビルドしないときは、~/x-toolsをクロスコンパイラをインストールしたディレクトリで読み替えてください。

コンパイラだけ起動したい

デバッガでコンパイラを追うとき、コンパイラドライバ → コンパイラだと余計な処理がたくさん挟まって邪魔なので、コンパイラ単体で起動したくなりますよね?私はなりました。特に気にならない人は読み飛ばしてください。

コンパイラcc1のオプションは、コンパイラドライバgccに渡したオプション以外にも、cc1用のオプションが渡されます。そのためcc1をシェルなどから手打ちで起動するのはちょっと難しいです。

しかし無理してコンパイラcc1のオプションを調べずとも、コンパイラドライバgccが渡すオプションをそのままパクれば良いです。gcc/gcc.cのexecute() 関数を下記のように書き換えると、cc1の起動オプションが表示されます。

コンパイラドライバgccがコンパイラcc1に渡す引数を表示

diff --git a/gcc/gcc.c b/gcc/gcc.c
index a716f708259..e48e5cca79b 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -3084,6 +3084,12 @@ execute (void)
       const char *errmsg;
       int err;
       const char *string = commands[i].argv[0];
+      int kkk;
+
+      printf("\n------------------------------\n");
+      for (kkk = 0; commands[i].argv[kkk]; kkk++)
+            printf("%s ", commands[i].argv[kkk]);
+      printf("\n------------------------------\n");
 
       errmsg = pex_run (pex,
 			((i + 1 == n_commands ? PEX_LAST : 0)

出力は下記のようになります。この例では、コンパイラはRISC-V 32bitベアメタル向けを使っています。

コンパイラのオプション例
------------------------------
/home/katsuhiro/share/projects/oss/crosstool-builder-new/buildroot/libexec/gcc/riscv32-unknown-elf/8.3.0/cc1 -quiet a.c -quiet -dumpbase a.c -march=rv32gc -mabi=ilp32d -auxbase a -o /tmp/ccdd2F4Z.s
------------------------------

この情報があれば、コマンドラインから単独で起動できますし、GDBで追うこともできます。

GDBでcc1をデバッグ
$ gdb /home/katsuhiro/share/projects/oss/crosstool-builder-new/buildroot/libexec/gcc/riscv32-unknown-elf/8.3.0/cc1

(gdb) b main
Breakpoint 1 at 0x4308a0: main. (2 locations)

(gdb) r a.c -dumpbase a.c -march=rv32gc -mabi=ilp32d -auxbase a -g -O0 -Wall -fdump-tree-all-raw -fdump-rtl-all -o a.s
Starting program: /home/katsuhiro/share/projects/oss/crosstool-builder-new/buildroot/libexec/gcc/riscv32-unknown-elf/8.3.0/cc1 a.c -dumpbase a.c -march=rv32gc -mabi=ilp32d -auxbase a -g -O0 -Wall -fdump-tree-all-raw -fdump-rtl-all -o a.s

Breakpoint 1, main (argc=15, argv=0x7fffffffd3c8)
    at /home/katsuhiro/share/projects/oss/crosstool-builder-new/./gcc/gcc/main.c:36
36        toplev toplev (NULL, /* external_timer */

ブレークポイントなども仕掛けられますし、変数の値を表示することもできます。解析がかなり楽になるはずです……たぶん。

編集者:すずき(2023/09/24 11:46)

コメント一覧

  • hdkさん(2019/05/23 21:07)
    実際に試したわけではないので素朴な疑問なのですが、cc1の引数はgcc -vで出る内容から-vと-versionあたりを外したものとは違うんでしょうか?
  • すずきさん(2019/05/25 10:35)
    試してみたら、同じみたいです。
    わざわざ改造しなくても、-v の方が簡単ですね。
open/close この記事にコメントする



2019年5月26日

RISC-V 64 CPUが我が家に来た

目次: RISC-V

SiFiveのHiFive Unleashedを購入しました。現状、世界唯一かつ最速のLinuxが動作するRISC-V 64bit SoC です。

ボードにはSDカードが付属しておりbuildrootがインストールされています。電源を入れればLinuxが起動し、ユーザroot、パスワードsifiveでログインできるようになっていました。

インストールされているカーネルは、
Linux buildroot 4.15.0-00044-g2b0aa1d #1 SMP Tue Mar 20 12:18:35 PDT 2018 riscv64 GNU/Linux
でした。うーん、4.19かと思ったら、意外と古い?

Linuxとbuildrootだけでは面白くないのでDebian portsからriscv64向けのパッケージを引っ張ってきてDebianの環境を構築しました。

Debianのriscv64向けポーティングは絶賛作業中らしく、ffmpegなど用意されていないパッケージもチラホラありますが、自分で用意する手間を考えれば、使えるだけでどれだけありがたいかわかるというものです。

元のSDカードを書き潰すのは若干ためらわれた(後で元に戻せなくなった時に面倒)ので、今はchrootで使っています。

購入時の罠

Crowd Supplyから購入しました。本体 $999, 送料 $40, 消費税が5,000円くらい、合計で11万円くらいです。SBCにしてはかなり良いお値段です。

送料を払うのですが、家には着払いで届く点にも注意しなければなりません。

UPSが米国→日本まで持ってきて、国内はクロネコヤマトが運びます。受け取りの際に、消費税を着払いでクロネコに払う必要があります。私は消費税のことを知らなくて、何で送料を2回払うんだ??と混乱しました。

メモ: 技術系の話はFacebookから転記しておくことにした。かなり追記。

編集者:すずき(2021/06/28 15:29)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2019年5月27日

がんばれHiFive Unleashed

目次: RISC-V

HiFive UnleashedにDebianを導入した記念に、いつもやっているベンチマークを取ってみました。

モナコインのハッシュ方式に使われているLyra2REv2のベンチマークです。1秒にいくつハッシュ値を計算できるか測ります。

おそらくクロスコンパイルでビルドすることもできるとは思いますが、curl, libsslなどに依存していて意外と面倒です。Debianの力を借りてセルフコンパイルすると超簡単です。

測定結果ですが、結論から言うと、Unleashedはメチャクチャ遅いです。Unleashedの結果は下記のとおりです。4コアなので4スレッド並列で測定しています。

HiFive Unleashedの測定結果
CPU #0: 4.53 kH/s
CPU #2: 4.53 kH/s
CPU #1: 4.53 kH/s
CPU #3: 4.53 kH/s
Total: 18.12 kH/s

参考までにROCKPro64 RK3399(Cortex-A72 x 2, Cortex-A53 x 4)で同じプログラムをコンパイルして測定すると、下記の結果になります。6スレッド並列です。

ROCKPro64 RK3399の測定結果
CPU #4: 64.17 kH/s
CPU #5: 64.16 kH/s
CPU #1: 34.07 kH/s
CPU #2: 34.11 kH/s
CPU #0: 33.97 kH/s
CPU #3: 33.92 kH/s
Total: 264.94 kH/s

CA72は64kH/sくらい、CA53は33kH/sくらいです。このプログラムはCubeHashにNEON対応を入れた特別版ですが、NEON対応を外してもCA53は29kH/sくらいは出ます。

買う前からUnleashedがあまり速くないことは知っていましたが、4コア束になってもCA53 1コアに勝てないとは思っていなかったです……。

しかもこのボード、かなり高価(10万円以上する)なので、お蔵入りは避けたいんですが、拡張性に乏しくて(USBがない)、一体何に使えるのか謎です。

後日追記

追加でROCK64上で測定したので、結果を載せておきます。

ROCK64 RK3328の測定結果
4 miner threads started, using 'lyra2rev2' algorithm.
CPU #2: 31.29 kH/s
CPU #0: 31.22 kH/s
CPU #1: 31.23 kH/s
CPU #3: 31.30 kH/s
Total: 125.04 kH/s

RK3399のCortex-A53とあまり変わりません。同じCPUコアで動作周波数もほぼ同じなので、当然といえば当然ですけども。

メモ: 技術系の話はFacebookから転記しておくことにした。多少追記。

編集者:すずき(2021/06/28 15:35)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2019年6月3日

抗生物質

病院に行くと大抵の場合、何らかの抗生物質が処方されます。昔、おなかを壊したとき(2010年2月1日の日記参照)はホスホマイシンを処方されました。

色々種類があるようなので、ちょっとした興味で調べてみたんですが、思っていたより抗生物質の種類は多かったよ……。

系統 作用原理
β-ラクタム系 ペニシリン 細胞壁(ペプチドグリカン)に必要なムレイン架橋を阻害
アミノグリコシド系 ストレプトマイシン リボソーム50Sサブユニット、23SrRNA阻害
リンコマイシン系 リンコマイシン リボソーム50Sサブユニット阻害
ホスホマイシン系 ホスホマイシン MurA阻害、細胞壁(ペプチドグリカン)に必要なムレイン合成を阻害
テトラサイクリン系 テトラサイクリン リボソーム30Sサブユニット阻害
クロラムフェニコール系クロラムフェニコール リボソーム50Sサブユニット阻害
マクロライド系 エリスロマイシン
ケトライド系 テリスロマイシン
ポリペプチド系 コリスチン 細胞壁の傷害、合成阻害など
グリコペプチド系 バンコマイシン 細胞壁(ペプチドグリカン)に必要なムレイン合成を阻害
キノロン系 キノロン DNAジャイレース阻害
ニューキノロン系 フルオロキノロン DNAジャイレース阻害
サルファ剤 サルファメソキサゾール葉酸合成阻害
オキサゾリジノン系 リネゾリド リボソーム50Sサブユニット阻害

「〜マイシン」という命名が多いです。これは放線菌(Streptomyces属)が産出する抗菌剤を意味するのだとか。なぜ放線菌が数多の抗生物質を作り出すのか、不思議ですね?

細菌に存在する生命維持の機構も、いくつか種類があるので、万能の抗生物質はありません。理解しているのはこのくらいで、作用原理は書き写してみたものの、詳しい仕組みは知りません。

抗生物質の基本的な戦略

付け焼刃の知識ですが、抗生物質の基本的な戦略は、
「人間には存在せず、細菌にしか存在しない生命維持もしくは増殖機構を妨害する」
当たり前ですよね、人間の生命活動まで妨害したら、細菌と一緒に人間まで死んでしまう(=副作用)ので、薬として成立しません。

例えば、リボソームはmRNAからたんぱく質を生成する器官です。リボソームの働きを妨害すると生命維持に必要なたんぱく質が作れなくなって、細胞は死んでしまいます。リボソームは真核生物(人間)の細胞にも、原核生物(細菌)の細胞にも存在しますが、大きさと形が異なります。真核生物は60S, 40Sという大きさ、原核生物は50S, 30Sという大きさのサブユニットを持っています(参考: 生命の重要な機構である「リボソーム」 | 株式会社A&T)。

ですので50S, 30Sのサブユニットだけを妨害するような物質を使えば、細菌のみ攻撃して退治できるという寸法です。賢い戦略ですよね。

しかし世の中はそう単純ではなく、真核生物は細胞内にミトコンドリアを持っています。ミトコンドリアは酸素を使いエネルギーを生成するための、非常に大事な器官です。ミトコンドリアは少々変わった器官で、太古の昔に真核生物の細胞内に共生した細菌(リケッチアに近い種類)が祖先と考えられています。

細菌が先祖のミトコンドリアは、細菌と似たようなリボソームを持っています。そのため抗生物質が間違ってミトコンドリアのリボソームまで攻撃してしまい、人間の具合まで悪くなる(=抗生物質の副作用)原因となっているそうです。

真核生物の中に原核生物が融合しているなんて、何とも場当たり的でムチャクチャに思えますが、ムチャクチャなのに驚きの精密な機構があったりして、生物って面白いですね。

編集者:すずき(2019/06/09 15:04)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2019年5月9日 >>> 2019年6月5日
link もっと後

管理用メニュー

link 記事を新規作成

<2019>
<<<05>>>
---1234
567891011
12131415161718
19202122232425
262728293031-

最近のコメント5件

  • link 02年8月4日
    lxbfYeaaさん (07/12 10:11)
    「555」
  • link 24年6月17日
    すずきさん (06/23 00:12)
    「ありがとうございます。バルコニーではない...」
  • link 24年6月17日
    hdkさん (06/22 22:08)
    「GPSの最初の同期を取る時は見晴らしのい...」
  • link 24年5月16日
    すずきさん (05/21 11:41)
    「あー、確かにdpkg-reconfigu...」
  • link 24年5月16日
    hdkさん (05/21 08:55)
    「システム全体のlocale設定はDebi...」

最近の記事3件

  • link 24年8月10日
    すずき (08/12 16:23)
    「[Linuxを調べる - initrdとカーネル引数] 目次: Linux今どき(?)のinitrdとカーネル引数の渡し方を知...」
  • link 23年4月10日
    すずき (08/12 15:08)
    「[Linux - まとめリンク] 目次: Linuxカーネル、ドライバ関連。Linuxのstruct pageって何?Linu...」
  • link 24年8月5日
    すずき (08/11 23:27)
    「[debootstrapと他アーキテクチャバイナリとbinfmt_misc] 目次: Linux以前、Debianのrootf...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 08/12 16:23