Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

LPI Aufgabe - 32 und 64 Bit Programmierung

Frage Entwicklung C und C++

Mitglied: Marco123

Marco123 (Level 1) - Jetzt verbinden

17.12.2009, aktualisiert 12:56 Uhr, 6130 Aufrufe, 15 Kommentare

Die Nutzung des Systemaufrufs
Um den neu definierten Systemaufruf zu nutzen, kann er in einem beliebigen
Programm mit dem Prototypen aufgerufen werden, z. B. in einem Programm
mit dem Namen gauss.c:
Für 32-Bit Prozessoren:

01.
# include <stdio.h> 
02.
# include <linux/unistd.h> 
03.
# include <errno.h> 
04.
# define __NR_prosys 320 
05.
_syscall0(long, prosys); 
06.
main () 
07.
08.
printf(„Berechnung nach der Gauß-Formel \n“); 
09.
printf(„Die Summe ist: %d \n“, prosys() ); 
10.
}
INFORMATION
Kompilieren Sie dieses Programm und führen Sie es aus; als Meldung
müsste auf 32-Bit-Systemen ausgegeben werden:

Berechnung nach der Gauß-Formel
Die Summe ist: 55
AUFGABE:
Für Prozessoren mit 64-Bit Kern ist auch dann, wenn kein 64-Bit Betriebssystem
genutzt wird, die obige Form von
_syscall0(long, prosys);
sowie
printf(„Die Summe ist: %d \n“, prosys() );
nicht möglich. Bei 64-Bit Prozessoren ist der obige Programmcode unter
Berücksichtigung der Funktion syscall() zu ändern.
Nach 3 Tagen googeln, hab ich genug und ersuche das Forum nach Rat.
Meine gefundenen Erkentnisse lauten wie folgt: anstatt "long" sollte man long long nehmen ?
und syscallX() -> X bezeichnet die anzahl der zu übergebenden Parameter.

Aber damit hab ich das Rätzel leider noch nicht gelöst.
Bin erst am beginn meiner C Programmierung unter Linux. Java NPEH aber C :/

vielen Dank
Mitglied: Tommy70
17.12.2009 um 12:38 Uhr
Hallo,

welches Rätsel? Oder habe ich etwas übersehen...
Und ja, es gibt die Möglichkeit Code mittels eines Codeblocks zu formatieren. Dann wäre er eventuell besser lesbar.
Bitte warten ..
Mitglied: Marco123
17.12.2009 um 12:54 Uhr
Für Prozessoren mit 64-Bit Kern ist auch dann, wenn kein 64-Bit Betriebssystem
genutzt wird, die obige Form von
_syscall0(long, prosys);
sowie
printf(„Die Summe ist: %d \n“, prosys() );
nicht möglich. Bei 64-Bit Prozessoren ist der obige Programmcode unter
Berücksichtigung der Funktion syscall() zu ändern.
Bitte warten ..
Mitglied: 6890
17.12.2009 um 15:10 Uhr
Hallo,

abgesehen das ich deine Frage nicht verstehe, würde dir wahrscheinlich ein Blick in manpages von syscall(2) und _syscall(2) helfen:

_syscall(2):
NOTES
Starting around kernel 2.6.18, the _syscall macros were removed from header files supplied to user space. Use syscall(2) instead. (Some architectures, notably ia64, never provided the _syscall
macros; on those architectures, syscall(2) was always required.)

Wenn ich es richtig verstehe, musst du also nur syscall() anstatt _syscall() verwenden:

# include <stdio.h> 
# include <linux/unistd.h> 
# include <errno.h> 
#define _GNU_SOURCE 
#include <unistd.h> 
#include <sys/syscall.h> 
#include <sys/types.h> 
# define __NR_prosys 320 
 
main () 
long gaus = syscall( SYS_prosys ) /* ich schaetze mal dein syscall heisst so?! dann muesste irgendwo noch ein #define SYS_prosys __NR_prosys - oder du nimmst direkt syscall(__NR_prosys) */ 
printf(„Berechnung nach der Gauß-Formel \n“); 
printf(„Die Summe ist: %d \n“, gaus ); 
}
Hoffe ich habe dich korrekt verstanden. BTW was hat das ganze mit LPI zu tun?

Mit freundlichen Grüßen
Bitte warten ..
Mitglied: Marco123
17.12.2009 um 15:49 Uhr
Hey, danke erstmal

Die Aufgabe heisst: ändern Sie den 32 bit code in 64bit code um unter berücksichtigung der funktion syscall.

Das ist eine Übungsaufgabe vom Studium für LPI.
-> Da der Linux Kernel in C geschrieben ist, müssen wir die Basics dafür erlernen, deshalb hat es was mit lpi zu tuen :- )

System Calls selber schreiben können ;) @ Linux

jo muss in der System Call Tabelle den Eintrag noch hinzufügen und in ner C Datei noch die Funktion erstellen + prototyp.

Aber vielen dank schonmal, wieso sagt mir mein "man" nichts zu syscall oO in Section 2.

moep moep

dankeschööön
Bitte warten ..
Mitglied: 6890
17.12.2009 um 15:58 Uhr
Hallo,

oMit freundlichen Grüßen naja syscalls selber schreiben ist imho schon höherer bis ganz hohe schule und hat nix mit LPI 1/2 zu tun.
Auf die zweite Frage kann ich nur sagen:
apt-get install manpages-dev

Mit freundlichen Grüßen
Bitte warten ..
Mitglied: Marco123
17.12.2009 um 16:12 Uhr
Hey,
wieso oMit freundlichen Grüßen ?

Finde als Linux Administrator gehört das Wissen über die Funktionsweise des Kernels dazu.....
Sowie auch Syscalls.

Für die LPIC ist es villeicht zu hoch gegriffen, aber das Wissen rund um Kernel und C Programmierung finde ich gut, dass es angeschnitten wird.

Oder wieso findest du das nicht gut ?


greetz
Bitte warten ..
Mitglied: 6890
17.12.2009 um 16:22 Uhr
Heho,

nein du hast mich da falsch verstanden. Ich finde es natürlich auch gut. Es macht aber IMHO keinen sinn gleich mit dem Kernel anzufangen ohne das dazugehörige Grundlagenwissen zu erlangen.
Als KFZ-Mechaniker fängst du ja auch nicht an den Motor auseinander zu nehmen, weißte?

Mit freundlichen Grüßen
Bitte warten ..
Mitglied: Oimel1980
19.12.2009 um 00:50 Uhr
@Marco123 mich würde interessieren was bei dir rauskommt "55" ???

Mit freundlichen Grüßen
Bitte warten ..
Mitglied: Marco123
03.01.2010 um 17:52 Uhr
hey, ja es kommt 55 heraus

Ein Kommentar muss mehr als 30 Zeichen enthalten! Bitte geben Sie einen aussagefähigen Kommentar ein.
Bitte warten ..
Mitglied: Oimel1980
03.01.2010 um 20:02 Uhr
Hi Marco, bei mir kommt nun auch 55 raus! Aber die Aufgabe

Sie haben sich in einem Programm dieses Lehrbriefs mit der Gauß’schen-Formel beschäftigt. Erzeugen Sie nun einen Systemaufruf mit der Gauß-Formel, an dem bei seinem Aufruf ein Parameter überreicht werden kann. Sodann schreiben Sie ein kleines Shell-Skript (entweder für 32- oder 64-Bit Prozessoren), welches den Systemaufruf
nutzt und als Parameter eine Zahl n weitergibt, der den letzten Wert angibt, der innerhalb der Gauß-Berechnung aufsummiert werden soll: ergebnis = ergebnis + n;
Als n soll maximal der Wert 70.000 gewählt werden können.

Hinweis: Verwenden Sie bei 32-Bit Prozessoren folgenden Prototypen:
#define _syscall1(type_sys, name_sys, type_param, param)

wie und wo bau ich das ein?! Muss dazu prosys.c oder gauss.c abgeändert werden? Die Übergabe eines Wertes ist von der Shell ist dabei eher das kleiner Problem!

Mit freundlichen Grüßen
Oimel
Bitte warten ..
Mitglied: Marco123
03.01.2010 um 20:08 Uhr
Hey,

hatte mir das kurz in Java gebaut, die for schleife mit der hochzählung -> bezug auf 55, Korrekt.

Ich hänge auch noch an der scheiß Aufgabe, finde die ein wenig doof gestellt.
Ich schaue jetzt noch 2 filme, dann mache ich mich ebenfalls an die Aufgabe.

also ich habe es bis jetzt erstmal so stehen:

statt void habe ich -> long n -> damit ich einen Parameter abgreifen kann.
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;
}
return ergebnis;
}



// Film geht los bis gleich :- )
Bitte warten ..
Mitglied: Marco123
06.01.2010 um 13:59 Uhr
So Hey,

sry hat länger gedauert, musste noch was anderes machen :/

erstmal der code meines Systemaufrufes prosys.c:

[CODE]

#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;
}


[/CODE]

meine frage ist nun:
in der Aufgabe steht:
erstellen Sie nun ein Script, welches den Systemaufruf nutzt.

Würdest du erst noch gauss.c schreiben um von dort den Systemcall zu nutzen, oder kennst du eine Möglichkeit direkt aus nem Shellscript nen Systemaufruf zu nutzen ?

danke


PS: ich habe die Gaussformel direkt in den Systemaufruf implementiert.

gruß
Bitte warten ..
Mitglied: 90476
12.05.2010 um 11:25 Uhr
Hallo zusammen,

ist das Ding gelöst ? Mich würde die Lösung ineteressieren, da ich am gleichen Problem hänge.

Grüße
Bitte warten ..
Mitglied: Marco123
12.05.2010 um 20:12 Uhr
25 € gibts die Musterlösung :- )

0 € = les Dir oben meine Antwort durch und versuche mit deinem Wissen was du gelernt hast dies zu vollenden.

Wieso gebe ich nicht gleich die antwort? da ich sie nicht bekam und auch froh darum bin! sonst hätte ich es nicht gerafft wie es geht.
Bitte warten ..
Mitglied: 90476
12.05.2010 um 21:19 Uhr
Ich kriegs noch nicht mal gebacken meinen sch...kernel zu kompilieren. undefined reference to sys_prosys. Scheissdreck ... sorry.
Ist aber so. Ich sitze jetzt 3 Wochen an diesem Müll rum und schmeiße den Mist gleich ganz weg. Das ist der Punkt wo ich echt am verzweifeln bin.
Ich bin nicht zu blöde. Habe schon Ubuntu, Debian 5, Gentoo versucht. Nix. Habe 2000000 Anleitungen gelesen und befolgt. Die Anleitung aus dem Lehrbief inbegriffen. Nix.
Mein Gott, das kann doch nicht so wild sein so einen Scheiss Systemcall zu implementieren.
Wie gesagt. Ich bin fertig damit und werde das noch ein wenig probieren bis ich den Lehrgang schmeiße. Ich bin kein Programmierer und kann das einfach nicht. Ich weiß nicht wo mein Fehler liegt. Alles ist gemacht, ob unistd_32.h, ob syscalls.h ob prosys.c, das Makefile usw usw. 1000000000 mal geprüft und wiederholt. Nix.
Ich weiß ich mach es richtig. Ich habe mit Sicherheit irgendeine Miniatur-Kleinigkeit vergessen. Ich wäre um die Antwort dankbar. Dafür gäbe es sogar 30 €


Zusatz vom 18.05.2010

Habe es jetzt hinbekommen meinen Kernel zu komilieren. Macht auch schön seine "55" aus gauss.c heraus.
Leider aber nicht mit dem Programm aus dem Lehrbuch.
Bei mir funktioniert aber:

#include <sys/syscall.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>

#define __NR_prosys 337

int prosys ()
{
return syscall(__NR_prosys);
}
main()
{
printf("Berechnung nach der Gauss-Formel \n");
printf("Die Summe ist: %d \n", prosys());
}

ohne Probleme.
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Microsoft Office
32 Bit CAD Programm und Excel 64 Bit geht nicht (5)

Frage von GrueneSosseMitSpeck zum Thema Microsoft Office ...

Windows 10
gelöst MacBook Air Intel HD 3000 und Windows 10 64 bit? (8)

Frage von NeXiaL-Computers zum Thema Windows 10 ...

Windows 10
gelöst Windows 10 Pro 64 Bit "Schnellstart aktivieren" abschalten per GPO (6)

Frage von maxpoint zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...