can python do some kernel stuff?

J

Jimmy

Hi to all

python now has grown to a versatile language that can
accomplish tasks for many different purposes. However,
AFAIK, little is known about its ability of kernel coding.

So I am wondering if python can do some kernel coding that
used to be the private garden of C/C++. For example, can python
intercept the input of keyboard on a system level? someone told me
it's a kernel thing, isn't it?
 
A

Andrew Lee

Jimmy said:
Hi to all

python now has grown to a versatile language that can
accomplish tasks for many different purposes. However,
AFAIK, little is known about its ability of kernel coding.

So I am wondering if python can do some kernel coding that
used to be the private garden of C/C++. For example, can python
intercept the input of keyboard on a system level? someone told me
it's a kernel thing, isn't it?


http://wiki.python.org/moin/elmer
 
D

Diez B. Roggisch

Jimmy said:
well, straightly speaking, how can I know a key is pressed on a system-
level if
using python?

What has that todo with kernel programming? You can use e.g. pygame to
get keystrokes. Or under linux, read (if you are root) the keyboard
input file - I've done that to support several keyboards attached to a
machine.

And the original question: no, python can't be used as kernel
programming language. Amongst other reasons, performance & the GIL
prevent that.

Diez
 
A

Andrew Lee

Jimmy said:
well, straightly speaking, how can I know a key is pressed on a system-
level if
using python?

http://docs.python.org/lib/module-curses.html

Unless you are using an ancient piece of hardware -- a terminal is a
pseudo terminal and a key stroke isn't a kernel event at all.

If you were looking for examples of kernel level functions you might
want to consider driver interfaces -- how to program device interfaces
-- that, too, can be done in Python -- but, again, you are always
calling some underlying C function exposed via SWIG or another cross
compilation tool. Python doesn't reinvent system calls! :)
 
A

Andrew Lee

Diez said:
What has that todo with kernel programming? You can use e.g. pygame to
get keystrokes. Or under linux, read (if you are root) the keyboard
input file - I've done that to support several keyboards attached to a
machine.

And the original question: no, python can't be used as kernel
programming language. Amongst other reasons, performance & the GIL
prevent that.

Diez

http://www.kernel-panic.it/programming/py-pf/

Of course you can code kernel routines in Python -- you are just calling
the underlying C interface. The GIL means you have to manage
threadsafety on your own -- it doesn't imply kernel programming can not
be done.

I'm not talking about writing an OS in Python (though a simple DOS-like
OS is very possible). Nor would I suggest writing device drivers in
Python -- but of course you can call kernel routines and manage some
kernel resources effectively. Python's IPC libraries expose kernel
functionality.
 
D

Diez B. Roggisch

Andrew said:
http://www.kernel-panic.it/programming/py-pf/

Of course you can code kernel routines in Python -- you are just calling
the underlying C interface. The GIL means you have to manage
threadsafety on your own -- it doesn't imply kernel programming can not
be done.

I understood the OP's question as "can one program kernelspace routines
in python". Which I don't think is possible. And I don't see how py-pf
does that either.

Diez
 
A

Andrew Lee

Diez said:
I understood the OP's question as "can one program kernelspace routines
in python". Which I don't think is possible. And I don't see how py-pf
does that either.

Diez


OP: "I am wondering if python can do some kernel coding that
used to be the private garden of C/C++."

The answer is yes. IPC and py-pf are examples. If you don't think of
packet filtering as kernel coding, I can understand. But clearly the
Python interfaces to fork(), waitpid(), signal(), alarm() and so forth
are forays into the once private garden of C.
 
D

Diez B. Roggisch

OP: "I am wondering if python can do some kernel coding that
used to be the private garden of C/C++."

"kernel coding" is pretty clear I'd say - coding a or in the kernel. Not
coding that runs on an OS that happens to have a kernel.
The answer is yes. IPC and py-pf are examples. If you don't think of
packet filtering as kernel coding, I can understand. But clearly the
Python interfaces to fork(), waitpid(), signal(), alarm() and so forth
are forays into the once private garden of C.

Also not "kernel coding" in my book. system-near coding - yes. But not
coding a kernel...

Diez
 
J

Jimmy

What has that todo with kernel programming? You can use e.g. pygame to
get keystrokes. Or under linux, read (if you are root) the keyboard
input file - I've done that to support several keyboards attached to a
machine.

And the original question: no, python can't be used as kernel
programming language. Amongst other reasons, performance & the GIL
prevent that.

Diez

sorry, my aim is not limited to one particular program. Yes, many
library can
permit you to respond to keyboard event, however, what I want is a
universal
function. as long as a key is pressed, no matter where, my program can
repond.

I am quite strange with this topic. But according to my understanding,
any event, keyboard event
for example, once triggered, will be dilivered by keyboard driver to X
system, and then
any running program can either choose to respond or ignore. So my
question can be translated to:
how to make my program respond ?
 
J

Jimmy

sorry, my aim is not limited to one particular program. Yes, many
library can
permit you to respond to keyboard event, however, what I want is a
universal
function. as long as a key is pressed, no matter where, my program can
repond.

I am quite strange with this topic. But according to my understanding,
any event, keyboard event
for example, once triggered, will be dilivered by keyboard driver to X
system, and then
any running program can either choose to respond or ignore. So my
question can be translated to:
how to make my program respond ?

maybe I'd better elaborate on my question. Back to my original
question:
intercept keyboard event on a system level. If you are writing program
in
emacs, of course, the keyboard inputs are meant for emacs only. What
I
want is no matter what program you're running, keyboard events can be
anyway caught by my program.

Am I clear with myself? :)
 
D

Diez B. Roggisch

Jimmy said:
maybe I'd better elaborate on my question. Back to my original
question:
intercept keyboard event on a system level. If you are writing program
in
emacs, of course, the keyboard inputs are meant for emacs only. What
I
want is no matter what program you're running, keyboard events can be
anyway caught by my program.

Am I clear with myself? :)

Do you want to intercept the call (prevent that it is passed through to
e.g. emacs), or are you merely interested in getting it? If the latter,
you can (as root) access the /dev/input keyboard device and get the
scan-codes.

The former is more complicated - without research I don't know out of my
head how to accomplish that. But it must be possible, as e.g. KDE
observes global key-shortcuts. Most probably a X-server thing.



Diez
 
J

Jimmy

Jimmy schrieb:






Do you want to intercept the call (prevent that it is passed through to
e.g. emacs), or are you merely interested in getting it? If the latter,
you can (as root) access the /dev/input keyboard device and get the
scan-codes.

The former is more complicated - without research I don't know out of my
head how to accomplish that. But it must be possible, as e.g. KDE
observes global key-shortcuts. Most probably a X-server thing.

Diez

thanks, right now I am content with just knowing a key is pressed.
as you said, I checked /etc/input/event1 which seems the input of
keyboard. Then I got some extremely strange code. however, how can
I just simply know a key is pressed?
 
E

Ethan Furman

Andrew said:
OP: "I am wondering if python can do some kernel coding that
used to be the private garden of C/C++."

The answer is yes. IPC and py-pf are examples. If you don't think of
packet filtering as kernel coding, I can understand. But clearly the
Python interfaces to fork(), waitpid(), signal(), alarm() and so forth
are forays into the once private garden of C.

Being able to call routines in the kernel is *not* the same as kernel
coding. Calling C routines is *not* the same as kernel coding.
Actually writing the routines that are to be called, and that constitute
the kernel itself, *is* kernel coding. And as wonderful as Python is,
it is *not* for kernel coding.

Having just looked at Py-PF, it is *managing* the firewall, not
implementing it. Again, not kernel coding.
 
S

sturlamolden

the kernel itself, *is* kernel coding. And as wonderful as Python is,
it is *not* for kernel coding.

Not in its present form, no, it would take some porting. But aside
from that, is there any reason one could not embed a python
interpreter in the kernel?
 
I

Ivan Illarionov

The routines listed above aren't in the kernel. They're in libc just
like routines such as printf, memcpy, etc. The above libc routines do
make system calls into the kernel to perform the desired functions, but
those routines are not in the kernel, and calling them is certainly not
"kernel coding".

Yes, Python provides specific wrappers for many C library functions.

Yes, the ctypes module provides a generic method for calling foreign
library functions.

No, using those wrappers is not what anybody I know would call "kernel
coding".


As far as I know, Python doesn't provide the user with the ability to
make system calls into the kernel. Even if it did, that isn't really
"kernel coding" either. It's just making system calls.


Didn't somebody once demonstrate how to put a VM into kernel space so
that you could write kernel code in Python? Maybe it was just a
discussion about how it could be done in theory.

There have been a few JVM-in-hardware projects, so I suppose you could
use Jython to write kernel code for those machines.

I can't understand why somebody might want to do kernel stuff in Python.
It's a *high level language*. It's for high level stuff.

OTOH Python can be easily extended to get as close to the kernel as
anyone may ever need.

I decided to change my "hello world" post to use Linux system call
instead of printf.

#include <Python.h>

PyObject*
hello(PyObject* self)
{
#if defined(__GNUC__) && defined(__i386__) && defined(__linux__)
const char * hello_str = "Hello world (Linux system call)!\n";
int hello_len = 33;
asm __volatile__(
"push %%ebx;"
"movl $4, %%eax;" /* The system call for write (sys_write) */
"movl $1, %%ebx;" /* File descriptor 1 - standard output */
"int $0x80;"
"pop %%ebx;"
: /* no outputs */
: "c" (hello_str), "d" (hello_len) /* input */
);
#else
printf("Hello world!\n");
#endif
Py_RETURN_NONE;
}

static PyMethodDef functions[] = {
{"hello", (PyCFunction)hello, METH_NOARGS},
{NULL, NULL, 0, NULL},
};

DL_EXPORT(void)
init_hello(void)
{
Py_InitModule("_hello", functions);
}

Python 2.5.2 (r252:60911, Apr 21 2008, 11:12:42)
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2
Type "help", "copyright", "credits" or "license" for more information.Hello world (Linux system call)!

I'm in the mood to write "Hello world" programs today ;)

Ivan
 
I

Ivan Illarionov

we choose to put Python in kernel-space and do the other things, not
because they are easy, but because they are hard, because that goal
will serve to organize and measure the best of our energies and
skills...

;)

tinypy rewritten in assembly probably could do the kernel job. CPython is
far too big for the kernel.

Another crazy idea. What about initd/launchd replacement in pure Python?
Python would be the first PID. Isn't it more practical?

Ivan
 
T

Tim Roberts

sturlamolden said:
Not in its present form, no, it would take some porting. But aside
from that, is there any reason one could not embed a python
interpreter in the kernel?

Not at all. Microsoft Research has issued a preview release of an
operating system called "Singularity" where the entire kernel and all
drivers are written as managed code. Since Python can now be used to write
managed code (via IronPython), Q.E.D.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,764
Messages
2,569,565
Members
45,041
Latest member
RomeoFarnh

Latest Threads

Top