2013/07/20(土)[CMD] stty

シリアルコンソールが狭い

defaultでは、80x25の表示領域として振る舞うようだ。
vimやlessコマンドを入れた場合に、その大きさが把握できるハズ。

実際にコードを編集する際に手狭に感じるので、コレを大きくしたい。
検索してみると、次のコマンドが使えることが判った。
STTY(1) : stty - change and print terminal line settings
bash上では、環境変数にも見当たらず、sttyコマンドで設定値を
見れば反映されていることが判る。
どこにどういう形式で保存されているか、は、把握しておきたい所ではある。
でも実際にアプリ開発などでブチ当たるまでは調査保留で...
$ stty rows 40; columns 120;
$ stty -a
speed 115200 baud; rows 40; columns 120; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q;
stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon -iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

[ARM] kernel先頭から。その1

2013/07/17Linux::ARMimport

ARMv7 ARCHのARMから...

MPcoreから追加されている話も新規として扱います. 脳内はARM928EJ-Sあたりで停止していましたので..
メモリ空間の属性は、
  • ストロングリオーダ(Strongly ordered)
  • ノーマル()\メモリ属性は以下がある。
    • (Outer Shareable)
    • (Inner Shareable)
    • (Non shareable)
  • デバイス
    • (shareable)
    • (Non shareable)
ここでいうshareは、プロセッサ間で共有アクセスの有無を示す。
Outer/Inter sharebleの差異は、Outerが実装定義でレベルをつけたアクセス制御が入るらしい???
A3-27あたりからatomic accessに関する記載がある。

mm初期化処理を追う... ために, kernel起動先頭から少し追ってみる.

vmlinuxをdisasすると entry pointが "stext"なのがわかる.*1
entry pointには、以下のコメントがあり、展開される位置、状態、レジスタ値について記載がある。

・・・どのみちすぐにldscript読まなあかんかった。
FILE:arch/arm/kernel/vmlinux.lds
 .init.pv_table : {
  __pv_table_begin = .;
  *(.pv_table)
  __pv_table_end = .;
 }

 Kernel startup entry point.
 ---------------------------

 This is normally called from the decompressor code.  The requirements
 are: MMU = off, D-cache = off, I-cache = dont care, r0 = 0,
 r1 = machine nr, r2 = atags or dtb pointer.

 This code is mostly position independent, so if you link the kernel at
 0xc0008000, you call this at __pa(0xc0008000).

 See linux/arch/arm/tools/mach-types for the complete list of machine
 numbers for r1.

 We're trying to keep crap to a minimum; DO NOT add any machine specific
 crap here - that's what the boot loader (or in extreme, well justified
 circumstances, zImage) is for.
	/*
	 * r1 = machine no, r2 = atags or dtb,
	 * r8 = phys_offset, r9 = cpuid, r10 = procinfo
	 */
	bl	__vet_atags			// ゴミデータなら r2=NULL と修正される。
#ifdef CONFIG_SMP_ON_UP
	bl	__fixup_smp
#endif
#ifdef CONFIG_ARM_PATCH_PHYS_VIRT //enable
	bl	__fixup_pv_table	//
#endif
	bl	__create_page_tables
kernel imageがロードされた物理アドレス と kernel空間を設置しようとしている論理アドレス、との
アドレス値の差分を r8に計算、保持する。
__fixup_pv_tableを呼び出して、"arch/arm/include/asm/memory.h"で定義した関数・マクロの
論理ー物理変換関数が参照する変数を書き換える。
ロード位置が固定されていればいらないのかもしれないけれど,headの記述からするとそうもいかんような.
このheadは展開後のkernel start位置なので、compressed kernelの先頭は別のところ。*2

*1 : 本当は順序建てて ldscriptから..のほうがいいけれど, この手順でやってもうたので、こう記しておく。

*2 : たぶん、これだけど、未検証:arch/arm/boot/compressed/head.S

2013/07/14(日)LInux開発入門(外部URL参照)

初学者のためのLinux起動シーケンス概要

題名はもっともらしいですが、とりあえずURL貼っておくだけで。。。
Linux kernelが起動するまで、と、起動してからユーザランドに渡るまで、
ユーザランドの起動処理、くらいに分類できるかな、と思います。
最後のユーザランド起動処理の手前までは、Androidも一緒でしょう。(未確認)

京都マイクロコンピュータ様のblogリンクが多いのは、それを見てまとめておこうと感じたからです(^^;
他にもネタが出てきたら追加しいこうと思います。オレオレメモってやつですね(ぉ

起動シーケンス(uboot/barebox)

ちょうどこの切り替わりに遭遇していました。
昔からのマイコンは、外部メモリからbootしていましたよね。
ワンタイムROM、UVEPROM、EEPROM・・・と来ていますね。

昨今は原低のため、外部記憶にSD card/NAND Flashのみという構成を取るようになってきているので、
SoC内のMaskROMに埋め込まれているbootloaderから起動してくれます。
このへんの設定は、SoC次第ですし、boot modeでNORからの起動するようなものもいます。
かならずMaskROMからしか起動しないのもきた気がする。
U-bootのデバッグ

ユーザランドの処理(Linux版)

initrd有効の場合は、initramの/linuxrcから起動したはず。
process id=1として、最初に起動されるのは、kernel parameterにinit=で指定したもの、
それがなければ、/sbin/initの順にチェックして、rootfsがmount出来なかったり、init実行ファイルが
なければ、OOPS吐いて止まります。ポーティング作業とか疲れてくるとよく見かけます(謎

ユーザランドの処理(Android版)

Androidのinit処理の流れ。Linuxの普通?のinitとはフローが違うので参考に。
いきなり渡されて流用できるとは思っていなかったからなぁ。こちらと別のblogを参考にさせていただいた記憶が…。
Androidのinit

その他紹介したい記事

「組み込みエンジニアのためのLinux入門 仮想メモリ編」

kernel documentも見ておきましょう。最後はソースコードが正義です。。