<<

SD tB e N Lua

Lua in the NetBSD Kernel

Marc Balmer The Lua Embedding Lua in Programs Lua in the NetBSD Kernel

Topics

1 The Programming Language Lua The Lua Interpreter Syntax and such Modules 2 Embedding Lua in C Programs State Manipulation Calling C from Lua Calling Lua from C 3 Lua in the NetBSD Kernel Use Cases Implementation Overview Implementation Details

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

The Lua Interpreter Running Lua Sourcecode

er e pil im m nt local n o 1001101 u n=n + 1 C 0010010 R print(n) 0100011 Lua 1011010 Lua Lua Source

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

The Lua Interpreter Compiling / Running Lua Bytecode

iler e p tim local n m 1001101 n o 0010010 u n=n + 1 C R print(n) 0100011 Lua 1011010 Lua Lua Source Bytecode

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

The Lua Interpreter Running from C

• int luaL dofile(lua State *L, const char *filename) • int luaL dostring(lua State *L, const char *str)

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

Syntax and such Values, Variables, and, Data Types

• Variables have no • Values do have a type • Functions are first-class values

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

Syntax and such Tables

• Tables are THE data structure in Lua • Nice constructor syntax • Tables Lua a good DDL • Metatables can be associated with every object

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

Syntax and such Lua Table Constructor

Create and initialize a table, access a field:

mytable = { name = ’Marc’, surname = ’Balmer’, email = ’[email protected]’ }

print(mytable.email)

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

Modules Extending Lua Programs

Acess GPIO pins from Lua:

require ’gpio’

g = gpio.open(’/dev/gpio0’) g:write(4, gpio.PIN_HIGH) g:close()

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

State Manipulation Creating and Destroying a State

• lua State *L = lua newstate() • luaopen module(L) • lua close(L)

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

Calling C from Lua Calling a C Function

• Function has been registered in luaopen module() • int function(lua State *L) • Parameters popped from the stack • Return values pushed on the stack • Return Nr. of return values

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

Calling Lua from C Calling a Lua Function

• Find the function and make sure is *is* a function • Push parameters on the stack • Use lua call(lua State *L, int index) • or lua pcall(lua State *L, int index) • Pop return values from the stack

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

Calling Lua from C Calling a Lua Function

The Lua function

function hello() print(’Hello, world!’) end

Call hello from C:

lua_getglobal(L, "hallo"); lua_pcall(L, 0, 0, 0);

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

Use Cases Ideas for Users

• Modifying written in C is hard for users • Give users the power to modify and extend the system • Let users explore the system in an easy way

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

Use Cases Ideas for Developers

• ,,Rapid Application Development” approach to driver development • Modifying the system behaviour • Configuration of kernel subsystems

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

Use Cases Alternatives

• Python • Java

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

Use Cases Python

• Not to difficult to integrate in C • Huge • Memory consumption • Difficult object mapping

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

Use Cases Java

• Easy to integrate • Difficult object mapping • Memory considerations • Has been used for driver development

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

Use Cases Lua in NetBSD Userland

• Library (liblua.so) and binaries (lua, luac) committed to -current • Will be part of NetBSD 6 • No back port to NetBSD 5 stable planned

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

Use Cases Lua in the NetBSD Kernel

• Started as GSoC project, Lunatik from to NetBSD • Proof that the Lua VM can run in the kernel, lack of infrastructure • Infrastructure beeing added now

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

Use Cases Running in Userland

• Every process has its own address space • Lua states in different processes are isolated

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

Use Cases Running in the Kernel

• One address space • Every that is in the kernel“ uses the same memory ” • Locking is an issue

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

Implementation Overview The Big Picture

Userland Kernel

er e pil im m nt Kernel subsystems (Users) o u C R Lua Lua te modload(8) ta Lua bindings S te ta S te ta S te ta luactl(8) LuaS lua(4) Lua LuaLua (8) (2) sysctl(3)

luac(1)

local n local n local n local n local n n=n + 1 n=n + 1 n=n + 1 n=n + 1 n=n + 1 print(n) print(n) print(n) print(n) print(n) Filesystem

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

Implementation Overview The lua(4)

Userland Kernel

er e pil im m nt o u C R Lua Lua

lua(4)

ioctl(2) sysctl(3)

Filesystem

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

Implementation Overview lua(4) ioctl(2) / sysctl(3) Interface

Userland Kernel

luactl(8) lua(4)

sysctl(8) ioctl(2) sysctl(3)

Filesystem

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

Implementation Overview Lua States

Userland Kernel

te ta S te ta S te ta S te ta LuaLuaS LuaLua

Filesystem

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

Implementation Overview Lua Modules

Userland Kernel

modload(8) Lua bindings

Filesystem

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

Implementation Overview Lua Users

Userland Kernel

Kernel subsystems (Users)

Filesystem

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

Implementation Overview The luactl(8) Command

Userland Kernel

luactl(8)

Filesystem

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

Implementation Details ,,require”

• Modules are kernel modules • ’require’ can be turned off • Modules must be assigned to Lua states by hand then • By default ’require’ is on and modules are even autoloaded • Module autoloading can be turned off

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

Implementation Details sysctl(8) Variables

• kern.lua.require=1 • kern.lua.autoload=1 • kern.lua.bytecode=0 • kern.lua.maxcount=0

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

Implementation Details Loading Lua Code

Userland Kernel

er e pil im m nt lua_Loader o u C R Lua Lua

te ta S lua(4) Lua

luactl(8) ioctl(2)

local n local n local n local n local n n=n + 1 n=n + 1 n=n + 1 n=n + 1 n=n + 1 print(n) print(n) print(n) print(n) print(n) Filesystem

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

Implementation Details Security

• New Lua states are created empty • Full control over the loading of code • No access to kernel memory, -functions but through predefined bindings

Lua in the NetBSD Kernel Marc Balmer The Programming Language Lua Embedding Lua in C Programs Lua in the NetBSD Kernel

Implementation Details

Time for Questions

SD tB e N Lua

Lua in the NetBSD Kernel Marc Balmer