From owner-java@jp.FreeBSD.org Wed Sep 11 05:31:04 2002
Received: (from daemon@localhost)
	by castle.jp.FreeBSD.org (8.11.6+3.4W/8.11.3) id g8AKV4e49700;
	Wed, 11 Sep 2002 05:31:04 +0900 (JST)
	(envelope-from owner-java@jp.FreeBSD.org)
Received: from pooh.softalia.com (pooh.softalia.com [65.161.202.173])
	by castle.jp.FreeBSD.org (8.11.6+3.4W/8.11.3) with ESMTP/inet id g8AKV0349682
	for <java@jp.FreeBSD.org>; Wed, 11 Sep 2002 05:31:01 +0900 (JST)
	(envelope-from kkonaka@softalia.com)
Received: from tigger.softalia.com (tigger-2.softalia.com [10.10.10.2])
	by pooh.softalia.com (8.9.3+Sun/3.7W-isfs) with ESMTP id QAA00846;
	Tue, 10 Sep 2002 16:30:54 -0400 (EDT)
Received: from tigger.softalia.com (kkonaka@tigger.softalia.com [65.161.202.175])
	by tigger.softalia.com (8.11.4/3.7W-isfs) with ESMTP id g8AKUsZ25510;
	Tue, 10 Sep 2002 16:30:54 -0400
Message-ID: <sqbadmpbo28.wl@nue.mac.com>
From: kkonaka@mac.com
To: java@jp.FreeBSD.org
In-Reply-To: <20020910.124415.28783632.shudoh@localhost>
References: <20020829131407.4f3c16ad.daichi@jp.freebsd.org>
	<20020830.152855.846933591.shudoh@localhost>
	<sqb1y831bgf.wl@nue.mac.com>
	<20020910.124415.28783632.shudoh@localhost>
User-Agent: Wanderlust/2.6.0 (Twist And Shout) SEMI/1.14.3 (Ushinoya)
 FLIM/1.14.3 (=?ISO-8859-4?Q?Unebigory=F2mae?=) APEL/10.3 Emacs/20.7
 (i586-pc-linux-gnu) MULE/4.0 (HANANOEN)
MIME-Version: 1.0 (generated by SEMI 1.14.3 - "Ushinoya")
Content-Type: text/plain; charset=ISO-2022-JP
Reply-To: java@jp.FreeBSD.org
Precedence: list
Date: Tue, 10 Sep 2002 16:13:35 -0400
X-Sequence: java 224
Subject: [java 224] Re: Java Memory Model
Errors-To: owner-java@jp.FreeBSD.org
Sender: owner-java@jp.FreeBSD.org
X-Originator: kkonaka@mac.com
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+020902

$B$3$J$+$G$9(B _$B$I$&$b$G$9(B_ -- $B$d$C$Q$j2x$7$$$G$9$M(B

> $BIT;W5D$K;W$C$F!"(B3$BG/A0!"(Bfj $B$GOCBj$K$7$?$3$H$,$"$j$^$9!#(B
>   Subject: execution of code on stack
>   http://groups.google.co.jp/groups?threadm=7qcsnh$5lo$1@wise31.mn.waseda.ac.jp

$B;29M$K$J$j$^$9(B _o_

> $B$3$3$G5s$2$i$l$F$$$k$"$kJ8>O(B
>   Subject: signal trampoline code
>   http://www.ccrc.wustl.edu/pub/chuck/tech/notes/g_signal.txt
...
>   $B"*(B known address $B$K(B trampoline $B%3!<%I$rCV$/$3$H$G2r7h$G$-$k!#(B
>      known address $B$H$7$F$O!"%f!<%6%9%?%C%/>e$,JXMx(B ($B!)(B)$B!#(B
>      $B%Y!<%9%]%$%s%?(B ($B%9%?%C%/%]%$%s%?(B) $B$+$i0LCV$r;;=P$G$-$k$+$i!)(B

$B$3$N:]$J$N$G(B Linux - FreeBSD, NetBSD $B$H8+$F$_$?$N$G$9$,(B
$B8=>u(B NetBSD $B$N$,$o$+$j$d$9$$(B/$B>e$N2r@b$K6a$$$h$&$K;W$$$^$9(B:
http://cvsweb.netbsd.org/bsdweb.cgi/syssrc/sys/kern/kern_exec.c?rev=1.142.2.6&content-type=text/x-cvsweb-markup

  | sys_execve(struct proc *p, void *v, register_t *retval)
  | {        
  ...
  |         /* copy out the process's signal trapoline code */
  |         if (szsigcode) {
  |                 if ((error = copyout((char *)pack.ep_es->es_emul->e_sigcode,
  |                     p->p_sigctx.ps_sigcode = (char *)p->p_psstr - szsigcode,
  |                     szsigcode)) != 0) {
  |                         DPRINTF(("execve: sig trampoline copyout failed\n"));
  |                         goto exec_abort;
  |                 }
  | #ifdef PMAP_NEED_PROCWR
  |                 /* This is code. Let the pmap do what is needed. */
  |                 pmap_procwr(p, (vaddr_t)p->p_sigctx.ps_sigcode, szsigcode);
  | #endif
  |         }

$B!V;;=P$G$-$k(B...$B!W$H$$$&$h$j$O(B $B!V(Bp->p_sigctx.ps_sigcode 
$B$K$H$C$F$*$$$?!W(B(=> $B$b$C$HD>@\$K(B ``known address'' $B$J(B)
$B>l=j!J(Bstack $B$NDl!K$K$"$k(B -- $B$H$$$C$?46$8$+$7$i$s!)!)(B

Linux $B$O!"AjEv$J$3$H$r$d$C$F$$$k$N$O$3$NJU!)!JBg$O$:$l!)!K$N$h$&$J5$$,$9$k$s$G$9$,(B
linux/arch/i386/kernel/signal.c:
get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
static void setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, struct pt_regs * regs)

http://www.ccrc.wustl.edu/pub/chuck/tech/notes/g_signal.txt:
  | In order to reach the user's signal trampoline code, the kernel must
  | know where it resides.  If the address is fixed by the kernel, this is
  | easy.
$B$r$$$H$o$:!"(Btrampoline code $B$O(B stack top $B$K(B signal
delivery $B;~$K:n$C$F$$$k$h$&$K;W$$$^$9!#(B
$B!J$^$A$,$C$F$=$&$J5$$,$9$k(B -- $BD>$7$F$/$@$5$$(B (^^;$B!K(B

FreeBSD $B$O$J$s$@$+9~$_F~$C$F$$$F$h$/$o$+$i$J$+$C$?(B (^^;

>   shell code $B$O%9%?%C%/$KCV$+$l$k$H$O8B$i$J$$!#(B
>   $B$J$N$G!"%9%?%C%/$r<B9T6X;_$K$9$k$3$H$O!"(Bstack overflow $B$N(B
>   $B:,K\E*$J2r7h$K$O$J$i$J$$!#(B

$BN;2r$7$^$7$?!#(B

> $BDL>o$N(B Java $B2>A[%^%7%s$G(B mprotect() $B$r;H$&I,MW$,$"$k$H$9$l$P!D(B
> read/write barrier $B$N<BAu<jCJ$H$7$F!"$H$+!#(B

$BN;2r$G$9(B^2$B!#(B

> $B$3$N(B Java/DSM $B$G!"(Bmprotect() $B$r$I$&;H$C$F$$$k$N$G$7$g$&$+!#(B
> 
> TreadMark $B$,(B read/write barrier $B$N$?$a$K;H$C$F$$$k$H$+(B?

$B$=$&!#$H8@$C$F$[$\$$$$$h$&$J5$$b$7$^$9!#(BSCI $B!J(B"$B$J$I(B"
...optional$B!K$H9g$o$;$F!"J,;6%3%T!<$7$F$$$k(B heap $B$N(B
$B0l4S@-@)8f$N;EAH$_$N$R$H$D!"$HKM$OM}2r$7$F$$$k$N$G$9$,!#(B



> $BE:IU%3!<%I(B (nested_func.c) $B$G$O!"(B
> main() $B$,%9%?%C%/>e$K%3!<%I$r:n$j$^$9!#(B
> 
> inner $B4X?t(B (nested_func()) $B$O!"4X?t%]%$%s%?$rDL$7$F8F$S=P$5$l$?:]$G$b(B
> $B4X?t%]%$%s%?$,:n$i$l$?J8L.(B (main()) $B$N%m!<%+%kJQ?t(B (i) $B$K(B
> $B%"%/%;%9$9$kI,MW$,$"$k$N$G!D(B

``closure'' $B$H$$$&$d$D$G$7$g$&$+(B -- C $B$G$d$k$N$O;O$a$F$_$^$7$?!#(B
$BLLGr$$$G$9$M(B!! :)



> #include <stdio.h>
> 
> void another_func(void (*func)()) {
>   func();
> }
> 
> int main(int argc, char **argv) {
>   int i = argc;
> 
>   void nested_func() {
>     printf("%d\n", i);
>   }
> 
>   another_func(nested_func);
> 
>   return 0;
> }
