FromNandの日記

自分的備忘録

リンカスクリプトの頻出コマンド

詳しいことは「https://sourceware.org/binutils/docs/ld/Simple-Commands.html#Simple-Commands」におまかせ

 

OUTPUT_FORMAT(output_mode)

出力バイナリのフォーマット

 

OUTPUT_ARCH(arch)

対象のアーキテクチャを指定

「objdump -help」で対応するアーキテクチャを調べることができる?

 

INPUT(filename, filename, filename...)

コマンドラインに置いて何度も使用され、いちいち指定するのが面倒な場合はリンカスクリプトで「INPUT」というキーワードを使用することで補うことができます。

例えば「main.o」というオブジェクトファイルをリンカの対象ファイルに含めたい場合は「INPUT(main.o)」と記述します

 

OUTPUT(filename)

リンカの出力ファイル名を指定します

これは、リンカにおける「-o filename」と全くの同様です

 

STARTUP(filename)

STARTUPコマンドでは、コマンドラインで1番はじめにfilenameが指定されること以外においてはINPUTコマンドと同じです。

これは、エントリポイントが常に最初のファイルの先頭であるシステムを使用する場合に便利です

 

 

SEARCH_DIR(pass)

これは、リンカの実行において指定したファイルが同じ現在のディレクトリにない場合に検索するディレクトリを指定します

-Lオプションと同じ働きをします

 

ENTRY(function_name)

エントリーポイントを指定します

これは-eオプションと同等です

 

PROVIDE(var_name = num)

var_name(変数名)の変数をweakシンボルで生成します

 

LOADADDR(section_name)

LOADADDR() は括弧で囲まれたセクションの一時配置先(AT >)アドレスを値で返す

つまり、物理アドレスを返すということ

 

ADDR(section_name)

ADDR() は括弧で囲まれたセクションの配置先( >)アドレスを値で返す

つまり、仮想アドレス(実際に動作するアドレス)を返すということ

 

LENGTH(memory_rabel)

LENGTH() は括弧で囲まれた MEMORY 内の領域の LENGTH を値で返す

 

ORIGIN(memory_rabel)

ORIGIN() は括弧で囲まれた MEMORY 内の領域の ORIGIN アドレスを値で返す

【自作OS】CD・USBブートについて

【CDブート】

OSイメージを用意して、それをfdtoisoなどのツールでiso形式に変える。

次に、そのisoをBurnAwareなどのツールでCDに書き込む。

 

【USBブート】

Windows10の上でUbuntuの環境を構築しているのですが、bsコマンドでうまく書き込めないことがあるので、USBへの書き込みツールはWindowsrufusを使用する。

まず「https://trycatchand.blogspot.com/2013/08/create-bootable-usb-memory-disk.html」を参考にして、USBをフォーマットする。

そして、OSのイメージをrufusを使って書き込む。

書き込みツールにはbooticeとかもあるけど、これは使えない時があったりしてよくわからなかった。

【x86アセンブリ】よく使うアセンブリと機械語の対応表

細かい部分はOnline x86 and x64 Intel Instruction Assemblerで調べると良い

 

【CALL】

CALL(near) - FF m32
CALL(far) - FF m16:32

 

【LEAVE・RET】

LEAVE - 0xc9

RET(near) - 0xc3

RET(far) - 0xcb

 

【PUSH系】

PUSH EAX - 0x50

PUSH ECX - 0x51

PUSH EDX - 0x52

PUSH EBX - 0x53

PUSH ESP - 0x54

PUSH EBP - 0x55

PUSH ESI - 0x56

PUSH EDI - 0x57

 

【POP系】

POP EAX - 0x58

POP ECX - 0x59

POP EDX - 0x5a

POP EBX - 0x5b

POP ESP - 0x5c

POP EBP - 0x5d

POP ESI - 0x5e

POP EDI - 0x5f

 

【ALL PUSH・POP】

PUSHA - 0x60

POPA - 0x61

 

【gdb】ブレークポイントをアドレス指定で仕掛ける方法

gdbでアドレスを指定してブレイクポイントを仕掛けるには、先頭に「*」を付ける必要があるみたいです。

>> break *0x8049370

 

次のようにすると、行番号を指定したと思われるようです(多分...)

もちろん、こんなに大きな数の行番号が指定されるととっくにプログラムは終了していますので、ブレイクポイントが引っかからずに終了します。

>> break 0x8049370

 

breakの後に指定できるものは大きく分けて4つあるみたいです。

  • 関数名
  • 行番号
  • 現在停止している場所から前後に何行か隔てた場所
  • アドレス

 

例えば、次のような方法でブレイクポイントを設定できます。

(gdb)break main 
(gdb)break 19
(gdb)break +offset 
(gdb)break *adress
(gdb)break test.c::20
(gdb)break test.c::func名

誘導起電力、逆起電力とは

モーターの回路を設計していると言葉の意味が分からなかったのでまとめる。

 

誘導起電力とは、モーターに電流が流れているかどうかは一切関係なく、モーターが磁界の中で回転しているだけで電源の電流とは逆向きの方向に電流を流そうとする性質がある。

逆起電力とは、電源のスイッチを入れたその瞬間、モーター内の電流の状態が変化しようとすることでそれをさせまいとする方向に磁界が生じ、それによって(右ねじの法則?)電源と逆の働きをしようとする現象のこと。

ここで注意したいのが、逆起電力は電源の電流の向きと逆に発生するのではないということである。

逆の働き、つまり電源が電流を流そうとすれば流さないように、電源が電流を流すのをやめようとすれば流そうとする。

 

なぜパスコンの足は短く切らないといけないのか

1.抵抗になるから

2.単純に邪魔だから

3.ノイズを拾うから

4.足が曲がったりしてショートするかもしれないから

 

こんな理由があるらしいです。

あと、バックアップコンデンサー(電力供給用)というのもあるらしくて

これでも結局は足が短いに越したことはないと思います。

リアクタンスとかインピーダンスとか

レジスタンス 抵抗器の抵抗値のこと

リアクタンス コイルとかコンデンサの抵抗値のこと

インピーダンス 上の二つを合わせたもの。上の二つの単位をx軸と虚数軸にとって絶

        対値で大きさを表す。

インダクタンス 誘導という言葉の派生語。誘導電流の公式の係数にあった。

キャパシタンス コンデンサの静電容量のこと。

 

リアクタンスやインダクタンスについてはわかりやすいサイトがあった。

コイルについても一緒に学べるハッピーセット

インダクタンスとリアクタンス―コイルの性質と作用 - リタール BLOG