Different versions of system calls in assembly language

Matthew Dillon dillon at apollo.backplane.com
Thu Sep 29 08:51:22 PDT 2005


:
:
:I'm continuing my foray into assembly language programming, and today I ran
:into a problem calling mmap.  The problem came from the fact that the version
:I was apparently calling (libc?) was expecting an additional 'pad' argument.
:
:Since the man page does not mention this (I found it in syscalls.master) where
:should I have found the information when setting up this call?  Better yet,
:how could I access the original mmap with one less argument, other than a
:direct int80?
:
:jcm
:--

    For historical reasons (meaning that the original authors of the
    syscall code did something really stupid), 64 bit system call 
    arguments such as the off_t parameter in lseek and mmap are 64
    bit aligned, rather then simply use the C ABI.  Because GCC does not
    64-bit align 64 bit arguments, we can't just have the system call 
    function issue an int 0x80 but instead must reorganize the arguments
    to add the additional alignment.

    See:

    /usr/src/lib/libc/sys/mmap.c
    /usr/src/lib/libc/sys/lseek.c

    It's really stupid because the stack itself is not 64-bit aligned,
    so the layout on the stack winds up not being aligned anyway.  But
    the PAD is still required because the kernel expects it.

    Generally speaking, you should not be calling int 0x80 directly
    but should instead call into libc, but I understand you are trying
    to create some level of code obscurity in your current project.

					-Matt
					Matthew Dillon 
					<dillon at xxxxxxxxxxxxx>





More information about the Kernel mailing list