Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: sence123 am 10. January 2010, 15:00

Titel: Syscall - Übungsaufgabe - Fehler
Beitrag von: sence123 am 10. January 2010, 15:00
Hallo Forum,

Ich muss für eine Übungsaufgabe einen Syscall definieren und diesen von einem C Programm aus nutzen. Das C Programm wird über ein Shellscript aufgerufen und es wird ein Parameter überreicht.

Das Problem ist die kompilierung von Gauss.c
ich herhalte den Fehler bei :
gcc Gauss.c -o gauss

gauss.c:7: error: expected declaration specifiers or ‘...’ before ‘prosys’
gauss.c:7: warning: data definition has no type or storage class

Zudem würde ich gerne Wissen ob meine Lösung stimmt ? (bin blutiger Anfänger darin)

der Syscall prosys.c :

#include <linux/linkage.h>


asmlinkage long sys_prosys(long n) {

long ergebnis=0;
int i;

for(i=1; i<=10;i++) {
ergebnis +=i;
}
ergebnis = ergebnis + n;

return ergebnis;
}


Die C Datei, welche den Syscall nutzt, Gauss.C :
# include <stdio.h>
# include <linux/unistd.h>
# include <errno.h>
# include <sys/syscall.h>
# define __NR_prosys 320

_syscall0(long, prosys);

void main(int args, char* argv[])
{
printf("Berechnung nach der Gauß-Formel \n");
printf("Die Summe ist: %d \n", prosys(argv[1]) );
}


das Shellscript brauche ich nicht hier zu posten, da dies funktioniert und auch den Parameter weitergibt. Sollte ich es dennoch posten müssen, gebt mir bitte kurz bescheid.


Vielen herzlichen Dank!!

Mit freundlichen Grüßen

Marco
Titel: Re: Syscall - Übungsaufgabe - Fehler
Beitrag von: bluecode am 10. January 2010, 15:11
Du musst das ganze in Deklaration und Definition aufteilen, da extern "C" (laut Internet wird aus asmlinkage exakt dieses) nicht in einer Definition auftreten darf:

asmlinkage long sys_prosys(long n);

long sys_prosys(long n){
/* bla */
}
Titel: Re: Syscall - Übungsaufgabe - Fehler
Beitrag von: sence123 am 10. January 2010, 17:28
Hey,

könntest du mir bitte kurz die Dateien Posten, wie du es meinst ?

hab leider sehr wenig plan davon , muss das jedoch als Übungsaufgabe für das Studium machen.

Es wurde kurz C angesprochen dann uns der Brocken mit Syscall vorgelegt.......

wenn du es mir kurz niederschreiben könntest, wäre ich dir wirklich sehr verbunden.

Dann würde ich es auch nachvollziehen können.

Vielen Dank
Titel: Re: Syscall - Übungsaufgabe - Fehler
Beitrag von: sence123 am 10. January 2010, 17:53
Hallo nochmal,

Also ich habe nun den prototypen (prosys.h) erstellt.
jedoch noch der selbe Fehler oO

oder hab ich noch etwas falsches vorliegen ?

danke
Titel: Re: Syscall - Übungsaufgabe - Fehler
Beitrag von: bluecode am 10. January 2010, 18:49
Ich hab doch eigentlich exakt das geschrieben :-o
Du musst nur deine Zeile
asmlinkage long sys_prosys(long n) {durch
asmlinkage long sys_prosys(long n);

long sys_prosys(long n){
ersetzen.

Wenn du die Deklaration/den Prototyp in einen eigene Header packst musst du in der Header vorher auch <linux/asmlinkage.h> inkludieren, dort ist ja asmlinkage definiert.
Titel: Re: Syscall - Übungsaufgabe - Fehler
Beitrag von: MNemo am 10. January 2010, 19:05
gauss.c:7: error: expected declaration specifiers or ‘...’ before ‘prosys’
gauss.c:7: warning: data definition has no type or storage class
gcc kennt '_syscall0' nicht(wurde laut Google mit dem 2.6.18er-Kernel aus den Headern genommen) und geht von einer Prototypen-Deklaration aus, was dann zu einem Fehler führt weil 'prosys' kein Type ist.

Versuch es mal mit:
long prosys(void) {
    return syscall(__NR_prosys);
}
statt Zeile 7.
Titel: Re: Syscall - Übungsaufgabe - Fehler
Beitrag von: sence123 am 11. January 2010, 14:05
Hallo,

Vielen Dank!!!!!!!!

Gauss.C funktioniert nun nice :-)


nun jedoch noch ein Problem:

ich musste ein Systemcall definieren (prosys):


#include <linux/linkage.h>

asmlinkage long sys_prosys(long n){

long ergebnis=0;
int i;

for(i=1; i<=10;i++) {
ergebnis +=i;
}
printf("Vorläufiges Ergebnis: %d \n", ergebnis);
ergebnis = ergebnis + n;

return ergebnis;
}


ich habe das Makefile erstellt
obj-y := prosys.o

dann das ganze in /usr/src/linux/linux-2.6.32-2/prosys/ abgelegt.

die ergänzungen im Globalen Makefile hinzugefügt:

core-y. += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ prosys/
gemacht.

und in der unistd.h
den Eintag #define __NR_prosys 242 hinzugefügt.

in der syscall_table32:
.long sys_prosys


wenn ich das programm Gauss ausführe erhalte ich:
als ergebnis -1
also irgendwas stimmt da noch nicht :/

Vielen Dank für die Hilfe!!!
Titel: Re: Syscall - Übungsaufgabe - Fehler
Beitrag von: sence123 am 12. January 2010, 16:54
Gelöst

Ich lösche dies nicht, da dies als Hilfe anderer dienen kann.
Titel: Re: Syscall - Übungsaufgabe - Fehler
Beitrag von: MNemo am 12. January 2010, 18:25
Ich lösche dies nicht, da dies als Hilfe anderer dienen kann.

Wenn du jetzt auch noch sagst was du falsch gemacht hast bzw. wie es richtig geht, Hilft das ganze noch mehr.  :-D
Titel: Re: Syscall - Übungsaufgabe - Fehler
Beitrag von: sence123 am 12. January 2010, 23:35
ups sry hab noch nen problem mit dem syscall selbst :/

war happy mit Gauss.c jedoch nicht mit meinem Syscall implementieren und 64 bit systemen :////

my fault
Titel: Re: Syscall - Übungsaufgabe - Fehler
Beitrag von: Oberrheintux am 15. January 2010, 18:24
Hi,
wäre schön, wenn Du hier weiter über Dein Problem berichtest, da ich das selbe habe :cry: