can python do some kernel stuff?

Discussion in 'Python' started by Jimmy, May 23, 2008.

  1. Jimmy

    Jimmy Guest

    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?
     
    Jimmy, May 23, 2008
    #1
    1. Advertisements

  2. Jimmy

    Andrew Lee Guest


    http://wiki.python.org/moin/elmer
     
    Andrew Lee, May 23, 2008
    #2
    1. Advertisements

  3. Jimmy

    Jimmy Guest

    Jimmy, May 23, 2008
    #3
  4. 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
     
    Diez B. Roggisch, May 23, 2008
    #4
  5. Jimmy

    Andrew Lee Guest

    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! :)
     
    Andrew Lee, May 23, 2008
    #5
  6. Jimmy

    Andrew Lee Guest

    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.
     
    Andrew Lee, May 23, 2008
    #6
  7. 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
     
    Diez B. Roggisch, May 23, 2008
    #7
  8. Jimmy

    Andrew Lee Guest


    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.
     
    Andrew Lee, May 23, 2008
    #8
  9. "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.
    Also not "kernel coding" in my book. system-near coding - yes. But not
    coding a kernel...

    Diez
     
    Diez B. Roggisch, May 23, 2008
    #9
  10. Jimmy

    Jimmy Guest

    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 ?
     
    Jimmy, May 23, 2008
    #10
  11. Jimmy

    Jimmy Guest

    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? :)
     
    Jimmy, May 23, 2008
    #11
  12. 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
     
    Diez B. Roggisch, May 23, 2008
    #12
  13. Jimmy

    Jimmy Guest

    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?
     
    Jimmy, May 23, 2008
    #13
  14. If you are on Linux, use XLib
    http://python-xlib.sourceforge.net/

    You need to catch the KeyPress or KeyRelease X events.
    while 1:
    ev = display.next_event()
    if ev.type == X.KeyPress:
    key_code = ev.detail
    ....
    ....

    Ivan
     
    Ivan Illarionov, May 23, 2008
    #14
  15. Jimmy

    Ethan Furman Guest

    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.
     
    Ethan Furman, Jun 3, 2008
    #15
  16. Jimmy

    sturlamolden Guest

    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?
     
    sturlamolden, Jun 4, 2008
    #16
  17. 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
     
    Ivan Illarionov, Jun 4, 2008
    #17
  18. 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
     
    Ivan Illarionov, Jun 4, 2008
    #18
  19. Jimmy

    Tim Roberts Guest

    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.
     
    Tim Roberts, Jun 5, 2008
    #19
    1. Advertisements

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 (here). After that, you can post your question and our members will help you out.