minix_200 @Wiki
http://w.atwiki.jp/minix_200/
minix_200 @Wiki
ja
2005-10-31T17:20:20+09:00
1130746820
-
read_header()
https://w.atwiki.jp/minix_200/pages/6.html
a.outファイルのヘッダを読む関数<br>
<br>
[[strcut exec]] が良く分からない.<br>
<br>
引数ihdrは破壊的に更新される<br>
<br>
<br>
<br>
<br>
if (talk && !banner) {<br>
printf(" text data bss size ");<br>
banner= 1;<br>
}<br>
<br>
if (talk) {<br>
printf("%8ld%8ld%8ld%9ld %s ",<br>
phdr->a_text, phdr->a_data, phdr->a_bss,<br>
phdr->a_text + phdr->a_data + phdr->a_bss, proc);<br>
}<br>
以下のようにセグメントのサイズ表示される?<br>
<br>
text data bss size<br>
xxxx xxxx xxxx xxxx<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
以下全文<br>
void read_header(int talk, char *proc, FILE *procf,
structimage_header*ihdr)<br>
/* Read the a.out header of a program and check it. If procf happens to be<br>
* nil then the header is already in *image_hdr and need only be checked.<br>
*/<br>
{<br>
int n, big= 0;<br>
static int banner= 0;<br>
struct exec *phdr= &ihdr->process;<br>
<br>
if (procf == nil) {<br>
/* Header already present. */<br>
n= phdr->a_hdrlen;<br>
} else {<br>
memset(ihdr, 0, sizeof(*ihdr));<br>
<br>
/* Put the basename of proc in the header. */<br>
strncpy(ihdr->name, basename(proc), IM_NAME_MAX);<br>
<br>
/* Read the header. */<br>
n= fread(phdr, sizeof(char), A_MINHDR, procf);<br>
if (ferror(procf)) fatal(proc);<br>
}<br>
<br>
if (n < A_MINHDR || BADMAG(*phdr)) {<br>
fprintf(stderr, "installboot: %s is not an executable ", proc);<br>
exit(1);<br>
}<br>
<br>
/* Get the rest of the exec header. */<br>
if (procf != nil) {<br>
bread(procf, proc, ((char *) phdr) + A_MINHDR,<br>
phdr->a_hdrlen - A_MINHDR);<br>
}<br>
<br>
if (talk && !banner) {<br>
printf(" text data bss size ");<br>
banner= 1;<br>
}<br>
<br>
if (talk) {<br>
printf("%8ld%8ld%8ld%9ld %s ",<br>
phdr->a_text, phdr->a_data, phdr->a_bss,<br>
phdr->a_text + phdr->a_data + phdr->a_bss, proc);<br>
}<br>
total_text+= phdr->a_text;<br>
total_data+= phdr->a_data;<br>
total_bss+= phdr->a_bss;<br>
<br>
if (phdr->a_cpu == A_I8086) {<br>
long data= phdr->a_data + phdr->a_bss;<br>
<br>
if (!(phdr->a_flags & A_SEP)) data+= phdr->a_text;<br>
<br>
if (phdr->a_text >= 65536) big|= 1;<br>
if (data >= 65536) big|= 2;<br>
}<br>
if (big) {<br>
fprintf(stderr,<br>
"%s will crash, %s%s%s segment%s larger then 64K ",<br>
proc,<br>
big & 1 ? "text" : "",<br>
big == 3 ? " and " : "",<br>
big & 2 ? "data" : "",<br>
big == 3 ? "s are" : " is");<br>
}<br>
}<br>
<br>
<br>
2005-10-31T17:20:20+09:00
1130746820
-
make_image()
https://w.atwiki.jp/minix_200/pages/11.html
<br>
<br>
<br>
<br>
<br>
以下全文<br>
<br>
void make_image(char *image, char **procv)<br>
/* Collect a set of files in an image, each "segment" is nicely padded out<br>
* to SECTOR_SIZE, so it may be read from disk into memory without trickery.<br>
*/<br>
{<br>
FILE *imagef, *procf;<br>
char *proc, *file;<br>
int procn;<br>
struct image_header ihdr;<br>
struct exec phdr;<br>
struct stat st;<br>
<br>
making_image= 1;<br>
<br>
if ((imagef= fopen(image, "w")) == nil) {<br>
fatal(image);<br>
}<br>
<br>
for (procn= 0; (proc= *procv++) != nil; procn++) {<br>
/* Remove the label from the file name. */<br>
if ((file= strchr(proc, ':')) != nil)<br>
file++;<br>
else<br>
file= proc;<br>
<br>
/* Real files please, may need to seek. */<br>
if (stat(file, &st) < 0<br>
|| (errno= EISDIR, !S_ISREG(st.st_mode))<br>
|| (procf= fopen(file, "r")) == nil<br>
) fatal(proc);<br>
<br>
/* Read a.out header. */<br>
read_header(1, proc, procf, &ihdr);<br>
<br>
/* Scratch. */<br>
phdr= ihdr.process;<br>
<br>
/* The symbol table is always stripped off. */<br>
ihdr.process.a_syms= 0;<br>
ihdr.process.a_flags &= ~A_NSYM;<br>
<br>
/* Write header padded to fill a sector */<br>
bwrite(imagef, image, &ihdr, sizeof(ihdr));<br>
<br>
padimage(image, imagef, SECTOR_SIZE - sizeof(ihdr));<br>
<br>
/* A page aligned executable needs the header in text. */<br>
if (phdr.a_flags & A_PAL) {<br>
rewind(procf);<br>
phdr.a_text+= phdr.a_hdrlen;<br>
}<br>
<br>
/* Copy text and data of proc to image. */<br>
if (phdr.a_flags & A_SEP) {<br>
/* Separate I&D: pad text & data separately. */<br>
<br>
copyexec(proc, procf, image, imagef, phdr.a_text);<br>
copyexec(proc, procf, image, imagef, phdr.a_data);<br>
} else {<br>
/* Common I&D: keep text and data together. */<br>
<br>
copyexec(proc, procf, image, imagef,<br>
phdr.a_text + phdr.a_data);<br>
}<br>
<br>
/* Done with proc. */<br>
(void) fclose(procf);<br>
}<br>
/* Done with image. */<br>
<br>
if (fclose(imagef) == EOF) fatal(image);<br>
<br>
printf(" ------ ------ ------ -------\n");<br>
printf("%8ld%8ld%8ld%9ld total\n",<br>
total_text, total_data, total_bss,<br>
total_text + total_data + total_bss);<br>
}<br>
<br>
2005-10-31T16:05:53+09:00
1130742353
-
bread()
https://w.atwiki.jp/minix_200/pages/8.html
一文字だけFile fからlen
byte分だけ読み込んでbufに格納する。<br>
<br>
<br>
以下全文<br>
<br>
void bread(FILE *f, char *name, void *buf, size_t len)<br>
/* Read len bytes. Don't dare return without them. */<br>
{<br>
if (len > 0 && fread(buf, len, 1, f) != 1) {<br>
if (ferror(f)) fatal(name);<br>
fprintf(stderr, "installboot: Unsuspected EOF on %s ", name);<br>
exit(1);<br>
}<br>
}<br>
<br>
<br>
<br>
<br>
2005-10-31T15:51:50+09:00
1130741510
-
exec
https://w.atwiki.jp/minix_200/pages/10.html
構造体 exec<br>
<br>
<br>
struct exec {<br>
int e_cnt;<br>
char *e_vec[MAXARG];<br>
};<br>
<br>
2005-10-31T15:28:52+09:00
1130740132
-
basename()
https://w.atwiki.jp/minix_200/pages/9.html
引数 char* name<br>
<br>
返り値 char*<br>
<br>
<br>
<br>
static char base[IM_NAME_MAX];<br>
char *p, *bp= base;<br>
<br>
if ((p= strchr(name, ':')) != nil) {<br>
while (name <= p && bp < base + IM_NAME_MAX - 1) {<br>
*bp++ = *name++;<br>
}<br>
}<br>
<br>
↑"base" に "name"の':'までの左側をコピー?<br>
<br>
<br>
for (;;) {<br>
if ((p= strrchr(name, '/')) == nil) {<br>
p= name;<br>
break;<br>
}<br>
if (*++p != 0) break;<br>
*--p= 0;<br>
}<br>
'/'が見つかったらその左側を"p"が指す。なければ何もしない<br>
<br>
<br>
while (*p != 0 && bp < base + IM_NAME_MAX - 1) {<br>
*bp++ = *p++;<br>
}<br>
<br>
'/'が見つかったらその左がわを"base"にコピーする<br>
つまり':' から
'/'までを取り除いたものをbaseにに格納する。<br>
'/'がなければ何もしない。<br>
<br>
<br>
<br>
*bp= 0;<br>
return base;<br>
}<br>
<br>
語尾に'0'を付与して"base"返す。<br>
<br>
この関数は<br>
static char base[IM_NAME_MAX];<br>
を返す。staticなので普通のローカル変数と違って安心なはず。<br>
<br>
<br>
以下全文<br>
<br>
char *basename(char *name)<br>
/* Return the last component of name, stripping trailing slashes from name.<br>
* Precondition: name != "/". If name is prefixed by a label, then the<br>
* label is copied to the basename too.<br>
*/<br>
{<br>
static char base[IM_NAME_MAX];<br>
char *p, *bp= base;<br>
<br>
if ((p= strchr(name, ':')) != nil) {<br>
while (name <= p && bp < base + IM_NAME_MAX - 1) {<br>
*bp++ = *name++;<br>
}<br>
}<br>
for (;;) {<br>
if ((p= strrchr(name, '/')) == nil) {<br>
p= name;<br>
break;<br>
}<br>
if (*++p != 0) break;<br>
*--p= 0;<br>
}<br>
while (*p != 0 && bp < base + IM_NAME_MAX - 1) {<br>
*bp++ = *p++;<br>
}<br>
*bp= 0;<br>
return base;<br>
}<br>
<br>
<br>
<br>
2005-10-31T15:14:07+09:00
1130739247
-
image_header
https://w.atwiki.jp/minix_200/pages/7.html
<br>
<br>
<br>
#define IM_NAME_MAX 63<br>
<br>
struct image_header {<br>
char name[IM_NAME_MAX + 1]; /* Null terminated. */<br>
struct exec process;<br>
};<br>
2005-10-31T11:44:00+09:00
1130726640
-
stat()
https://w.atwiki.jp/minix_200/pages/5.html
stat()について<br>
ファイルの状態を取得する <span style="font-weight: bold;"><br>
<br></span><b>stat</b>(<b>const char *</b><i>path</i><b>, struct stat
*</b><i>buf</i><b>)</b> は <i>path</i>
で指定されたファイルの状態を取得して <i>buf</i>
へ格納する。<br>
<span style="font-weight: bold;"><b><br>
返り値<br></b></span>成功した場合は 0
を返す。エラーの場合は -1 を返し、 <i>errno</i>
に適切な値が設定される。<br>
<br>
http://www.linux.or.jp/JM/html/LDP_man-pages/man2/stat.2.html
2005-10-31T11:31:07+09:00
1130725867
-
bootimage.c
https://w.atwiki.jp/minix_200/pages/4.html
<br>
void report(char *label)<br>
/* installboot: label: No such file or directory */<br>
{<br>
fprintf(stderr, "installboot: %s: %s\n", label, strerror(errno));<br>
}<br>
<br>
void fatal(char *label)<br>
{<br>
report(label);<br>
exit(1);<br>
}<br>
<br>
上記はエラー関数<br>
<br>
2005-10-31T11:15:54+09:00
1130724954
-
トップページ
https://w.atwiki.jp/minix_200/pages/1.html
-ウィキはみんなで気軽にホームページ編集できるツールです。
-このページは自由に編集することができます。
-メールで送られてきたパスワードを用いてログインすることで、各種変更(サイト名、トップページ、メンバー管理、サイドページ、デザイン、ページ管理、等)することができます
■ 新しいページを作りたい!!
-ページの下や上に「新規作成」というリンクがあるので、それをクリックしてください。
■ 表示しているページを編集したい!
-ページ上の「このページを編集」というリンクや、ページ下の「編集」というリンクを押してください。
■ ブログサイトの更新情報を自動的に載せたい!!
-[[お気に入りのブログのRSSを使っていつでも新しい情報を表示できます。詳しくはこちらをどうぞ。>http://atwiki.jp/tools/blogrssmaker.html]]
■ ニュースサイトの更新情報を自動的に載せたい!!
-[[RSSを使うと簡単に情報通になれます、詳しくはこちらをどうぞ。>http://atwiki.jp/tools/rssmaker.html]]
■ その他にもいろいろな機能満載!!
-[[詳しくは、FAQ・初心者講座@wikiをみてね☆>http://www1.atwiki.jp/faq/]]
**分からないことは?
-[[@wikiの詳しい使い方はヘルプ・FAQ・初心者講座@wikiをごらんください。メールでのお問い合わせも受け付けております。>http://www1.atwiki.jp/faq/]]
-[[ユーザ同士のコミュニケーションにはたすけあい掲示板をご利用ください>http://bbs.atwiki.jp/]]
-要望・バグ・不具合報告はメールでお気軽にお問い合わせください。
2005-10-31T10:52:03+09:00
1130723523
-
メニュー
https://w.atwiki.jp/minix_200/pages/2.html
メニュー
-[[トップページ]]
-[[メニュー]]
-[[メニュー2]]
2005-10-31T10:52:03+09:00
1130723523