[Novalug] Linux, asm, hardware, protected mode
edjames at greenbelt.com
Mon Feb 18 04:53:28 EST 2008
This is partly an inline assembly code question, and partly a
linux protected mode question, and maybe something else that
I'm unaware of.
I have a C program compiled with: gcc -Wall foo.c -o foo
I make calls using asm(). I'm trying both AT&T and Intel modes, as
asm(".att_syntax noprefix"); and
but not at the same time, of course.
Most instructions work okay, such as (a bunch of delay code):
asm("mov bx, 10"); // Outside loop done 10 times
asm(".outloop:"); // Mark outside loop
asm("mov cx, 65535"); // Inside loop done many times
asm(".inloop:"); // Mark inside loop
asm("dec cx"); // Decrement inside loop counter
asm("jne .inloop"); // Loop back (inside loop)
asm("dec bx"); // Decrement outside loop counter
asm("jne .outloop"); // Loop back (outside loop)
However, an in or out instruction, as in:
asm("out 0x42, al"); or
asm("in al, 0x61");
gives a segmentation fault.
I'm trying (THE HARD WAY) to control the pc speaker to make custom sounds.
Basic question is, am I hitting a problem where Linux is protecting the
hardware from me, and forcing me to go thru the system, say with ioctl()
I've had no problem using ioctl() to control hardware, so I know how to do
it the easy way, btw.
I know Windoze is a pain to try to touch the hardware via homebrew programs,
but I'm not yet aware that Linux does the same thing - or does it?
More information about the Novalug