読者です 読者をやめる 読者になる 読者になる

/home/tnishinaga/TechMEMO

日々行ったこと、面白かったことを書き留めます。

proc-v7m.Sに定義されているnop_cache_fnsはどこにあるのか

Linux

ARM Cortex-M7マイコンでキャッシュを使えるようにするためにいろいろ頑張っています。

現在のLinux Kernelでは、アーキテクチャとしてARMv7Mが選択されると同時にCPU_CACHE_NOPが選択*1され、キャッシュを制御するコードとしてarch/arm/mm/cache-nop.S内のコードが利用されるようになっています*2。 このcache-nop.Sにはキャッシュを持たないマイコンのため、キャッシュを操作するための処理として「何もしない(NOP)」というコードが書かれています。 一方、今回対象としているARM Cortex-M7はキャッシュを持つため、このキャッシュを利用するためにはきちんとキャッシュの処理をするコードを書いてあげなければいけません。

さて、このcache-nop.S内の関数はどこでキャッシュを操作する関数として登録されているか調べてみると、proc-v7m.Sにproc_info_list構造体というものがあり、ここのcacheというメンバにセットするとキャッシュを操作する関数として登録されるようです。 以下、proc-v7m.Sの該当部分を引用します。

/*
 * Match any ARMv7-M processor core.
 */
.type   __v7m_proc_info, #object
__v7m_proc_info:
.long   0x000f0000      @ Required ID value
.long   0x000f0000      @ Mask for ID
.long   0           @ proc_info_list.__cpu_mm_mmu_flags
.long   0           @ proc_info_list.__cpu_io_mmu_flags
initfn  __v7m_setup, __v7m_proc_info    @ proc_info_list.__cpu_flush
.long   cpu_arch_name
.long   cpu_elf_name
.long   HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT
.long   cpu_v7m_name
.long   v7m_processor_functions @ proc_info_list.proc
.long   0           @ proc_info_list.tlb
.long   0           @ proc_info_list.user
.long   nop_cache_fns       @ proc_info_list.cache
.size   __v7m_proc_info, . - __v7m_proc_info

ここでproc_info_list.cacheに定義されているnop_cache_fnsシンボルの中身はどこにあるか調べるためgrepをかけてみると、以下のようにproc-v7m.SとSystem.mapにシンボル名は見つかりますが、中身は見つかりません。

$ grep -R "nop_cache_fns" ./
./arch/arm/mm/proc-v7m.S:       .long   nop_cache_fns           @ proc_info_list.cache
Binary file ./arch/arm/mm/cache-nop.o matches
Binary file ./arch/arm/mm/proc-v7m.o matches
Binary file ./arch/arm/mm/built-in.o matches
Binary file ./vmlinux.o matches
Binary file ./.tmp_vmlinux1 matches
Binary file ./.tmp_vmlinux2 matches
Binary file ./vmlinux matches
./System.map:c0128ea0 T nop_cache_fns
./.tmp_System.map:c0128ea0 T nop_cache_f

さっぱりわからないのでcache-nop.Sをじっくり眺めていたところ、以下のような記述を発見しました。

 @ define struct cpu_cache_fns (see <asm/cacheflush.h> and proc-macros.S)
    define_cache_functions nop

define_cache_functionsはマクロっぽいので、コメントに従ってarch/arm/mm/proc-macros.Sを開いてみると、ビンゴでした。 マクロの定義は以下のようになっており、name部分に設定した名前と_cache_fnsを連結した名前の構造体を作るようになっているようです。 上記の例ではnopがセットされているので、nop_cache_fnsという名前の構造体がこのマクロによって作られることなります。

.macro define_cache_functions name:req
    .align 2
    .type   \name\()_cache_fns, #object
ENTRY(\name\()_cache_fns)
    .long   \name\()_flush_icache_all
    .long   \name\()_flush_kern_cache_all
    .long   \name\()_flush_kern_cache_louis
    .long   \name\()_flush_user_cache_all
    .long   \name\()_flush_user_cache_range
    .long   \name\()_coherent_kern_range
    .long   \name\()_coherent_user_range
    .long   \name\()_flush_kern_dcache_area
    .long   \name\()_dma_map_area
    .long   \name\()_dma_unmap_area
    .long   \name\()_dma_flush_range
    .size   \name\()_cache_fns, . - \name\()_cache_fns
.endm

ちなみにnop_cache_fnsの型はcpu_cache_fnsであり、arch/arm/include/asm/cacheflush.hに定義されています。

とりあえず、以上です。

*1:arch/arm/Kconfig 及び arch/arm/mm/Kconfig を参照

*2:arch/arm/mm/Makefile参照

of_property_match_stringを使ってみたメモ

Linux

あらすじ

Google Summer of Code(GSoC)でやることの一つとして、STM32F7マイコンでUART(シリアル)を使うためのLinuxドライバを書いています。 STM32F7とSTM32F4のシリアルペリフェラルはほとんど同じ*1なので、STM32F4のものをベースにSTM32F7向けのコードを追記して、STM32F7で利用する際は追記したコードに処理を切り替えるということを行えば、既存のドライバのコードを再利用してSTM32F7でもシリアルが利用できるようになります。

この切り替えを行うためにDevice Tree Blobに書かれた情報からSTM32F4で動いているのかSTM32F7で動いているのかを判断するようなコードを書いていましたが、メンターの方と相談した結果、差分もほとんどない上、#define 部も切り替える必要がありコードがわかりづらくなるなどの問題もあり、#ifディレクティブを用いて書いてみることになりました。

以上より、Device Tree Blobに書かれた情報からSTM32F4で動いているのかSTM32F7で動いているのかを判断するようなコードはひとまず不要となったので、そのやり方についてをこちらで供養したいと思います。

コードを切り替えるには

ランタイム時、ドライバ内でコードの切り替えを行うためには、STM32F4で動いているのかSTM32F7で動いているのかを判断する必要があります。

この判断については、カーネルがDeviceTreeBlob(DTB)に従ってどういう名前のserialドライバを読み込もうとするかを見ることで行うことにしました。例えば、stm32-usartというドライバ名で読み込もうとする場合はSTM32F4として、stm32f7-usartというドライバ名で読み込もうとする場合はSTM32F7として判断するという感じです。

実際の arch/arm/boot/dts/stm32f429.dtsi のserialに関する記述は、以下のようになっています。

usart6: serial@40011400 {
 compatible = "st,stm32-usart", "st,stm32-uart";
 reg = <0x40011400 0x400>;
 interrupts = <71>;
 clocks = <&rcc 0 165>;
 status = "disabled";
};

このように書かれているとき、stm32f429.dtsiをincludeしているDTBを読み込んだカーネルは、stm32-usartをcompatibleとして設定しているドライバを読み込んで使用します。

ドライバ側のコード(drivers/tty/serial/stm32-usart.c)には次のような構造体が定義されており、ここに追記を行うとcompatibleとして扱う名前を増やすことができます。

static const struct of_device_id stm32_match[] = {
        { .compatible = "st,stm32-usart", },
        { .compatible = "st,stm32-uart", },
        {},
};

ここにcompatibleとしてstm32f7-usartとstm32f7-uartの記述を増やすと、次のような感じになります。

static const struct of_device_id stm32_match[] = {
        { .compatible = "st,stm32-usart", },
        { .compatible = "st,stm32-uart", },
        { .compatible = "st,stm32f7-usart", },
        { .compatible = "st,stm32f7-uart", },
        {},
};

ドライバ内でDTBのcompatibleに設定されている名前が「st,stm32f7-usart」であるかを確認するには、of_property_match_string関数が使えます*2。 この関数は第3引数に設定した文字列と一致する文字列がcompatibleに設定されている場合、compatibleの何番目に設定されているかのインデックスを返します。そうでない場合はマイナスの値が返ってくるようです。 よって、次に示すstm32_of_is_stm32f7関数のようなコードを作ってドライバ内のprobe関数で呼び出すと、そのドライバがSTM32F4向けとして呼び出されたのか、STM32F7向けとして呼び出されたのかを知ることができます。

static inline bool stm32_of_is_stm32f7(struct platform_device *pdev){
    struct device_node *np = pdev->dev.of_node;

    if (of_property_match_string(np, "compatible", "st,stm32f7-uart") >= 0
        || of_property_match_string(np, "compatible", "st,stm32f7-usart") >= 0)
        return true;
    else
        return false;
}

後は、この情報をどこかで覚えておいて、ifを使ってコードを切り替えれば良いと思います。

以上です。


おまけ。

ドライバ内ではpr_info関数をprintfデバッグに使えるっぽい(?)

pr_info("Hogehoge\n");

of_property_read_string関数を用いると、DTBから特定の要素に設定された文字列を読み出せる。

const char *comp;
of_property_read_string(pdev->dev.of_node, "compatible", &comp);
pr_info("%s\n",comp);

*1:詳細はSTマイクロエレクトロニクス社の資料(Migration of microcontroller applications from STM32F42xxx/STM32F43xxx to STM32F74xxx/STM32F75xxx) を参照してください。

*2:この関数の詳しい仕様について、日本語では以下の記事がとてもわかりやすいです。とあるエンジニアの備忘log: Device Tree アクセス関数まとめ (Linux Kernel)

Raspberry Pi 3を64-bitモードで扱うための現状について調べてみた

f:id:tnishinaga:20160417154950j:plain

これまでのあらすじ

2016年の2月の終わり頃,Raspberry Pi 3(以下,RasPi3)が発売されました. 日本では技適のいろいろがありまして,その1ヶ月後の3月終わり頃から秋月やマルツなどで購入できるようになりました.

RasPi3の特徴は,Raspberry Pi 2まで採用していた32-bit ARMアーキテクチャのCPUではなく,64-bit ARMアーキテクチャのCPUを採用している点です.

32-bitから64-bitになると,CPUが1度の命令で処理できるデータの長さが32から64と2倍になるので,同じ処理なら一般的に64-bit環境で実行するほうが高速*1です. しかし,2016年3月はまだ公式から64-bit版のraspbianは提供されていないどころか,そもそもファームウェアが64-bitに対応していなかったために,簡単に64-bitのOSやプログラムを動かすことができませんでした.

ここまでが私がRasPi3を購入した時点での状況です. 私は64-bit環境で利用するためにRasPi3を購入したので,64-bit 対応環境が出るまでRasPi3は放置して別のことをやることにしていましたが,最近どうやら64-bitで動作するようになったようなので,改めてその状況を調べて,まとめてみました.

64-bit対応状況

基本的には以下のフォーラムページで議論されているので,ここを読めばだいたい今どんな状況なのかわかります.

Raspberry Pi • View topic - Entering aarch64 execution state

ファームウェアの件

ご存じの方も多いと思いますが,Raspberry PiはCPUから起動が始まるのではなく,GPUが先に起動し,その上で動作するファームウェアがCPUやその他周辺機器の初期化を行い,カーネルをメモリにロードして制御を移し,起動するようになっています.

以前はこのファームウェアがCPUを64-bitモードでなく,32-bitモードにセットして起動を始めるので,そのまま64-bitのプログラムを起動できない……という問題があったのですが,4月13日のコミットで64-bitモードで起動する機能が追加され,この問題は解決したようです.

kernel: Bump to 4.4.7 · raspberrypi/firmware@efdcf16 · GitHub

カーネルの読み込まれる位置は0x00080000になるようです.

git.denx.de Git - u-boot.git/commitdiff

Kernelの件

ARM64のRasPi 3向けのdtsを追加するなどして,64-bit modeの起動に対応したカーネルを公開してくれている方がいます.

GitHub - anholt/linux

まだ試していませんが,こちらをARM64向けにビルドして,ブートローダーから起動すればよいのでしょう.

ブートローダーの件

gitのlogを見ると,U-Bootは既に対応しているようです.

git.denx.de Git - u-boot.git/summary

こちらもraspi3向けのdefconfigを読み込んでビルドすればよいのでしょう.

ビルド済みイメージ

64-bitモードで動作するRasPi3向けイメージが,有志の方から配布されています.

これらを用いることで手軽に64-bit Linux環境を試すことができます.

Debian

http://www.tom-yam.or.jp/rpi3/rpi3-arm64-debian-20160414.img.xz

rootのパスワードにraspberryといれるとログインできます.

ためしてみたところ,確かに64bitなLinux kernelが動作しました.

f:id:tnishinaga:20160417232329j:plain

Docker Engine入りイメージ

Raspberry pi 3用64bit Docker Engineを含むイメージを公開しました – 株式会社 あっとBSD

株式会社あっとBSDという,「基礎から学ぶ 組み込みAndroid」などの本を書かれている方の会社で作られたイメージです.

Dockerをすぐに試せるようです.

Gentoo

http://mirror.bytemark.co.uk/gentoo/experimental/arm64/

詳細不明ですが,Gentoo使ってる方は多分なんとかできると思います.

64-bitモードで動作するLinux イメージを作ってみる

今やってる途中なので,できたら別の記事として投稿します.

おわり

以上でおわりです.

その他情報がありましたら,コメントやTwitterで教えていただけると嬉しいです.

よろしくお願いします.

*1:暗号化処理など整数演算は確実に高速になりますが,それ以外はさほど変わりないので,すべてのプログラムが必ずしも高速になるわけではありません

Linux Kernelコードを.configの内容に応じてコードを切り替える方法メモ

Linux

一連のツイート

やりたいこと

現在,Linux Kernel 4.6をSTM32F746-discovery(Cortex-M7)上で動作させることを目標に,コードをいじっています.

現時点のMainline Linux Kernel(4.5)は,STM32F746-discoveryには対応していません. しかし,STM32F429I-discovery(Cortex-M4)には対応*1しており,ドライバやDeviceTreeSourceなどが存在しています. そのため,STM32F7への対応は,STM32F4向けのコードをベースに行っています.

それぞれのペリフェラルの差異はレジスタが増減していたりアドレスが違ったりするだけなので,STM32F4のコードをほんの10行程度修正するだけでSTM32F7でも動くようになります. そのため,STM32F4とSTM32F7で別々のドライバを用意するのではなく,以下のように#ifを用いて共通のドライバを一部切り替えるようにして,コードを節約したいです. また,どちらのCPUを使用するかの選択は,カーネルのconfigでいじれるようにしたいです.

#if STM32F7
   // STM32F7向けのレジスタ定義
#else
   // STM32F4向けのレジスタ定義
#endif

やりたいことまとめ

  • #if ディレクティブでマイコンごとにコードを切り替えられるようにしたい
  • 使用するCPUの選択をKernelのconfigで設定できるようにしたい

Kconfig で CPUを選択できるようにする

やりたいことは,以下の2点です.

  • 使用するSoCを.configに設定するのは make ARCH=arm menuconfig から選択して行えるようにしたい
  • STM32F4とSTM32F7は排他的に選択できるようにしたい

まず,menuconfig時に出てくる設定のリストは,各ディレクトリ以下のKconfigファイルに定義されています. 今回のSTM32マイコン向けの設定は arch/arm/Kconfigに書かれているので,これを編集します.

使用するSoCを選択するには,choiceを使えば良いことをnekomatsuさんに教えていただきました. 今回の場合,以下のようにchoiceからendchoiceまでの間にconfigを書くと,排他的に選択ができるようになります.

choice
    prompt "SoC Name"
        depends on ARCH_STM32
    default MACH_STM32F746

config MACH_STM32F429
    bool "STMicrolectronics STM32F429"

config MACH_STM32F746
    bool "STMicrolectronics STM32F746"

endchoice

実際にmenuconfigで開いてみた結果はこんな感じになります.

f:id:tnishinaga:20160411033033p:plain

.configの設定をC言語で使う

さて,次に.configの設定をCやアセンブリのコードで読むにはどうすれば良いのかと調べてみると,詳しく解説されているページがありました.

とあるエンジニアの備忘log: Linux ライクな autoconf.h を簡単に作る

こちらのページに書かれているように,カーネルをmakeした後には include/generated/autoconf.h ができており,このファイルを覗くと先ほど追加した設定が以下の用に定義されていました.

#define CONFIG_MACH_STM32F746 1

つまり,Kconfigに config MACH_STM32F746 と書いたものが選択された場合,MACH_STM32F746の頭にCONFIG_がついた CONFIG_MACH_STM32F746 定数が定義されます. 定数の値は,今回のようにboolの場合は選択時(yes)の場合は1が入ります.

このautoconf.hはすべてのCやアセンブリのビルド時にインクルードされています. なので,STM32F746が選択された場合のみ有効にしたいコードがある場合は,以下のようにして書くことができます.

#if CONFIG_MACH_STM32F746 == 1
 // STM32F746が選択された場合のみ有効にしたいコード
#endif

おわり

以上で.configの設定に応じてコードを切り替えることができるようになりました.

STM32F7でLinux Kernelを動かす件は,今の所シリアル出力が得られるようになりましたが,その他ペリフェラルのサポートはできていません. また,ある方法で起動しないと道中でクラッシュするというよくわからないバグも発生しており,解決できていません. そのあたりはこれから直していく予定です.

おしまい.

*1:動かし方はeLinuxのページにまとまっています

Failed to find path for dmidecode binaryと言ってlibvirtが起動しなくなった件

ArchLinux

問題

いつの間にかlibvirtを使っていた仮想マシンが起動も設定もできなくなっていた.

以下のコマンドでlibvirtを再起動しても,長時間待たされた後にタイムアウトする.

$ sudo systemctl restart libvirtd.service

journalctlでログを見てみると,dmidecodeが見つからないと言われる.

$ journalctl -xe

libvirtd[2847]: internal error: Failed to find path for dmidecode binary

ぐぐってみると以下の記事が引っかかるが,ebtablesが見つからないとは言われていない.

kernhack.hatenablog.com

直し方

調べてみると,dmidecodeはハードウェアの情報を得るためのコマンドらしい.

linux.die.net

HWの情報を取得できるdmidecodeコマンドが結構便利だと思った - 完熟トマト

このパッケージをpacmanで検索してみるとインストールされてなかったので,インストールするとエラーが出なくなった.

$ sudo pacman -S dmidecode

この後システムを再起動したところ,libvirtを使った仮想マシンが起動できるようになった.

めでたしめでたし.

ArchLinuxのアップデートで署名エラーが出た場合についてメモ

ArchLinux

本日1週間ぶりくらいに pacman -Syu したところ,以下のエラーが出ました.

error: confuse: signature from "Thorsten Töpper <atsutane@freethoughts.de>" is unknown trust

調べてみると以下の記事がヒット.

[Solved] confuse 2.7-3 install error: mainatainer gpg key is unknown / Newbie Corner / Arch Linux Forums

どうやら最初に鍵の更新をすると良いようです.

$ sudo pacman -S archlinux-keyring

後は普通にアップデートできるはずです.

以上.

黒柴(KURO-SHEEVA)にdebian jessieを入れる

SheevaPlug ARM Linux Debian

tnishinaga.hatenablog.com

この記事の続きです.

前回はLinuxカーネルをビルドして動かしてみるところまでやりました. 今回はdebianのイメージを作って動かしてみたいと思います.

debootstrapでdebian環境を作る

debootstrapはdebianの基本システムを簡単に作れる公式ツールです. Arch Linuxではyaourtで導入できます.

$ yaourt debootstrap

また,debootstrapを完了するためにはbinfmtとqemu user modeのstaticバイナリが必要です.以下のコマンドで導入及び有効化してください. binfmtやqemu user modeについての解説は,ググるか,C89で僕のスタンドが同人誌の中でほんの少し解説するようなので,興味のある方は「3日目東ム36-a 迷惑研」にいらしてください.

$ yaourt -S binfmt-support binfmt-qemu-static
$ sudo update-binfmts --enable qemu-arm
$ yaourt -S qemu-user-static

debootstrapを用いてarmel用のdebian jessie環境を作るには,以下のコマンドを実行します. なお,後の作業で必要なため,debootstrapは前回linuxカーネルのソースをおいたところで実行してください.

$ cd 
$ mkdir -p debian-jessie-armel/usr/bin
$ cp /usr/bin/qemu-arm-static debian-jessie-armel/usr/bin/
$ sudo debootstrap --arch armel jessie debian-jessie-armel http://ftp.jp.debian.org/debian

次にchrootでこのdebian環境に入り,初期設定としてrootのパスワードだけ設定します.

$ LC_ALL=C LANGUAGE=C LANG=C sudo chroot debian-jessie-armel /bin/bash
# export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
# passwd
# exit
$ cd ~/

Linux Kernelからモジュールとかヘッダを入れる

前回ビルドしたlinuxカーネルのうち,モジュールとヘッダファイルをこのdebian環境に入れます.

$ cd linux
$ make ARCH=arm CROSS_COMPILE=arm-unknown-linux-gnueabi- modules
$ sudo make ARCH=arm CROSS_COMPILE=arm-unknown-linux-gnueabi- INSTALL_MOD_PATH=~/debian-jessie-armel modules_install
$ sudo make ARCH=arm CROSS_COMPILE=arm-unknown-linux-gnueabi- INSTALL_HDR_PATH=~/debian-jessie-armel/usr headers_install
$ cd ~/

SDカードにDebian環境をインストールする

前回作成したLinuxカーネルと今回作ったDebian環境をSDカードに入れていきます. なお,私の持っている黒柴のU-BootはSDカードの第2パーティションをrootfsとして起動するようになっていたので,第1パーティションカーネル,第2パーティションにrootfsを置くような構成にします.

fdisk等を用いて,第1パーティションを64MBのfat,残りをext4パーティションとしてパーティション分けを行ってください. そして次のコマンドでフォーマットを行います.

$ sudo mkfs.vfat /dev/sdX1 (Xは各自環境に合わせる)
$ sudo mkfs.ext4 /dev/sdX2

フォーマットが終わったら,第1パーティションを/mnt/fat,第2パーティションを/mnt/ext4にマウントします.

$ sudo mkdir -p /mnt/fat
$ sudo mkdir -p /mnt/ext4
$ mount -t vfat /dev/sdX1 /mnt/fat
$ mount -t ext4 /dev/sdX2 /mnt/ext4

後はカーネルdebian環境をSDカードに入れ,アンマウントします.

$ sudo cp uImage+dtb /mnt/fat/
$ sudo rsync -avh debian-jessie-armel/ /mnt/ext4/
$ sudo umount /mnt/fat
$ sudo umount /mnt/ext4 

以上でインストールは完了です.

起動してみる

最後に,黒柴にSDカードを刺した後,前回と同様の方法で起動してみます.

Marvell>> mmcinit
Marvell>> fatload mmc 0:1 0x02000000 uimage+dtb
Marvell>> bootm

正しく動作すれば,debianのログインプロンプトが出てくるはずです. 以下に動作時のログを乗せておきます.

Marvell>> mmcinit
SDHC found. Card desciption is:
Manufacturer:       0x74, OEM "JE"
Product name:       "USD  ", revision 1.0
Serial number:      1280314594
Manufacturing date: 1/2012
CRC:                0x00, b0 = 0
Marvell>> fatload mmc 0:1 0x02000000 uimage+dtb
reading uimage+dtb

4298473 bytes read
Marvell>> bootm
## Booting image at 02000000 ...
   Image Name:   Linux-sheeva-esata
   Created:      2015-12-25   5:13:54 UTC
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    4298409 Bytes =  4.1 MB
   Load Address: 02000000
   Entry Point:  02000040
   Verifying Checksum ... OK
   XIP Kernel Image ... OK

Starting kernel ...

Booting Linux on physical CPU 0x0
Linux version 4.3.0 (tnishinaga@arch-tx201) (gcc version 5.2.0 (crosstool-NG crosstool-ng-1.22.0) ) #6 PREEMPT Fri Dec 25 14:07:55 JST 2015
CPU: Feroceon 88FR131 [56251311] revision 1 (ARMv5TE), cr=0005397f
CPU: VIVT data cache, VIVT instruction cache
Machine model: Globalscale Technologies eSATA SheevaPlug
Memory policy: Data cache writeback
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 130048
Kernel command line: console=ttyS0,115200 root=/dev/mmcblk0p2 rw
PID hash table entries: 2048 (order: 1, 8192 bytes)
Dentry cache hash table entries: 65536 (order: 6, 262144 bytes)
Inode-cache hash table entries: 32768 (order: 5, 131072 bytes)
Memory: 510664K/524288K available (6261K kernel code, 214K rwdata, 1680K rodata, 176K init, 666K bss, 13624K reserved, 0K cma-reserved, 0K highmem)
Virtual kernel memory layout:
    vector  : 0xffff0000 - 0xffff1000   (   4 kB)
    fixmap  : 0xffc00000 - 0xfff00000   (3072 kB)
    vmalloc : 0xe0800000 - 0xff000000   ( 488 MB)
    lowmem  : 0xc0000000 - 0xe0000000   ( 512 MB)
    pkmap   : 0xbfe00000 - 0xc0000000   (   2 MB)
    modules : 0xbf000000 - 0xbfe00000   (  14 MB)
      .text : 0xc0008000 - 0xc07c9984   (7943 kB)
      .init : 0xc07ca000 - 0xc07f6000   ( 176 kB)
      .data : 0xc07f6000 - 0xc082b9c0   ( 215 kB)
       .bss : 0xc082b9c0 - 0xc08d24a0   ( 667 kB)
SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
Preemptible hierarchical RCU implementation.
    Build-time adjustment of leaf fanout to 32.
NR_IRQS:16 nr_irqs:16 16
clocksource: orion_clocksource: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 9556302233 ns
sched_clock: 32 bits at 200MHz, resolution 5ns, wraps every 10737418237ns
Console: colour dummy device 80x30
Calibrating delay loop... 1191.11 BogoMIPS (lpj=5955584)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)
Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
CPU: Testing write buffer coherency: ok
Setting up static identity map for 0x81e0 - 0x8238
mvebu-soc-id: MVEBU SoC ID=0x6281, Rev=0x2
devtmpfs: initialized
clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
xor: measuring software checksum speed
   arm4regs  :  1084.400 MB/sec
   8regs     :   804.000 MB/sec
   32regs    :   970.800 MB/sec
xor: using function: arm4regs (1084.400 MB/sec)
pinctrl core: initialized pinctrl subsystem
NET: Registered protocol family 16
DMA: preallocated 256 KiB pool for atomic coherent allocations
cpuidle: using governor ladder
cpuidle: using governor menu
Feroceon L2: Enabling L2
Feroceon L2: Cache support initialised.
[Firmware Info]: /ocp@f1000000/ethernet-controller@72000/ethernet0-port@0: local-mac-address is not set
raid6: int32x1  gen()   115 MB/s
raid6: int32x1  xor()    76 MB/s
raid6: int32x2  gen()   167 MB/s
raid6: int32x2  xor()   103 MB/s
raid6: int32x4  gen()   185 MB/s
raid6: int32x4  xor()   119 MB/s
raid6: int32x8  gen()   187 MB/s
raid6: int32x8  xor()   116 MB/s
raid6: using algorithm int32x8 gen() 187 MB/s
raid6: .... xor() 116 MB/s, rmw enabled
raid6: using intx1 recovery algorithm
vgaarb: loaded
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
Advanced Linux Sound Architecture Driver Initialized.
clocksource: Switched to clocksource orion_clocksource
NET: Registered protocol family 2
TCP established hash table entries: 4096 (order: 2, 16384 bytes)
TCP bind hash table entries: 4096 (order: 2, 16384 bytes)
TCP: Hash tables configured (established 4096 bind 4096)
UDP hash table entries: 256 (order: 0, 4096 bytes)
UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
NET: Registered protocol family 1
RPC: Registered named UNIX socket transport module.
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
futex hash table entries: 256 (order: -1, 3072 bytes)
jffs2: version 2.2. (NAND) © 2001-2006 Red Hat, Inc.
io scheduler noop registered
io scheduler deadline registered
io scheduler cfq registered (default)
kirkwood-pinctrl f1010000.pin-controller: registered pinctrl driver
irq: Cannot allocate irq_descs @ IRQ34, assuming pre-allocated
irq: Cannot allocate irq_descs @ IRQ66, assuming pre-allocated
mv_xor f1060800.xor: Marvell shared XOR driver
mv_xor f1060800.xor: Marvell XOR (Registers Mode): ( xor cpy intr )
mv_xor f1060900.xor: Marvell shared XOR driver
mv_xor f1060900.xor: Marvell XOR (Registers Mode): ( xor cpy intr )
Serial: 8250/16550 driver, 2 ports, IRQ sharing disabled
console [ttyS0] disabled
f1012000.serial: ttyS0 at MMIO 0xf1012000 (irq = 26, base_baud = 12500000) is a 16550A
console [ttyS0] enabled
loop: module loaded
sata_mv f1080000.sata: slots 32 ports 2
scsi host0: sata_mv
scsi host1: sata_mv
ata1: SATA max UDMA/133 irq 32
ata2: SATA max UDMA/133 irq 32
nand: device found, Manufacturer ID: 0xec, Chip ID: 0xdc
nand: Samsung NAND 512MiB 3,3V 8-bit
nand: 512 MiB, SLC, erase size: 128 KiB, page size: 2048, OOB size: 64
Scanning device for bad blocks
Bad eraseblock 2909 at 0x000016ba0000
Bad eraseblock 3657 at 0x00001c920000
3 ofpart partitions found on MTD device orion_nand
Creating 3 MTD partitions on "orion_nand":
0x000000000000-0x000000100000 : "u-boot"
0x000000100000-0x000000500000 : "uImage"
0x000000500000-0x000020000000 : "root"
libphy: orion_mdio_bus: probed
mv643xx_eth: MV-643xx 10/100/1000 ethernet driver version 1.4
mv643xx_eth_port mv643xx_eth_port.0 eth0: port 0 with MAC address f0:ad:4e:00:5c:d9
libertas_sdio: Libertas SDIO driver
libertas_sdio: Copyright Pierre Ossman
ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
ehci-pci: EHCI PCI platform driver
ehci-orion: EHCI orion driver
orion-ehci f1050000.ehci: EHCI Host Controller
orion-ehci f1050000.ehci: new USB bus registered, assigned bus number 1
ata1: SATA link down (SStatus 0 SControl F300)
orion-ehci f1050000.ehci: irq 29, io mem 0xf1050000
orion-ehci f1050000.ehci: USB 2.0 started, EHCI 1.00
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 1 port detected
usbcore: registered new interface driver usb-storage
usbcore: registered new interface driver ums-datafab
usbcore: registered new interface driver ums-freecom
usbcore: registered new interface driver ums-jumpshot
usbcore: registered new interface driver ums-sddr09
usbcore: registered new interface driver ums-sddr55
mousedev: PS/2 mouse device common for all mice
rtc-mv f1010300.rtc: rtc core: registered f1010300.rtc as rtc0
i2c /dev entries driver
orion_wdt: Initial timeout 21 sec
mvsdio f1090000.mvsdio: Got CD GPIO
mvsdio f1090000.mvsdio: Got WP GPIO
MV-CESA:Could not register sha1 driver
MV-CESA:Could not register hmac-sha1 driver
usbcore: registered new interface driver usbhid
usbhid: USB HID core driver
oprofile: no performance counters
oprofile: using timer interrupt.
NET: Registered protocol family 17
lib80211: common routines for IEEE802.11 drivers
Btrfs loaded
mmc0: new high speed SDHC card at address b368
rtc-mv f1010300.rtc: setting system clock to 2013-01-01 11:42:16 UTC (1357040536)
mmcblk0: mmc0:b368 USD   3.75 GiB 
 mmcblk0: p1 p2
ALSA device list:
  No soundcards found.
ata2: SATA link down (SStatus 0 SControl F300)
EXT2-fs (mmcblk0p2): error: couldn't mount because of unsupported optional features (240)
EXT4-fs (mmcblk0p2): couldn't mount as ext3 due to feature incompatibilities
EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null)
VFS: Mounted root (ext4 filesystem) on device 179:2.
devtmpfs: mounted
Freeing unused kernel memory: 176K (c07ca000 - c07f6000)
random: systemd urandom read with 7 bits of entropy available
systemd[1]: systemd 215 running in system mode. (+PAM +AUDIT +SELINUX +IMA +SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ -SECCOMP -APPARMOR)
systemd[1]: Detected architecture 'arm'.

Welcome to Debian GNU/Linux 8 (jessie)!

systemd[1]: Failed to insert module 'autofs4'
systemd[1]: Failed to insert module 'ipv6'
systemd[1]: Set hostname to <arch-tx201>.
systemd[1]: Cannot add dependency job for unit dbus.socket, ignoring: Unit dbus.socket failed to load: No such file or directory.
systemd[1]: Cannot add dependency job for unit display-manager.service, ignoring: Unit display-manager.service failed to load: No such file or directory.
systemd[1]: Expecting device dev-ttyS0.device...
         Expecting device dev-ttyS0.device...
systemd[1]: Starting Forward Password Requests to Wall Directory Watch.
systemd[1]: Started Forward Password Requests to Wall Directory Watch.
systemd[1]: Starting Remote File Systems (Pre).
[  OK  ] Reached target Remote File Systems (Pre).
systemd[1]: Reached target Remote File Systems (Pre).
systemd[1]: Starting Encrypted Volumes.
[  OK  ] Reached target Encrypted Volumes.
systemd[1]: Reached target Encrypted Volumes.
systemd[1]: Starting Dispatch Password Requests to Console Directory Watch.
systemd[1]: Started Dispatch Password Requests to Console Directory Watch.
systemd[1]: Starting Paths.
[  OK  ] Reached target Paths.
systemd[1]: Reached target Paths.
systemd[1]: Set up automount Arbitrary Executable File Formats File System Automount Point.
systemd[1]: Starting Swap.
[  OK  ] Reached target Swap.
systemd[1]: Reached target Swap.
systemd[1]: Starting Root Slice.
[  OK  ] Created slice Root Slice.
systemd[1]: Created slice Root Slice.
systemd[1]: Starting User and Session Slice.
[  OK  ] Created slice User and Session Slice.
systemd[1]: Created slice User and Session Slice.
systemd[1]: Starting Delayed Shutdown Socket.
[  OK  ] Listening on Delayed Shutdown Socket.
systemd[1]: Listening on Delayed Shutdown Socket.
systemd[1]: Starting /dev/initctl Compatibility Named Pipe.
[  OK  ] Listening on /dev/initctl Compatibility Named Pipe.
systemd[1]: Listening on /dev/initctl Compatibility Named Pipe.
systemd[1]: Starting Journal Socket (/dev/log).
[  OK  ] Listening on Journal Socket (/dev/log).
systemd[1]: Listening on Journal Socket (/dev/log).
systemd[1]: Starting udev Control Socket.
[  OK  ] Listening on udev Control Socket.
systemd[1]: Listening on udev Control Socket.
systemd[1]: Starting udev Kernel Socket.
[  OK  ] Listening on udev Kernel Socket.
systemd[1]: Listening on udev Kernel Socket.
systemd[1]: Starting Journal Socket.
[  OK  ] Listening on Journal Socket.
systemd[1]: Listening on Journal Socket.
systemd[1]: Starting System Slice.
[  OK  ] Created slice System Slice.
systemd[1]: Created slice System Slice.
systemd[1]: Starting system-getty.slice.
[  OK  ] Created slice system-getty.slice.
systemd[1]: Created slice system-getty.slice.
systemd[1]: Starting system-serial\x2dgetty.slice.
[  OK  ] Created slice system-serial\x2dgetty.slice.
systemd[1]: Created slice system-serial\x2dgetty.slice.
systemd[1]: Starting Increase datagram queue length...
         Starting Increase datagram queue length...
systemd[1]: Starting Load Kernel Modules...
         Starting Load Kernel Modules...
systemd[1]: Starting udev Coldplug all Devices...
         Starting udev Coldplug all Devices...
systemd[1]: Mounting Debug File System...
         Mounting Debug File System...
systemd[1]: Starting Create list of required static device nodes for the current kernel...
         Starting Create list of required static device nodes...rrent kernel...
systemd[1]: Mounted POSIX Message Queue File System.
systemd[1]: Started Set Up Additional Binary Formats.
systemd[1]: Mounted Huge Pages File System.
systemd[1]: Starting Slices.
[  OK  ] Reached target Slices.
systemd[1]: Reached target Slices.
systemd[1]: Starting Remount Root and Kernel File Systems...
         Starting Remount Root and Kernel File Systems...
[  OK  ] Mounted Debug File System.
systemd[1]: Mounted Debug File System.
[  OK  ] Started Increase datagram queue length.
systemd[1]: Started Increase datagram queue length.
[  OK  ] Started Load Kernel Modules.
systemd[1]: Started Load Kernel Modules.
[  OK  ] Started Create list of required static device nodes ...current kernel.
systemd[1]: Started Create list of required static device nodes for the current kernel.
[  OK  ] Started Remount Root and Kernel File Systems.
systemd[1]: Started Remount Root and Kernel File Systems.
[  OK  ] Started udev Coldplug all Devices.
systemd[1]: Started udev Coldplug all Devices.
systemd[1]: Starting Various fixups to make systemd work better on Debian...
         Starting Various fixups to make systemd work better on Debian...
systemd[1]: Starting Load/Save Random Seed...
         Starting Load/Save Random Seed...
systemd[1]: Starting Create Static Device Nodes in /dev...
         Starting Create Static Device Nodes in /dev...
systemd[1]: Mounted Configuration File System.
systemd[1]: Mounted FUSE Control File System.
systemd[1]: Starting Apply Kernel Variables...
         Starting Apply Kernel Variables...
systemd[1]: Starting Syslog Socket.
[  OK  ] Listening on Syslog Socket.
systemd[1]: Listening on Syslog Socket.
systemd[1]: Starting Sockets.
[  OK  ] Reached target Sockets.
systemd[1]: Reached target Sockets.
systemd[1]: Starting Journal Service...
         Starting Journal Service...
[  OK  ] Started Journal Service.
systemd[1]: Started Journal Service.
[  OK  ] Started Various fixups to make systemd work better on Debian.
[  OK  ] Started Load/Save Random Seed.
[  OK  ] Started Create Static Device Nodes in /dev.
[  OK  ] Started Apply Kernel Variables.
         Starting udev Kernel Device Manager...
[  OK  ] Reached target Local File Systems (Pre).
[  OK  ] Reached target Local File Systems.
systemd-udevd[1159]: starting version 215
         Starting Create Volatile Files and Directories...
[  OK  ] Reached target Remote File Systems.
         Starting Trigger Flushing of Journal to Persistent Storage...
         Starting LSB: Raise network interfaces....
[  OK  ] Started udev Kernel Device Manager.
[  OK  ] Started Create Volatile Files and Directories.
         Starting Update UTMP about System Boot/Shutdown...
         Starting Copy rules generated while the root was ro...
[  OK  ] Started Copy rules generated while the root was ro.
systemd-journald[1157]: Received request to flush runtime journal from PID 1
[  OK  ] Started Trigger Flushing of Journal to Persistent Storage.
[  OK  ] Started Update UTMP about System Boot/Shutdown.
[  OK  ] Found device /dev/ttyS0.
[  OK  ] Started LSB: Raise network interfaces..
[  OK  ] Reached target Network.
[  OK  ] Reached target System Initialization.
[  OK  ] Reached target Timers.
[  OK  ] Reached target Basic System.
         Starting Regular background program processing daemon...
[  OK  ] Started Regular background program processing daemon.
         Starting /etc/rc.local Compatibility...
         Starting getty on tty2-tty6 if dbus and logind are not available...
         Starting System Logging Service...
         Starting Permit User Sessions...
[  OK  ] Started /etc/rc.local Compatibility.
[  OK  ] Started Permit User Sessions.
[  OK  ] Started System Logging Service.
         Starting Getty on tty2...
[  OK  ] Started Getty on tty2.
         Starting Getty on tty1...
[  OK  ] Started Getty on tty1.
         Starting Serial Getty on ttyS0...
[  OK  ] Started Serial Getty on ttyS0.
[  OK  ] Started getty on tty2-tty6 if dbus and logind are not available.
         Starting Getty on tty6...
[  OK  ] Started Getty on tty6.
         Starting Getty on tty5...
[  OK  ] Started Getty on tty5.
         Starting Getty on tty4...
[  OK  ] Started Getty on tty4.
         Starting Getty on tty3...
[  OK  ] Started Getty on tty3.
[  OK  ] Reached target Login Prompts.
[  OK  ] Reached target Multi-User System.
[  OK  ] Reached target Graphical Interface.
         Starting Update UTMP about System Runlevel Changes...
[  OK  ] Started Update UTMP about System Runlevel Changes.

Debian GNU/Linux 8 arch-tx201 ttyS0

arch-tx201 login:

実は,Linuxカーネルを1からビルドして,rootfsも用意して正しく動いたのが初めてなので,すごく嬉しいです. やたー!