Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
$B%7%9%F%`%3!<%k$H(BLinux$B%+!<%M%k$N%=!<%9(B
[go: Go Back, main page]

$B%7%9%F%`%3!<%k$H(BLinux$B%+!<%M%k$N%=!<%9(B

					2010$BG/(B12$B7n(B07$BF|(B
$B>pJs2J3XN`(B $B%*%Z%l!<%F%#%s%0%7%9%F%`(B II

                                       $BC^GHBg3X(B $B%7%9%F%`>pJs9)3X8&5f2J(B 
                                       $B%3%s%T%e!<%?%5%$%(%s%9@l96(B, $BEE;R!&>pJs9)3X7O(B
                                       $B?7>k(B $BLw(B
                                       <yas@is.tsukuba.ac.jp>

$B$3$N%Z!<%8$O!" http://www.coins.tsukuba.ac.jp/~yas/coins/os2-2010/2010-12-07
$B$"$k$$$O!" http://www.coins.tsukuba.ac.jp/~yas/
http://www.cs.tsukuba.ac.jp/~yas/

$B"#O"Mm;v9`(B

Softlab $B8&5f<<>R2p(B

$B"#:#F|$NBg;v$JOC(B

$B"!;29M=q(B

Robert Love: "Linux Kernel Development", Addison-Wesley Professional (2010). ISBN-13: 9780672329463

Claudia Salzberg Rodriguez, Gordon Fischer, and Steven Smolski: "The Linux Kernel Primer: A Top-Down Approach for x86 and PowerPC Architectures", Prentice Hall (2005). ISBN-10: 0131181637

Daniel P. Bovet, Marco Cesati $BCx(B, $B9b66(B $B9@OB(B ($B4FLu(B), $B?yED(B $BM3H~;R(B, $B@6?e(B $B@5L@(B , $B9b?y(B $B>;FD(B , $BJ?>>(B $B2mL&(B , $B0B0f(B $BN49((B($BLu(B) $B>\2r(B Linux$B%+!<%M%k(B $BBh(B3$BHG(B $B%*%i%$%j!

Jonathan Corbet, Alessandro Rubini, Greg Kroah-Hartman ($BCx(B), $B;3:j(B $B9/9((B , $B;3:j(B $BK.;R(B , $BD986(B $B9(<#(B , $BD986(B $BM[;R(B($BLu(B): "Linux$B%G%P%$%9%I%i%$%P(B", $B%*%i%$%j!<%8%c%Q%s(B (2005). ISBN-13: 978-4873112534

$B"#%*%Z%l!<%F%#%s%0%7%9%F%`(BII

$B"!$3$N

$B%5!<%P$K$O!"(Bssh $B$G%m%0%$%s$7$F;H$&!#(B

$B"#%7%9%F%`!&%3!<%k$H%i%$%V%i%j(B

$B%7%9%F%`!&%3!<%k$H%i%$%V%i%j$O!"%W%m%0%i%^$K$H$C$F$N%*%Z%l!<%F%#%s%0!&(B $B%7%9%F%`!#6&DLE@$O!"N>J}$H$b!"#C8@8l$+$i$O!"4X?t8F=P$7$N7A$G;H$($k$3$H!#(B 2$B$D$r9g$o$;$F!"(BAPI (Application Programming Interface) $B$H$b8@$&!#(B

$B"!(BOS$B$N9=B$(B

$B?^(B? 3$BAX!

$B?^(B? OS$B$N9=B$(B

$B%W%m%0%i%`!&%3!<%I$N>l=j(B

$B"!%7%9%F%`!&%3!<%k$N%i%$%V%i%j$N0c$$(B

$B%7%9%F%`!&%3!<%k(B(system call) $B%i%$%V%i%j(B(library)

$B%7%9%F%`%3!<%k$NNc!'(B

$B%i%$%V%i%j$NNc!'(B

$B%7%9%F%`%3!<%k$H%i%$%V%i%j$N8+J,$1J}!J(BUnix$BJT!K(B

$BF1$8(BUnix$B7O(BOS$B$G$b!":Y$+$$=j$G%7%9%F%`!&%3!<%k$H%i%$%V%i%j$,F~$lBX$o$C$F(B $B$$$k$3$H$b$"$k!#(B

$B%7%9%F%`!&%3!<%k$O!"%H%i%C%WL?Na!J(Btrap instruction$B!K$r4^$`!#(B $B$=$NItJ,$O!"%"%;%s%V%j8@8l!#(B

$B%i%$%V%i%j4X?t$O!"BgItJ,$O#C8@8l$G=q$+$l$F$$$k!#(B printf() $B$N%=!<%9!&%W%m%0%i%`$,$"$k!#(B

$B#C8@8l$G5-=R$7$?%W%m%0%i%`$O!"J8K!$5$($"$C$F$$$l$P(B $B%3%s%Q%$%k$O$G$-$k!#(B $B%i%$%V%i%j4X?t$d%7%9%F%`%3!<%k$,$J$$$HF0:n$7$J$$!#(B

$B"!%j%s%/(B

$B%i%$%V%i%j$d%7%9%F%`!&%3!<%k$O!"%3%s%Q%$%k$5$l$F(B $B%*%V%8%'%/%H!&%3!<%I$N7A$GJ]B8$5$l$F$$$k!#(B $B

$B@EE*%j%s%/(B(static link)
$B%W%m%0%i%`H$r8GDjHVCO(B $B$KJQ49$9$k!#(B
$BF0E*%j%s%/(B(dynamic link)
$B%W%m%0%i%`

$BF0E*%j%s%/$r9T$&;~$K$O!"6&M-%i%$%V%i%j(B(shared library) $B$r;H$$!"%a%b%j$N@aLs$r$9$k!#(B

Microsoft Windows $B$G$O!"%7%9%F%`%3!<%k$H%i%$%V%i%j$N6hJL$,4uGv!#(B Win32 API$B!#(B3000$B0J>e!#(B Unix $B$N%7%9%F%`%3!<%k$O!"(B300$BDxEY!#(B

$B"!(Bhello.c$B$H(Bgcc -S

main()
{
	printf("hello, %s!\n","world");
}
$ ls hello*   [$B
hello.c
$ make hello    [$B
cc     hello.c   -o hello
hello.c: In function 'main':
hello.c:3: warning: incompatible implicit declaration of built-in function 'printf'
$ ./hello  [$B
hello, world!
$ gcc -S hello.c [$B
hello.c: In function 'main':
hello.c:3: warning: incompatible implicit declaration of built-in function 'printf'
$ ls hello* [$B
hello  hello.c  hello.s
$ []
  • $B!V(Bgcc -S file.c$B!W$G!"DL>o$O:o=|$5$l$k%"%;%s%V%j8@8l$N=PNO$,(B $B;D$5$l$k!#(B
	.file	"hello.c"
	.section	.rodata
.LC0:
	.string	"world"
.LC1:
	.string	"hello, %s!\n"
	.text
.globl main
	.type	main, @function
main:
	leal	4(%esp), %ecx
	andl	$-16, %esp
	pushl	-4(%ecx)
	pushl	%ebp
	movl	%esp, %ebp
	pushl	%ecx
	subl	$20, %esp
	movl	$.LC0, 4(%esp)
	movl	$.LC1, (%esp)
	call	printf
	addl	$20, %esp
	popl	%ecx
	popl	%ebp
	leal	-4(%ecx), %esp
	ret
	.size	main, .-main
	.ident	"GCC: (GNU) 4.1.2 20080704 (Red Hat 4.1.2-48)"
	.section	.note.GNU-stack,"",@progbits
  • $B%"%;%s%V%j8@8l$N=PNO$K$O!"(Bmain() $B4X?t$N$_$,4^$^$l$F$$$k!#(B printf() $B4X?t$O4^$^$l$F$$$J$$!#(B
  • C$B8@8l$G(B printf() $B$N8F$S=P$7$O!"%"%;%s%V%j8@8l%l%Y%k$G$O!"(Bcall $BL?Na(B $B$K$J$C$F$$$k!#(B

$B"!(Bprintf() $B$N%=!<%9!&%W%m%0%i%`(B

~yas/os2/glibc-2.5/stdio-common/printf.c

$B!c>JN,!d(B
  28:	int
  29:	__printf (const char *format, ...)
  30:	{
  31:	  va_list arg;
  32:	  int done;
  33:	
  34:	  va_start (arg, format);
  35:	  done = vfprintf (stdout, format, arg);
  36:	  va_end (arg);
  37:	
  38:	  return done;
  39:	}
$B!c>JN,!d(B
  42:	ldbl_strong_alias (__printf, printf);
  • vfprintf() $B$r8F$s$G$$$k!#%U%)!<%^%C%F%#%s%0$O!"6&DL!#:G8e$O(B (stdout $B$J$N$G(B)write() $B%7%9%F%`!&%3!<%k$,8F$P$l$k!#(B
  • va_start(), va_end(), va_arg() $B$O2DJQD9$N0z?t$r07$&%^%/%m!#(Bman $B%Z!<(B $B%8(B va_start(3) $B;2>H!#(B
PRINTF(3)                  Linux Programmer's Manual                 PRINTF(3)

NAME
       printf,   fprintf,  sprintf,  snprintf,  vprintf,  vfprintf,  vsprintf,
       vsnprintf - formatted output conversion
SYNOPSIS
...
       int printf(const char *format, ...);
       int fprintf(FILE *stream, const char *format, ...);
...
       int vfprintf(FILE *stream, const char *format, va_list ap);
...
DESCRIPTION
...
       The functions vprintf(), vfprintf(), vsprintf(), vsnprintf() are equiv-
       alent  to  the  functions  printf(),  fprintf(), sprintf(), snprintf(),
       respectively, except that they are called with a va_list instead  of  a
       variable  number  of  arguments. These functions do not call the va_end
       macro. Consequently, the value of ap is undefined after the  call.  The
       application should call va_end(ap) itself afterwards.
...

$B"!(Bwrite()$B%7%9%F%`!&%3!<%k$N%^%K%e%"%k(B

WRITE(2)                   Linux Programmer's Manual                  WRITE(2)

NAME
       write - write to a file descriptor

SYNOPSIS
       #include <unistd.h>

       ssize_t write(int fd, const void *buf, size_t count);

DESCRIPTION
       write()  writes  up  to  count bytes to the file referenced by the file
       descriptor fd from the buffer starting at buf.  POSIX requires  that  a
       read()  which  can  be  proved  to  occur  after a write() has returned
       returns the new data.  Note that not all file systems  are  POSIX  con-
       forming.

RETURN VALUE
       On  success,  the  number of bytes written are returned (zero indicates
       nothing was written).  On error, -1  is  returned,  and  errno  is  set
       appropriately.   If  count  is zero and the file descriptor refers to a
       regular file, 0 may be returned, or an error could be detected.  For  a
       special file, the results are not portable.

ERRORS
       EAGAIN Non-blocking  I/O  has  been  selected  using O_NONBLOCK and the
              write would block.

       EBADF  fd is not a valid file descriptor or is not open for writing.
...

$B"!(Bwrite()$B%7%9%F%`!&%3!<%k(B($B%f!<%66u4V(B)

write.o $B$N5U%"%;%s%V%k7k2L$h$j!" push %ebx # ebx$B%l%8%9%?$NFbMF$r%9%?%C%/$XB`Hr(B mov 0x10(%esp),%edx # $BBh(B3$B0z?t$r%l%8%9%?(B edx $B$X(B mov 0xc(%esp),%ecx # $BBh(B2$B0z?t$r%l%8%9%?(B ecx $B$X(B mov 0x8(%esp),%ebx # $BBh(B1$B0z?t$r%l%8%9%?(B ebx $B$X(B mov $0x4,%eax # $B%7%9%F%`!&%3!<%k$NHV9f(B eax $B$X(B int $0x80 # $B%H%i%C%WL?Na!#%+!<%M%k$X@)8f$r0\$9!#(B pop %ebx # ebx$B%l%8%9%?$NFbMF$r2sI|(B cmp $0xfffff001,%eax # $B%(%i!<$,5/$-$?$i(B jae __syscall_error # __syscall_error$B$X%8%c%s%W(B (errno$BEy$NJ]B8(B) ret
  • $B int $BL?Na(B (interrupt)$B$O!"(Bx86 $B$G$N%H%i%C%WL?Na$N#1$D!#(B $B%+!<%M%k$K@)8f$,0\$k!#(B
  • $B%7%9%F%`!&%3!<%k$N$NHV9f$H0z?t$O!"%l%8%9%?$KF~$l$i$l$F$$$k!#(B
  • $B%7%9%F%`!&%3!<%k$N7k2L$O!"%l%8%9%?$d%U%i%0$KF~$l$FJV$5$l$k!#(B

$B"#(BLinux$B%+!<%M%k$N%=!<%9(B

$B"!%P!<%8%g%s(B

4$B$D$N?t$+$i$J$k!#Nc(B
  • 2.6.26.1
$B!V%a%8%c!

  • $B8=:_3+H/$,?J$a$i$l$$$k$N$O!"(B2.6 $B7ONs!#(B
  • $B?7$7$$5!G=$O!"%j%S%8%g%s$,>e$,$k=j$GF~$k!#(B $BNc(B: 2.6.36 $B$N $B=EBg$JLdBj$,%P%0$,8+$D$+$k$H!"0BDj%P!<%8%g%s$X$N(B $B%Q%C%A$,=P$5$l$k!#Nc(B: 2.6.36.{1,2,3,...}
  • $B3+H/Cf!"%j%j!<%9A0$K$O!"(Brelease candidate $B$H$7$F(B-rc1, -rc2, -rc3 $B$N$h$&=P$5$l$k!#(B

http://kernel.org/ $B$KJ]B8$5$l$F$$$k!#(B

$BE83+$N;EJ}(B

$ bzip2 -d < linux-X.Y.Z.tar.bz2 | tar xf - [$B
  • .bz2 $B$O!"(Bbzip2 $B$G05=L$7$?$b$N!#(B
  • .tar $B$O!"(Btar $B%3%^%s%I$G8G$a$?(B($BJ#?t$N%U%!%$%k$r(B1$B$D$K$^$H$a$?(B)$B$b$N!#(B

~yas/os2/linux-2.6.36/ $B$KE83+$7$?$b$N$,$"$k!#(B

$B"!%+!<%M%k$N%G%#%l%/%H%j9=@.(B

$B%+!<%M%k!&%=!<%9$N%H%C%W%l%Y%k$N%G%#%l%/%H%j(B
$B%G%#%l%/%H%j(B $B@bL@(B
Documentation $B%I%-%e%a%s%H(B
arch $B%"!<%-%F%/%A%c0MB8(B
block $B%V%m%C%/F~=PNOAX(B
crypto $B0E9f2=(B
drivers $B%G%P%$%9!&%I%i%$%P(B
firmware $B%U%!!<%`%&%'%"(B
fs VFS(Virtual File System)$B$H%U%!%$%k!&%7%9%F%`(B
include $B%+!<%M%kMQ$N%X%C%@!&%U%!%$%k(B
init $B5/F0$H=i4|2=(B(initialization)
ipc $B%W%m%;%94VDL?.(B(interprocess communication)
kernel $B%+!<%M%k$NCf?4ItJ,(B
lib $B%X%k%Q(B
mm $B%a%b%j4IM}(B(memory management)
net $B%M%C%H%o!<%/(B
samples $B%5%s%W%k%3!<%I(B
scripts $B%+!<%M%k$N%3%s%Q%$%k$KI,MW$J%9%/%j%W%H(B
security Lnux Security Module
sound $B%5%&%s%I!&%5%V%7%9%F%`(B
tools $B%+!<%M%k3+H/MQ$N%D!<%k(B
usr $B5/F0D>8e$K%f!<%66u4V$G
virt $B2>A[2=%$%s%U%i(B

$B"#%7%9%F%`!&%3!<%k(B

$B"!%7%9%F%`%3!<%k$NHV9f(B

$B%7%9%F%`!&%3!<%k$N

linux-2.6.36/arch/x86/include/asm/unistd_32.h

...
   8:	#define __NR_restart_syscall      0
   9:	#define __NR_exit                 1
  10:	#define __NR_fork                 2
  11:	#define __NR_read                 3
  12:	#define __NR_write                4
  13:	#define __NR_open                 5
  14:	#define __NR_close                6
  15:	#define __NR_waitpid              7
  16:	#define __NR_creat                8
  17:	#define __NR_link                 9
  18:	#define __NR_unlink              10
  19:	#define __NR_execve              11
  20:	#define __NR_chdir               12
...
 346:	#define __NR_fanotify_init      338
 347:	#define __NR_fanotify_mark      339
 348:	#define __NR_prlimit64          340
...
 352:	#define NR_syscalls 341
...

$B"!%7%9%F%`!&%3!<%k$NI=(B sys_call_table

linux-2.6.36/arch/x86/kernel
   1:	ENTRY(sys_call_table)
   2:	        .long sys_restart_syscall       /* 0 - old "setup()" system call, used for restarting */
   3:	        .long sys_exit
   4:	        .long ptregs_fork
   5:	        .long sys_read
   6:	        .long sys_write
   7:	        .long sys_open          /* 5 */
   8:	        .long sys_close
   9:	        .long sys_waitpid
  10:	        .long sys_creat
  11:	        .long sys_link
  12:	        .long sys_unlink        /* 10 */
...
 340:	        .long sys_fanotify_init
 341:	        .long sys_fanotify_mark
 342:	        .long sys_prlimit64             /* 340 */
  • $B#1$D$N%7%9%F%`!&%3!<%k$r=hM}$9$k$?$a$K!"(B1$B$D$N4X?t$,Dj5A$5$l$F$$$k!#(B
  • $B4X?t$NL>A0$O!"EAE}E*$K(B sys_ $B$G;O$^$k!#(B $B%f!<%66u4V$N%7%9%F%`!&%3!<%k$HJ6$l$J$$$h$&$K$9$k$?$a!#(B $BNc(B: $B%f!<%6$N(B write() $B%7%9%F%`!&%3!<%k$O!"%+!<%M%kFb$N(B sys_write() $B$H$$$&4X?t$G=hM}$5$l$k!#(B
  • $B%7%9%F%`%3!<%k$O!"(Bsys_call_table $B$H$$$&I=$KEPO?$5$l$F$$$k!#(B n$BHVL\$N%7%9%F%`!&%3!<%k$O!"%F!<%V%k$N(Bn$BHVL\$K$"$k4X?t$r8F$S=P$9!#(B C$B8@8l$G=q$/$H!" long sys_call_table[NR_syscalls]; ... { long n = $B%7%9%F%`!&%3!<%k$NHV9f(B long f = sys_call_table[n]; (*f)( $B0z?t(B0, $B0z?t(B1, $B0z?t(B2 ); // $B4X?t$H;W$C$F8F$V(B }

$B"!(Bsys_write()

linux-2.6.36/fs/read_write.c
 408:	SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf,
 409:	                size_t, count)
 410:	{
 411:	        struct file *file;
 412:	        ssize_t ret = -EBADF;
 413:	        int fput_needed;
 414:	
 415:	        file = fget_light(fd, &fput_needed);
 416:	        if (file) {
 417:	                loff_t pos = file_pos_read(file);
 418:	                ret = vfs_write(file, buf, count, &pos);
 419:	                file_pos_write(file, pos);
 420:	                fput_light(file, fput_needed);
 421:	        }
 422:	
 423:	        return ret;
 424:	}
$B$3$NDj5A$O!"0J2<$N$h$&$KE83+$5$l$k!#(B
asmlinkage long sys_write(unsigned int fd, const char __user *buf,
	   	size_t count)
{
	$B>JN,(B
}
  • $B:#F|$O(B sys_write() $B$NFbMF$O!"@bL@$7$J$$!#(B
  • write() $B%7%9%F%`!&%3!<%k$O!"(Bfs/read_write.c $B$NCf$N(B sys_write() $B4X?t$G=hM}$5$l$k!#(B
  • sys_write() $B$H$$$&L>A0$O!"(BSYSCALL_DEFINE3() $B$H$$$&%^%/%m$G:n$i$l$k!#(B 3 $B$O!"(B3$B0z?t$N0UL#!#IaDL$O(B 0 $B0z?t(B 5 $B0z?t$^$G!#(B
  • $B%^%/%m$K$h$j!"%7%9%F%`!&%3!<%k$r=hM}$9$k4X?t$K$O!"(Basmlinkage $B$H$$(B $B$&%-!<%o!<%I(B($B%3%s%Q%$%i$X$N;X<((B(directive))$B$,IU$/!#(BC$B%3%s%Q%$%i$O!"%"%;(B $B%s%V%j8@8l$+$i$N8F$S=P$7$,4JC1$K$J$k$h$&$J%3!<%I$r=PNO$9$k!#(B
  • $B%(%i!<$NHV9f$O!"%(%i!.$5$$@5$N@0?t!#BgJ8;z(B E $B$G;O(B $B$^$kL>A0!J%^%/%m!K$,IU$1$i$l$F$$$k!#(B $BDj5A$O!"(B <errno.h> (include/asm-generic/errno-base.h) $BEy$K4^$^$l$F$$(B $B$k!#(B
  • $B%7%9%F%`!&%3!<%k$N=hM}$r$9$k4X?t(B sys_xxx() $B$O!"@.8y$9$k$H(B $B@5$NCM$rJV$9!#(B $B%(%i!<$,H/@8$9$k$H!"%+!<%M%kFb$G$O!"%(%i!<(B $BHV9f$rIi$NCM$K$7$?$b$N$rJV$9!#(B
  • $B%7%9%F%`!&%3!<%k$N7k2L$O!"%f!<%66u4V$K$O(BCPU$B$N%l%8%9%?$d(BCPU$B$N%U%i%0(B $B!J>r7oJ,4t$K;H$&$b$N!K$KF~$l$FJV$5$l$k!#(B
  • $B%f!<%66u4V$G%7%9%F%`!&%3!<%k$O!"@.8y$9$k$H!"(B 0$B0J>e$NCM$rJV$9!#<:GT$9$k$H!"Ii$NCM(B(-1) $BEy$rJV$9!#(B
  • $B%f!<%66u4V$G%7%9%F%`!&%3!<%k$N%(%i!errno $B$r8+$k$HJ,$+$k!#(B ($B%^%k%A%9%l%C%I$N%W%m%0%i%`$G$O!"%9%l%C%I8GM-%G!<%?(B) x86-32 $B$G$O!"(B__syscall_error $B$H$$$&errno $B$K(B $B%;%C%H$9$k!#(B write()$B%7%9%F%`!&%3!<%k(B($B%f!<%66u4V(B) $B;2>H!#(B

$B"!%(%i!

include/asm-generic/errno-base.h
...
   4:	#define EPERM            1      /* Operation not permitted */
   5:	#define ENOENT           2      /* No such file or directory */
   6:	#define ESRCH            3      /* No such process */
   7:	#define EINTR            4      /* Interrupted system call */
   8:	#define EIO              5      /* I/O error */
   9:	#define ENXIO            6      /* No such device or address */
  10:	#define E2BIG            7      /* Argument list too long */
  11:	#define ENOEXEC          8      /* Exec format error */
  12:	#define EBADF            9      /* Bad file number */
  13:	#define ECHILD          10      /* No child processes */
...

$B"!(BSYSCALL_DEFINE$B%^%/%m(B

include/linux/syscalls.h
 188:	#define SYSCALL_DEFINE0(name)      asmlinkage long sys_##name(void)
...
 191:	#define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
 192:	#define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
 193:	#define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
 194:	#define SYSCALL_DEFINE4(name, ...) SYSCALL_DEFINEx(4, _##name, __VA_ARGS__)
 195:	#define SYSCALL_DEFINE5(name, ...) SYSCALL_DEFINEx(5, _##name, __VA_ARGS__)
 196:	#define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
...
 223:	#define SYSCALL_DEFINEx(x, sname, ...)                          \
 224:	        __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
...
 245:	#define __SYSCALL_DEFINEx(x, name, ...)                                 \
 246:	        asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__))
  • $B%^%/%m$K$h$j!"%7%9%F%`!&%3!<%k$r=hM}$9$k4X?t$K$O!"(B $B!V(Bsys_$B!W(B $B$H$$$&%W%l%U%#%C%/%9$,IU$1$i$l$k!#(B $B!V(B##$B!W(B $B$O!"(BC$B%W%j%W%m%;%C%5$NL?Na$G!"J8;zNs$N7k9g$r0UL#$9$k!#(B

$B"!%7%9%F%`!&%3!<%k$N

main()$B!

$B?^(B? hello world $B%W%m%0%i%`$G$N%7%9%F%`!&%3!<%k$N

  • $B%W%m%0%i%`$N $B3F6u4V$NFbIt$N4X?t8F$S=P$7$O!"(Bcall $BL?Na$G9T$o$l$k!#(B
  • $B%f!<%66u4V$+$i%+!<%M%k6u4V$X$N@ZBX$($O!"%H%i%C%WL?Na$G9T$o$l$k!#(B x86 $B$G$O(B int $BL?Na$d(B sysenter $BL?Na$,;H$o$l$k!#(B
  • $B%f!<%66u4V$G$N(B write() $B$N8F$S=P$7$O!"%+!<%M%k$G$O(B sys_write() $B$K$J$k!#(B

$B"#%7%9%F%`!&%3!<%k$d%i%$%V%i%j$r4Q;!$9$k$?$a$N%3%^%s%I(B

$B"!(Bstrace $B%3%^%s%I(B

$B%7%9%F%`!&%3!<%k$NF0$-$rD4$Y$k$K$O!"(Bstrace $B%3%^%s%I(B(Linux) $B$,JXMx!#(B
$ strace ./hello [$B
execve("./hello", ["./hello"], [/* 38 vars */]) = 0
brk(0)                                  = 0x83a3000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=169180, ...}) = 0
mmap2(NULL, 169180, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7f67000
close(3)                                = 0
open("/lib/libc.so.6", O_RDONLY)        = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\340_\222\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1689640, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f66000
mmap2(0x910000, 1410500, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x910000
mmap2(0xa63000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x152) = 0xa63000
mmap2(0xa66000, 9668, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xa66000
close(3)                                = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f65000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb7f656c0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
mprotect(0xa63000, 8192, PROT_READ)     = 0
mprotect(0x83d000, 4096, PROT_READ)     = 0
munmap(0xb7f67000, 169180)              = 0
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f90000
write(1, "hello, world!\n", 14hello, world!
)         = 14
exit_group(14)                          = ?
$ []
  • $B:G8e$K(B write() $B%7%9%F%`!&%3!<%k$, libc (/lib/tls/libc.so.6) $B$N%U%!%$%k$,3+$+$l!"(B mmap() $B$K$h$j%a%b%j$K%^%C%W$5$l$F$$$k!JF0E*%j%s%/!K!#(B

$B"!(Bltrace $B%3%^%s%I(B

ltrace $B%3%^%s%I(B(Linux) $B$r;H$&$H!"%i%$%V%i%j$N8F$S=P$7$rD4$Y$k$3$H$,$G$-(B $B$k!#(B
$ ./hello  [$B
hello, world!
$ ltrace ./hello [$B
__libc_start_main(0x80483a4, 1, 0xbf8d3764, 0x80483f0, 0x80483e0 
printf("hello, %s!\n", "world"hello, world!
)                  = 14
+++ exited (status 14) +++
$ []

$B"!(Bgdb $B%G%P%C%,(B

$ gdb hello [$B
$B>JN,(B
(gdb) b main[$B        # $B%V%l!<%/%]%$%s%H$N@_Dj(B
Breakpoint 1 at 0x80483b2
(gdb) r[$B             # $BJN,(B/hello 
Breakpoint 1, 0x080483b2 in main ()
(gdb) b write[$B       # $B%V%l!<%/%]%$%s%H$N@_Dj(B
Breakpoint 2 at 0x9d2b80
(gdb) c[$B             # $Bbt[$B            # $B%P%C%/%H%l!<%9(B
#0  0x009d2b80 in write () from /lib/libc.so.6
$B>JN,(B
#6  0x0094c271 in vfprintf () from /lib/libc.so.6
#7  0x00955e83 in printf () from /lib/libc.so.6
#8  0x080483c9 in main ()
(gdb) c[$B             # $B



$B"!$=$NB>$N%W%m%;%9$rD4$Y$k%3%^%s%I(B

  • ktrace (FreeBSD, MacOSX 10.4)
  • dtrace, dtruss (Solaris, MacOSX 10.5$B0J9_(B)
  • truss (Solaris, System V Unix)

$B"#%/%$%:(B1 $B%7%9%F%`%3!<%k$H(BLinux$B%+!<%M%k$N%=!<%9(B

$B!zLdBj(B(101) $B%7%9%F%`!&%3!<%k$H%i%$%V%i%j4X?t$N6&DLE@(B

C$B8@8l$G%W%m%0%i%`$r:n@.$9$k>l9g!"%7%9%F%`!&%3!<%k$H%i%$%V%i%j4X?t$N6&DL(B $BE@$r=R$Y$J$5$$!#(B

$B!zLdBj(B(102) $B%7%9%F%`!&%3!<%k$H%i%$%V%i%j4X?t$NAj0cE@(B

$B%7%9%F%`!&%3!<%k$H%i%$%V%i%j4X?t$NAj0cE@$r=R$Y$J$5$$!#(B

$B!zLdBj(B(103) close()$B%7%9%F%`%3!<%k$N0z?t$H7k2L(B

close() $B%7%9%F%`!&%3!<%k$N%^%K%e%"%k$K$O!" CLOSE(2) Linux Programmer's Manual CLOSE(2) NAME close - close a file descriptor SYNOPSIS #include <unistd.h> int close(int fd); DESCRIPTION close() closes a file descriptor, so that it no longer refers to any file and may be reused. Any record locks (see fcntl(2)) held on the file it was associated with, and owned by the process, are removed (regardless of the file descriptor that was used to obtain the lock). ...
$B$3$N%7%9%F%`!&%3!<%k$r=hM}$9$k4X?t$,%+!<%M%k$NCf$G$I$N$h$&$KDj5A$5$l$F(B $B$$$k$+!"$=$N35N,(B($B0z?t$H7k2L$N@k8@(B)$B$r<($7$J$5$$!#4X?t$NFbMF$O6u$G$h$$!#(B $B%^%/%m$rMxMQ$7$F$bMxMQ$7$J$/$F$b$I$A$i$G$b$h$$!#(B
$B0z?t$H7k2L$N@k8@(B
{
   /*$BFbMF(B*/
}

Last updated: 2010/12/21 16:46:37
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>