���Υڡ��� ���Υڡ��� �ܼ���

3. �Х���ݡ���

Linux �� SCSI ��ȯ�Ԥ����ϡ��Ť������ɤ��äƤ����Ƥ���Ȥϸ¤�ޤ��� �������äơ���꡼�����줿�ǿ��� Linux �����ͥ�ʳ��Ǥ� (MCC��SLS�� Yggdrasil �ʤɤΥѥå������Ϻǿ������ͥ뤫��1�Ĥ���12�Ĥ�Ť���礬 ����ޤ�) �����褬�Բ�ǽ�ʾ�礬����ޤ��� �Ǥ����顢�Х���ݡ��Ȥ��������ˡ���꡼�����줿�ǿ��Υ����ͥ�Ǥ� �������꤬�����뤫�ɤ����Τ���Ʋ�������

�����ͥ��С�����󥢥åפ�����Ǥ⡢�ޤ�����ʸ���褯�ɤ����Ǥ⡢ �ޤ��Х���¸�ߤ���ȿ���������ˤϡ�Linux �᡼��� �ꥹ�Ȥ� SCSI ����ͥ�˥Х���ݡ��Ȥ����äƤ��������� �����ˤ� Linux SCSI �ɥ饤�Фκ����˶��Ϥ��Ƥ���¿���ο͡������ä��Ƥ��ޤ���

�Х���ݡ��Ȥˤϡ� �ϡ��ɥ������������֡��Ȼ��� Linux ��ɽ���������Τʥ�å������� ���顼��ȯ�������硢����˥��顼��¸�ߤ��륽���������ɤΰ��� �ʤɡ��ʤ�٤�¿���ξ����񤤤Ƥ��������� ��å������μ��� �� <tt>panic()</tt> �ΰ��֤����ꤹ�� �˵��Ҥ���Ƥ����³���˽��äƤ���������

����¤ξ����󶡤���ʤ��ȡ���ȯ�Ԥ��������äƿ��Ǥ����ꡢ ¾������������뤳�Ȥ������פ���Ƚ�Ǥ��뤳�ȤˤʤäƤ��ޤ����� ����ޤ���

�פ���ˡ��桹���Х���Ƹ������뤳�Ȥ��Ǥ��ʤ���硢 �ɤ������������Τ������Ū�˻�Ŧ���Ƥ���ʤ���С� �Х��������뤳�ȤϤǤ��ʤ��Ȥ������ȤǤ���

3.1 ��å������μ���

�����ͥ��å����������󥰥����ƥ��¹Ԥ��Ƥ��ʤ����:

/proc �ե����륷���ƥब�ޥ���Ȥ���Ƥ��뤳�Ȥ�Τ���� ����������

grep proc /etc/mtab

/proc �ե����륷���ƥब�ޥ���Ȥ���Ƥ��ʤ���С��ޥ���� ���Ƥ���������

mkdir /proc
chmod 755 /proc
mount -t proc /proc /proc

�����ͥ�ΥС������ȥ�å�����������ե�����˥��ԡ����ޤ���

cat /proc/version > /tmp/log
cat /proc/kmsg >> /tmp/log

1�ä���2�ø�� CNTRL-C ���ǤäƤ���������

�����󥰥����ƥ��¹Ԥ��Ƥ����硢Ŭ���ʥ����ե����� (�����ե������ ����� /etc/syslog.conf �ˤ���ޤ�) ���������� dmesg ���ޥ�ɤ���Ѥ��Ƥ���������

Linux ����ư���Ƥ��ʤ���硢DOS ��ǥե��åԡ��ǥ�������ե����ޥå� ���Ƥ���������RAM �ɥ饤�֤ǤϤʤ����롼�ȥǥ������åȤ�ľ�ܥޥ���� ����ѥå�������ȤäƤ�����ˤϡ��롼�ȤȤ��ƥޥ���Ȥ����ɥ饤�� �ʳ����ɤ߽񤭲�ǽ�ʥǥ������åȤ��Ѱդ��뤫�� ramdisk �֡��ȥ��ץ����λ��Ѥ�ɬ�פǤ��뤳�Ȥ� ���դ��Ʋ�������

Linux ��ѥå������Υ֡��ȥե��åԡ�����֡��Ȥ��ޤ����Ǥ���Х��󥰥� �桼���⡼�ɤ� RAM �ɥ饤�֤�롼�ȤȤ��ƥޥ���Ȥ��Ƥ��������������ơ�

mkdir /tmp/dos

�Ȥ������ä��ե����ޥåȤ����ǥ������åȤ����������ޥ���Ȥ��Ƥ���������

mount -t msdos /dev/fd0 /tmp/dos

���뤤��

mount -t msdos /dev/fd1 /tmp/dos

�Ȥ��ޤ���

�����ե������ե��åԡ��˥��ԡ����ޤ���

cp /tmp/log /tmp/dos/log

DOS �ե��åԡ��򥢥�ޥ���Ȥ��ޤ���

umount /tmp/dos

������ Linux �򥷥�åȥ����󤷤ޤ���

shutdown now

��֡��Ȥ��� DOS ��ư�������ߤ��̿����եȤ�Ȥäƥ����ե������ �᡼�뤷�Ƥ���������

3.2 panic() �ΰ��֤����ꤹ��

¾�� Unix ��Ʊ���褦�ˡ�Linux ����̿Ū�ʥ��顼��������ȥ����ͥ�� panic() �ؿ���ƤӽФ��ޤ���¾�� Unix �Ȥϰ�äơ�Linux �� �����򥹥�åפ��뤤�ϥ���ץǥХ����˥���פ��Ƽ�ưŪ�˥�֡��� ���뤳�ȤϤ���ޤ��󡣤������ꡢ�桼������ǽ񤭼̤����Ȥ��Ǥ��� �褦��ͭ�Ѥʥ��ơ��Ⱦ���Υ��ޥ꤬ɽ������ޤ���

Unable to handle kernel NULL pointer dereference at virtual address c0000004
current->tss,cr3 = 00101000, %cr3 = 00101000
*pde = 00102027
*pte = 00000027
Oops: 0000
EIP:    0010:0019c905
EFLAGS: 00010002
eax: 0000000a   ebx: 001cd0e8   ecx: 00000006   edx: 000003d5
esi: 001cd0a8   edi: 00000000   ebp: 00000000   esp: 001a18c0
ds: 0018   es: 0018   fs: 002b   gs: 002b   ss: 0018
Process swapper (pid: 0, process nr: 0, stackpage=001a09c8)
Stack: 0019c5c6 00000000 0019c5b2 00000000 0019c5a5 001cd0a8 00000002 00000000
       001cd0e8 001cd0a8 00000000 001cdb38 001cdb00 00000000 001ce284 0019d001
       001cd004 0000e800 fbfff000 0019d051 001cd0a8 00000000 001a29f4 00800000
Call Trace: 0019c5c6 0019c5b2 0018c5a5 0019d001 0019d051 00111508 00111502
            0011e800 0011154d 00110f63 0010e2b3 0010ef55 0010ddb7
Code: 8b 57 04 52 68 d2 c5 19 00 e8 cd a0 f7 ff 83 c4 20 8b 4f 04
Aiee, killing interrupt handler
kfree of non-kmalloced memory: 001a29c0, next= 00000000, order=0
task[0] (swapper) killed: unable to recover
Kernel panic: Trying to free up swapper memory space
In swapper task - not syncing

EIP: �Ԥ�16�ʿ� (���ξ�� 19c905) ���α�ᡢ /usr/src/linux/zSystem.map ��õ���Ƥ��Υ��ɥ쥹�ʲ��ǺǤ��礭�� �����򸫤Ĥ��Ƥ���������

0019a000 T _fix_pointers
0019c700 t _intr_scsi
0019d000 t _NCR53c7x0_intr

����ˤ�äƤɤδؿ���¹���� panic() ���ƤФ줿����ʬ����ޤ��� ���δؿ���ޤॽ�����ե������ǥХå����ץ����Ĥ��ǥ���ѥ��뤷ľ������ /usr/src/linux/Makefile ���Խ����� -g ���ץ����� CFLAGS ��������ɲä��ƥ����ͥ����Τ򥳥�ѥ��뤷ľ���Ƥ���������

#
# standard CFLAGS
#

�Ĥޤꡢ���ιԤ�

CFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe

���Τ褦���ѹ����ޤ���

CFLAGS = -g -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe

�����ͥ��ƹ��ۤ��ޤ���

make clean
make

/etc/lilo.conf �˥���ȥ��������ƥ����ͥ��֡��ȤǤ���褦�� ���ޤ���

image = /usr/src/linux/zImage
label = experimental

������ root �� LILO ��Ƽ¹Ԥ��뤫���֡��ȥե��åԡ���������ޤ���

make zImage 

��֡��Ȥ������顼ȯ������ EIP ��Ͽ���ޤ���

script �����󥹥ȡ��뤵��Ƥ����硢�����ư���� �ʲ��ΥǥХå��ε�Ͽ�򥿥��ץ�����ץȥե�����˵�Ͽ���� �����Τ��ɤ��Ǥ��礦��

���Τ褦�� gdb ��¹Ԥ��ޤ���

gdb /usr/src/linux/tools/zSystem

�����Ƽ��Τ褦�����Ϥ��ޤ���

info line *<your EIP>

�㤨�аʲ��Τ褦�ˡ�

info line *0x19c905

������Ф��� gdb �ϼ��Τ褦�ʾ������Ϥ��ޤ���

(gdb) info line *0x19c905
Line 2855 of "53c7,8xx.c" starts at address 0x19c905 <intr_scsi+641&>
   and ends at 0x19c913 <intr_scsi+655>.

���ξ����Ͽ���Ʋ����������줫��ʲ��Τ褦�����Ϥ��ޤ���

list <line number>

���Τ褦�ʽ��Ϥ�������Ǥ��礦��

(gdb) list 2855
2850    /*      printk("scsi%d : target %d lun %d unexpected disconnect\n",
2851                host->host_no, cmd->cmd->target, cmd->cmd->lun); */
2852            printk("host : 0x%x\n", (unsigned) host);
2853            printk("host->host_no : %d\n", host->host_no);
2854            printk("cmd : 0x%x\n", (unsigned) cmd);
2855            printk("cmd->cmd : 0x%x\n", (unsigned) cmd->cmd);
2856            printk("cmd->cmd->target : %d\n", cmd->cmd->target);
2857            if (cmd) {;
2858                abnormal_finished(cmd, DID_ERROR << 16);
2859            }
2860            hostdata->dsp = hostdata->script + hostdata->E_schedule / 
2861                sizeof(long);
2862            hostdata->dsp_changed = 1;
2863        /* SCSI PARITY error */
2864        } 
2865
2866        if (sstat0_sist0 & SSTAT0_PAR) {
2867            fatal = 1;
2868            if (cmd && cmd->cmd) {
2869                printk("scsi%d : target %d lun %d parity error.\n",

quit �����Ϥ��� gdb ����ȴ���ޤ���

��ξ���⵭Ͽ���Ƥ�����������ȯ�ԤΥ����ͥ뤬���ʤ��Υ����ͥ�Ȱ�ä� ���������Ω�ĥ���ƥ����Ⱦ��������ޤ���


���Υڡ��� ���Υڡ��� �ܼ���