bootloader の lib.c 関数を使うための os 側の ld.scr の変更

78 views
Skip to first unread message

queret...@gmail.com

unread,
Feb 4, 2019, 12:14:00 AM2/4/19
to KOZOS友の会
はじめまして。櫻井と言います。

「組み込みOS」初心者で、組み込みプログラミング(?)に興味があったので、この本を読みました。
「ROMに自作のプログラムを書き込んでそれを実行させる」は初めての経験で勉強になりました・なってます。すごく良い本だと思います。

少しだけ変更をしてみたので、それの報告です。

6章から source が、bootload と os の二つに分割されました。両方に lib.c があり、kzload と kozos の両方が puts などの関数を別々に持っているなと少し、気になりました。
12章まで読み終わって kozos 側から lib.o を抜いて、lib.c で定義されている関数は ROM にある関数を使う変更を考えてみました。

一つの方法として、os/Makefile, os/ld.scr を次のように変更して一応うまく行きました。
(Makefile.ori, ld.scr.ori は、12章 os directoryの下の変更前の Makefile と ld.scr です。)

     1 %

     2 % diff Makefile Makefile.ori

     3 17c17

     4 < OBJS += serial.o

     5 ---

     6 > OBJS += lib.o serial.o

     7

     8 % diff ld.scr ld.scr.ori

     9 7d6

    10 < romall(rx) : o = 0x000000, l = 0x080000

    11 18,34d16

    12 < /*

    13 <  * Define symbols for library functions from lib.c

    14 <  */

    15 < _memset = 0x00045e;

    16 < _memcpy = 0x000478;

    17 < _memcmp = 0x0004a0;

    18 < _strlen = 0x0004da;

    19 < _strcpy = 0x0004f4;

    20 < _strcmp = 0x000512;

    21 < _strncmp = 0x000544;

    22 < _putc = 0x000586;

    23 < _getc = 0x0005b4;

    24 < _puts = 0x0005e4;

    25 < _gets = 0x000608;

    26 < _putxval = 0x000642;

    27 < /* END library symbols definitions. */

    28 < 

    29

    30 % cd ../bootload

    31 % readelf -s kzload.elf | grep strcpy

    32 115: 000004f4    30 NOTYPE  GLOBAL DEFAULT    2 _strcpy

    33 %


os/Makefile から、lib.o を削除して、lib.o が、kozos にリンクされないようにしました。

ld.scr に、memset などのシンボルを定義しました。値は、kozload に定義されている値を使いました。(例えば strcpy の値は上の31行目のように readelf で調べます。環境によって、値は異なると思います。)


PS.

熱血ペン」も読もうと思います。


Reply all
Reply to author
Forward
0 new messages