2007-01-01から1年間の記事一覧

ドライバのロードからprobeの実行まで

カーネルがドライバをロードすると、まずmodule_init()が実行される。module_init()はマクロであり、プリコンパイル後は以下のように展開される(pxa2xx-ac97ドライバの場合) static initcall_t __initcall_pxa2xx_ac97_init6 __attribute__( (__used__)) __a…

ashのコンパイルが出来ない。

同じ悩みの人がいた。 since glibc 2.1, file pointers to things like stdin, stdout, stderr, etc. don't seem to work anymore (in some situations). for example, in ash (mknodes.c:92) there is the line: FILE *infp = stdin; and the gcc error is:…

シグナルハンドラの継承

プログラムがexecされた時、シグナルハンドラは継承されない。また、シグナルの登録状況はSIG_IGN(無視)のもののみが継承され、他のシグナルはSIG_DFE(デフォルト)にリセットされる。一方、プロセスがforkされた時、子は親のシグナルハンドラと登録状況を継…

signal関数の使用例

#include #include "ourhdr.h" /* シグナルハンドラの定義 */ static void sig_usr(int signo) { if (signo == SIGUSR1) { printf("received SIGUSER1\n"); } else if (signo == SIGUSR2) { printf("received SIGUSER2\n"); } else { err_dump("received sig…

MTD(Memory Technology Device)

MTDは、メモリデバイス、特にフラッシュメモリを扱う為に、ハードウェアドライバと上位層(ファイルシステム等)との間に汎用インターフェースを提供するサブシステムである。ハードウェアドライバモジュールと上位層としてのユーザモジュールとの2種類のモジ…

ゾンビプロセスを生成しないテクニック

子プロセスが終了するのを待ちたくないし、かといって子プロセスをゾンビにしたくない場合、fork()を2度呼ぶ方法がある。 #include #include #include "ourhdr.h" int main(void) { int res; pid_t pid; pid_t ppid; pid = fork(); if (pid 0) { /* 子プロセ…

ゾンビプロセス

カーネルは、終了したプロセスに関する情報を保存しておき、プロセスの親がwait()やwaitpid()をcallした時にその情報を利用出来るようにする必要がある。必要最小限の情報は、プロセスID、終了状態、CPU時間である。親プロセス側からwait操作が行われること…

fork()とバッファリング

標準入出力のバッファリングには、行バッファリングと完全バッファリングがある。標準出力が端末に繋がっていると行バッファリングされ、それ以外の時は完全バッファリングされる。 下記のfork()の使用例では、標準出力に対して出力した場合、行バッファなの…

x86のブートプロセス

以下はGRUBでのx86のブートプロセスだが、やや曖昧な部分があるので、いずれ補完が必要だと思う。 電源投入後、CPUはシステムメモリの最後部を見てBIOSプログラムを探し、実行する。 BIOSは、システムをブートする有効なデバイス(CD-ROM, FDD, HDD等)を探す…

プログラムのメモリ配置

●textセグメント プログラムの命令群。 ●dataセグメント 初期化されたデータセグメント。初期化された変数を保持する。 ●bssセグメント 初期化されないデータセグメント。プログラムの開始前にカーネルによって0に初期化される。 アセンブラの"block started…

標準入出力のための短縮形ルーチン(代替関数)

短縮形 同義語 備考 =============================================================================================== getchar() fgetc(stdin), getc(stdin) gets(buf) fgets(buf, BUFSIZE, stdin) gets()は絶対に使用してはならない。 printf(args) fpr…

特殊装置ファイル(スペシャルデバイス)

lstat()で取得する情報のうち、st_devとst_rdevは混同しがちなので注意する。 #include #include #include "ourhdr.h" int main(int argc, char *argv[]) { int i; int res; struct stat buf; for (i = 1; i ファイルシステムのメジャー装置番号(ディス * ク…

nftw()

nftw()は、ファイルツリーを歩きまわる関数。以下が使用例。 #define _XOPEN_SOURCE 500 /* ftw.hのinclude前にdefineしなければならない */ #include #include #include #include #define ARG_MAX 50 /* 値に根拠は無い。もっと小さくても良いはず。 */ sta…

スティッキービット

スティッキービット(S_ISVTXビット)は本来、プログラムの実行速度を向上させることを目的として使用されていた。実行可能プログラムでこのビットがオンであると、最初にプログラムを実行した時、プロセスが終了してもプログラムのテキスト領域はスワップファ…

ファイルの種類

lstat()とPOSIXマクロを使用して、コマンド行の各引数のファイルの種類を出力するプログラム。lstat()を使用しないと、シンボリックリンクを検出できない。 #include #include #include "ourhdr.h" int main(int argc, char *argv[]) { char *ptr; int i; in…

gcore

GDB

実行中のプロセスのcoreダンプを取得するスクリプト。メイン処理は↓ ulimit -cがゼロでも出力されるみたい。 /usr/bin/gdb > /dev/null gcore $name.$pid detach quit EOF

dup2()

dup2()はファイルディスクリプタを複製する。 #include #include "ourhdr.h" int main(int argc, char *argv[]) { int fd; /* 引数のチェック */ if (argc != 2) { err_quit("a single argument (the file name) is required"); } /* ファイルをオープンして…

fcntl()

fcntl()は、オープンしているファイルの属性を変更することが出来る。以下は指定したディスクリプタのファイル状態フラグを出力するプログラム。 #include #include #include "ourhdr.h" int main(int argc, char *argv[]) { int accmode; int val; int n; i…

3.1 標準入力がシーク可能かどうか調べる

#include #include "ourhdr.h" int main(void) { off_t res; /* 現在の位置から0バイトシークすることにより、カレントオフセットを取得する。 * lseek()はパイプやFIFOを参照するファイルディスクリプタに対しては-1を返し * てerrnoを設定する。 */ res = …

1.6 エラー処理関数

標準Cにはエラー処理関数としてstrerror()とperror()が用意されている。 #include #include #include #include int main(int argc, char *argv[]) { char *msg; msg = strerror(EACCES); fprintf(stderr, "ENOENT: %s\n", msg); errno = EACCES; perror(argv…

mallo()とsbrk()

sbrk()はメモリ割付を処理する。sbrk()はプロセスのデータ空間を指定したバイトだけ増やす。新たなメモリ空間をどのように管理するかは、プロセスの責任である。malloc()は1つの割付方式を実現する。malloc()を使用せず、sbrkを用いた独自のメモリ割付アルゴ…

1.5 標準入力からコマンドを読み込み実行する

シェルの骨格となるプログラム。 #include #include #include "ourhdr.h" int main(void) { char buf[MAXLINE]; pid_t pid; int status; printf("%% "); /* 標準入力から一度に1行読み込む。ファイルの終了文字(Control-D)をタイプする * とfgetsはNULLポイ…

1.2 標準入力から標準出力へコピーする

#include "ourhdr.h" #define BUFFSIZE 8192 int main(void) { int n; char buf[BUFFSIZE]; while ( (n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0) { if (write(STDOUT_FILENO, buf, n) != n) { err_sys("write error"); } } if (n

1.1 ディレクトリ内のすべてのファイルをリストする

#include #include #include "ourhdr.h" int main(int argc, char *argv[]) { DIR *dp; struct dirent *dirp; if (argc != 2) { err_quit("a single argument (the directory name) is required"); } /* ディレクトリストリームをオープンする */ if ( (dp =…

プログラムとプロセス

プログラム ディスクファイルに収められた実行可能ファイルのこと。6つあるexec()のうちの1つを呼出すとカーネルはプログラムをメモリへ読み込む。 プロセス プログラム実行中のインスタンスをプロセスと呼ぶ。

常用.gdbinit

GDB

set history save on set history size 10000 set history filename ~/.gdb_history set print pretty on set print static-members off set charset ASCII

system()

C

以下が使用例。system()の返り値はwait()で定義されているフォーマットで帰ってくるので、wait.hで定義されているマクロを使用して検査するのがポイント。 #include #include int main(void) { int i; int stat[3]; int stat2[3]; char *command[] = { "ping…

yumで最新版のソースファイルをダウンロードする

# yum install yum-utils # yum search yum | grep 2.6.1-0 yum.noarch 2.6.1-0.fc5 updates ←リポジトリはupdates # yumdownloader --enablerepo=updates-source --source yum

メッセージ

IPC

System V IPCの一つ。取り扱うデータにタグを指定でき、受信する際に指定したタグを持つデータを取り出せる。ただし利用されている例はあまり無いらしい。 メッセージキューはカーネル内部に保存したメッセージのリンクトリストである。単にキュートも呼ばれ…

標準定義シンボルの確認

gcc

gcc -v -E - gcc -dM -E - gcc 4)