ARM boot

2013/10/19linux::ARMimport
kernel bootからの処理をみてみましょう。
kernel先頭へは、u-bootやbare-boxから飛んできます。

そこはそれ。wiki contentsとして記事を置いておきます。

ldのメモ

2013/10/15binutils::ldimport
documentをベースに、テキトウに伸ばしていく予定。
とりあえずは斜め読みの抜粋。

参照資料
The GNU linker ld (Sourcery G++ Lite 2011.03-41) Version 2.20.51

"3 Linker Scripts"

'-T'で独自のリンカスクリプトを適用することができます。
'--verbose'を付与しておけば、デフォルトlinker scriptを見ることができます。

"3.1 Basic Linker Script Concepts"

::
VMA
virtual memory address.仮想メモリアドレス。実行時に参照するべきアドレス。\一般的にはRAMになる。
LMA
load memory address.読み出されるアドレス。実行前にここからVMAへ転送する。(独自のscriptを作るなら自力転送?)\一般的にはROMになるだろう。RAMにロードしておいて、startup routineが走ることもありえるかもね..
objdump -hでセクションを見ることができる。

"3.2 Linker Script Format"

Linker scriptはテキストファイル。
コメントは "/* 〜 */"で。 "//"は使えないぽい?

"3.3 Simple Linker Script Example"

 SECTIONS
 {
   . = 0x10000;
   .text : { *(.text) }
   . = 0x8000000;
   .data : { *(.data) }
   .bss : { *(.bss) }
 }

"3.4 Simple Linker Script Commands"

"3.4.1 Setting the Entry Point"
エントリーポイント指定。上から順番?
とりあえず"start"シンボルを作っておく。
  • the ‘-e’ entry command-line option;
  • the ENTRY(symbol ) command in a linker script;
  • the value of a target specific symbol, if it is defined; For many targets this is start, but PE and BeOS based systems for example check a list of possible entry symbols, matching the first one found.
  • the address of the first byte of the ‘.text’ section, if present;
  • The address 0.

"3.4.2 Commands Dealing with Files"
::
INCLUDE filename
INPUT(file, file, ...) INPUT(file file ...)
GROUP(file, file, ...) GROUP(file file ...)
AS_NEEDED(file, file, ...) AS_NEEDED(file file ...)
OUTPUT(filename)
SEARCH_DIR(path)
STARTUP(filename)
"3.4.3 Commands Dealing with Object File Formats"
::
OUTPUT_FORMAT(bfdname) OUTPUT_FORMAT(default, big, little)
TARGET(bfdname)

"3.4.4 Assign alias names to memory regions"
REGIONのaliasを定義して、ユースケースごとに切り替えられるようにできるっぽい。
とりあえずパス。
"3.4.5 Other Linker Script Commands"
::
ASSERT(exp, message )
式(exp)が非ゼロであることを確認する。ゼロ出会った場合、linkerはエラーを吐いて終了する。
EXTERN(symbol symbol ...)
symbolを強制的に未定義とします。(・・・まだ、嬉しさがわからない)
コマンドラインの'-u'オプション相当。
FORCE_COMMON_ALLOCATION
コマンドラインの'-d'オプション相当。relocatable output fileが与えられたとしても、common symbolに割り当てるようにします。
INHIBIT_COMMON_ALLOCATION
コマンドラインの'--no-define-common'相当。non-relocatable output fileが与えられたとしても、common symbolへのアドレス割り当てを省略するようにします。
INSERT [ AFTER | BEFORE ] output_section
複数のscriptを混ぜるときに使えそう?例示されているので後で見る。[ToDo]
NOCROSSREFS(section section ...)
output sectionを並べておくと、そのsection間でシンボル解決が出来なかった場合にエラーを吐いて止まる。特定セクションに関数を閉じ込めていることを確認するのに使える、か。
OUTPUT_ARCH(bfdarch)
出力形式をセットする。BFD libraryで使われるmachine architectureを入れる。

"3.5 Assigning Values to Symbols"

"3.5.1 Simple Assignments"
こんなのが使える。
 symbol = expression ;
 symbol += expression ;
 symbol -= expression ;
 symbol *= expression ;
 symbol /= expression ;
 symbol <<= expression ;
 symbol >>= expression ;
 symbol &= expression ;
 symbol |= expression ;
"3.5.4 Source Code Reference"
script中の変数は、Cの変数に"_"を付与したシンボルが対応する。
当該シンボルは、以下のexport宣言により参照できる。この変数が、
scriptで代入されたアドレスにマッピングされる、と見れば良いので、
&演算子によってアドレスを参照する。
extern int foo;


"3.6 SECTIONS Command"

 SECTIONS
 {
   sections-command
   sections-command
   ...
 }
  • an ENTRY command (see Section 3.4.1 [Entry command], page 39)
  • a symbol assignment (see Section 3.5 [Assignments], page 45)
  • an output section description
  • an overlay description
"3.6.1 Output Section Description"
output sectionの定義は以下のとおり。全部入り。
section [address] [(type)] :
 [AT(lma)]
 [ALIGN(section_align)]
 [SUBALIGN(subsection_align)]
 [constraint]
 {
  output-section-command
  output-section-command
  ...
 } [>region] [AT>lma_region] [:phdr :phdr ...] [=fillexp]
output-section-commandには、Input Sectionを並べることになる。。
オブジェクト名、シンボル名、セクション名で引っ掛けて、それをsectionにまとめる。
fillexp... 空きエリアをfillexpで埋める?3.6.5の"FILL(0x90909090)"で埋めるとか。

"3.6.8.2 Output Section LMA"
"3.6.9 Overlay Description"
section typeのOVERLAYではなく、OVERLAYというsection。
LMA/VMAが同一の場合。

"3.7 MEMORY Command"

 MEMORY
 {
   name [(attr )] : ORIGIN = origin, LENGTH = len
   ...
 }
nameを定義して、有効範囲を決める。regionとしてsection閉じカッコの後ろに並べる。

"3.10"あたりに、scriptで使える式・関数(マクロ?)の解説あり。

2013/10/09(水)[ARM] コンパイラ

ARM Developer Suiteの独自仕様?

とあるソースコードを読むときに必要だったもの。昔にもコレ使った気がする。

既存のコードをそのままにして、サブクラス化してしまうもの。
要はオリジナル関数をスーパークラスとみなして、継承したサブクラスの実行にすり替える、というイメージか。
仮想関数よろしく、スーパークラスの呼び出しも可能となっています。
デバッグ用に関数を挿入したいとか、main()の手前に処理を追加したいとか、で、使えますね。

コンパイラがコレじゃないとダメですが…。

gccにも似たようなのってあるかな... shared libraryなら、LD_PRELOAD使えるわね。

※以下の資料を参照しました。

Document: "ARM DUI 0151A"
"ARM Developer Suite Version 1.2", "Linker and Utilities Guide"
Example 4-3
extern void ExtraFunc(void);
extern void $Super$$foo(void):

/* this function will be linked instead of the original foo() */
void $Sub$$foo(void)
{
  ExtraFunc();
  /* does some extra setup work */
  $Super$$foo(); /* calls the original foo function */
}

2013/10/06(日)[dbg] kernel panicネタ

togetterのまとめ、カーネルパラメータとお茶目なガチャピン先生より。
@frsyukiさんのconsole logから、ざっくりとメモリ枯渇の推定がなされる様子がわかります。

要約すると、SoftIrq中、kmalloc(,GFP_KERNEL)したときに、メモリが足りなかった、という事象です。
通常空間から呼ばれる場合は、page cacheを開放して秋メモリを確保したりもできるのでしょうが、
softirqからでは、それができない様子。呼び出し元でGFP_*を選択できると思うけれど、
呼び出し時のコンテキストによって、使って良いか、エラーになるかはあるはず。(要確認)

2013/10/06(日)apache/TLS

自己署名でTLSを使いたい場合の設定方法(作業メモ。詳細は検索して解説記事を...)

httpdに設定ファイルを食わせる

/etc/httpd/conf/ にファイルを作る

openssl genrsa -aes128 1024 > server.key
パス登録
openssl req -new -key server.key > server.csr
パス入力
openssl x509 -in server.csr -days 1461 -req -signkey server.key > server.crt
パス入力

Apache 起動時にパスフレーズの入力を省略する

mv server.key server.key.back
openssl rsa -in server.key.back > server.key

なにかのパッケージでMakefileが入ってくる(失念)

TLS-Root は /etc/pki/tls/ で、以下のMakefileがある。
/etc/pki/tls/certs/Makefile