18

Digamos que quiero crear un nuevo lenguaje de programación o usar algún lenguaje que no sea compatible con MS (Haskell, Java ... lo que sea) pero quiero ser capaz de codificar contra Windows 8 metro/winRT.¿Es posible el nuevo lenguaje de programación JIT-ed en Windows 8 metro/winRT?

Sé que todas las aplicaciones en la interfaz de usuario de Metro son de espacio aislado.
Sé que puedo programar en C++ nativo, así que supongo que puedo hacerlo también en C o ensamblado. Pero
:

  1. ¿Es posible crear un JIT que producirá el código de montaje sobre la marcha - como JIT- CLR sin romper las restricciones de caja de arena?
  2. Suponiendo que usaré solo API allowed in Metro sandbox, ¿es posible no usar XAML como interfaz UI? - ¿Puedo usar Direct2D/DirectX directamente?

Respuesta

13

Por lo que puedo decir, es demasiado pronto para hacer la llamada en esto. Personalmente, no sé cómo escribir un jitter sin utilizar VirtualProtect(), la función core winapi que le permite convertir un trozo de memoria con código máquina generado por el jitter en código ejecutable.

Hay una serie de funciones de winapi nativas disponibles para una aplicación WinRT. La lista de funciones del sistema bendito es available here. Las apis relacionadas con la memoria son bastante limitadas, VirtualQuery es el único en la lista que se acerca.

Entonces, ¿cómo lo hacen las proyecciones de lenguaje actuales? Echemos un vistazo. El CLR tiene una proyección, se carga en cualquier aplicación Metro que escriba en un lenguaje administrado como C#. Ejecutar dumpbin.exe/imports en c: \ windows \ microsoft.net \ framework \ v4.0.30319 \ clr.dll genera una lista bastante grande de dependencias en las DLL de Windows. Un fragmento de ese volcado:

Dump of file clr.dll 

File Type: DLL 

    Section contains the following imports: 

    KERNEL32.dll 
... 

       430 RaiseException 
       581 VirtualAlloc 
       584 VirtualFree 
       589 VirtualQuery 
       587 VirtualProtect   <=== here! 
       339 HeapDestroy 
       336 HeapAlloc 
       342 HeapValidate 
       540 SleepEx 
       547 SwitchToThread 
       ... etc 

Otra proyección de la lengua es para JavaScript, implementado en el motor "Chakra". Difícil averiguar exactamente qué DLL implementa ese motor, es solo un nombre de código. La ejecución de un proyecto de ejemplo de JavaScript con la depuración no administrada habilitada revela que se cargó "jscript9.dll". Hagamos dumpbin.exe/imports en este:

.... 
    6898F4D5 10D DebugBreak 
    6891FDA1 55E TerminateProcess 
    6898EF9E 57E UnhandledExceptionFilter 
    6891FD58 43C RaiseException 
    68903BB7 59E VirtualProtect     <=== here! 
    6A218590 366 InterlockedPushEntrySList 
    6A2185A9 365 InterlockedPopEntrySList 
    6A2195AA 35C InitializeSListHead 
    689026F9 598 VirtualAlloc 
    68902852 59B VirtualFree 
    6890603E 4A2 ResetWriteWatch 
    ...etc 

Bueno, está ahí. Tendría que serlo. El problema es que ahora mismo no se puede llamar a esta función. Ciertamente no pasaría el escrutinio del validador de la Tienda.

Esto tiene que guisarse, al menos hasta que el real WinRT esté disponible, el que se ejecuta en núcleos ARM.No solo el que se ejecuta sobre Win32 que ahora tiene ejecutado en la Vista previa del consumidor de Windows 8. Y puede aprovechar fácilmente las funciones winapi existentes, no solo la lista recortada. Eso será alrededor de fin de año, probablemente. El hardware real no estará en tus manos hasta el verano del próximo año.

+1

WinRT es casi actuando como un recinto de seguridad aquí, así que el acceso a la API VirtualAlloc/VirtualProtect no va a ser cambiado, ya que la API está casi listo para el OEM. Básicamente, aparte de .NET CLR/JIT (y todos los lenguajes dinámicos de .NET que se pueden jed), no habrá forma de implementar un JIT. – xoofx

+1

cuando hablo de WinRT, estaba hablando de todo el "ecosistema WinRT" que significa pura API "WinRT" + Win32/COM autorizado. La aplicación restringida Win32/COM API para Windows 8 Metro funciona casi como un sandbox. Por lo tanto, no habrá forma de que una sección PE lea + escriba + ejecutable, por lo que no habrá JIT. Esto es por diseño en Windows 8 Metro hasta ahora, y dudo mucho que este diseño vaya a cambiar 1 mes antes de la Vista previa de lanzamiento. – xoofx

+0

'HeapCreate' con' HEAP_CREATE_ENABLE_EXECUTE'? –

7

Sí, es posible escribir una proyección en WinRT para otros lenguajes de programación. Incluso se anima. Una conferencia llamada Lang.Next se llevó a cabo en el campus de Microsoft a principios de este mes, y se trataba de diseño de lenguaje. Una de las sesiones fue específicamente sobre este tema, y ​​es posible que desee verla (tengo): http://channel9.msdn.com/Events/Lang-NEXT/Lang-NEXT-2012/The-Windows-Runtime y lea los comentarios en la página también. Permítanme citar una:

Martyn dejó claro que no sólo queremos diseñadores del lenguaje y ejecutores para añadir WinRT a su lista de plataformas de destino de su lengua y cadenas de herramientas , pero vamos a ayudar y aconsejar.

Así que empiece! :-)

5

1) Además de los navegadores que podrían tener acceso a algunas API restringidas (y podrían integrar su JIT, pero afaik, las API autorizadas para navegadores aún no se publican), la aplicación estándar Win8 Metro no tendrá acceso a funciones como "VirtualAlloc/VirtualProtect" (usado para crear/cambiar páginas de memoria de lectura/escritura/ejecutables): Significa que JIT desarrollado en C++ bajo una aplicación Metro de Windows 8 no pasará la certificación. Ya puede verificar su aplicación con el kit de herramientas de certificación disponible con Visual Studio 11 Beta.

Alguien podría decir "Voy a hackear la sección de PE para forzar la sección de lectura + escritura + ejecutable" sin tener que usar las funciones de VirtualAlloc/VirtualProtect, pero desafortunadamente este truco tampoco funcionará, ya que estás forzado para compilar un Windows 8 Metro Exe con la opción/NXCOMPAT: YES, lo que significa que está habilitando "Data Execution Prevention" (DEP).

Otro podría tener la tentación de generar DLL sobre la marcha y cargarlos desde el disco utilizando la nueva "LoadPackagedLibrary", pero esta función está bloqueada si la DLL no era parte de la implementación original (en realidad, no he estado capaz de hacerlo funcionar correctamente)

El único JIT que está disponible es .NET JIT. Todos los lenguajes dinámicos .NET como IronPython/IronRuby (si se actualizan para Win8 Metro) que están utilizando el DLR (Dynamic Language Runtime en .NET) o incluso el Emit de reflexión serán jitted. Por lo tanto, si segmenta el bytecode de .NET CLR, puede hacer que se modifique su código.

IKVM.Net por ejemplo, que es capaz de ejecutar código Java dentro de .NET CLR podría ejecutarse bajo una aplicación Metro de Windows 8 (pero con la condición de que será refactorizado para usar solo Win8 Metro API certificada)

2) Sí, es posible escribir una aplicación Direct2D/Direct3D11 sin usar XAML.

Compruebe las muestras de Metro de Windows 8 http://code.msdn.microsoft.com/windowsapps/Windows-8-Modern-Style-App-Samples. Por ejemplo, la mayoría de las muestras de Direct2D no usan XAML.

La clase CoreWindow que es una API de nivel inferior para el sistema Metro Window es el punto de entrada para una aplicación Direct2D/Direct3D11 pura.

+0

¿DeP realmente impide la ejecución de código desde la memoria que está explícitamente marcada como ejecutable? La sección de código normal sigue siendo ejecutable AFAIK –

0

Vale la pena señalar que incluso si logró obtener un JIT funcionando, tal vez emitiendo bytecode CLR en lugar de código de máquina nativo, o incluso si acaba de implementar un intérprete sin JIT, solo podría ejecutar el código que era incluido en su paquete de aplicación original. Si descargó script/bytecode/etc ... desde fuera de la aplicación y trató de ejecutar/JIT/Interpret it en un "contexto local" (es decir, con acceso directo a las bibliotecas WinRT), lo haría (con una posible excepción - vea la nota a continuación) en violación de la sección 3.9 de los requisitos de certificación de aplicaciones:

lógica

3.9 Todas aplicación debe originarse y residir en, su paquete de aplicación Usted aplicación no debe intentar cambiar o ampliar el contenido empaquetado través de cualquier modalidad de la inclusión dinámica de código o datos que cambia la forma en que la aplicación interactúa con Windows Runtime, o se comporta con respecto a la política de la Tienda. No está permitido, por ejemplo, descargar una secuencia de comandos remota y, posteriormente, ejecutarla en el contexto local de su paquete de aplicaciones.

La redacción difícil aquí está en esta frase de "contexto local". No está claro lo que eso significa exactamente.Por ejemplo, si tiene un control de navegador web con un portal abierto a un sitio web (o un iframe en una aplicación html que se ejecuta en el "contexto web"), ese navegador web/iframe está "ejecutando" el código JavaScript JIT, pero se ejecutará en un "contexto" diferente, y no tiene acceso directo a apis WinRT. No está claro si esta excepción es solo para el control del navegador IE en XAML o el contexto iframe w/web en aplicaciones html, o si podría implementar su propio "contexto web" en su intérprete o tiempo de ejecución dinámico.

Dicho esto, puede precompilar cualquier tipo de código de aplicación como una forma de obtener ese código en una aplicación y certificarlo, de manera similar a como se hace en iOS, excepto que tiene la opción de compilando para .NET, código máquina nativo o javascript.

6

Here's a trick I found to gain access to these missing APIs (VirtualAlloc, VirtualProtect), which are required in order to implement a jitter (Aviso: Este es mi blog).

Al jugar con el código inseguro C#, puede omitir las restricciones impuestas sobre .NET reflection e invocar el método P/Invoke interno Win32Native.GetProcAddress. Una vez que tenga esa función, obtendrá automáticamente acceso a cualquier función de Win32, incluido VirtualAlloc.

+0

¡Gracias por publicar su respuesta! Asegúrese de leer detenidamente [Preguntas frecuentes sobre autopromoción] (http://stackoverflow.com/faq#promotion). También tenga en cuenta que * se requiere * que publique un descargo de responsabilidad cada vez que se vincula a su propio sitio/producto. –

+0

@AndrewBarber gracias, arreglado – Andrea

Cuestiones relacionadas