Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Assembler im Kernel-Mode (https://www.delphipraxis.net/69978-assembler-im-kernel-mode.html)

Codewalker 23. Mai 2006 06:36


Assembler im Kernel-Mode
 
Hallo zusammen.

Ich möchte gerne bei meinem Rechner die Leistung verringern indem ich ein HALT-Kommando an die CPU sende.

Delphi-Quellcode:
asm
  HLT ; thx to Frickel[...]TM
end;
In diesem Thread habe ich schon erfahren, dass dies wohl ein privilegiertes Kommando ist und nur aus Ring0 (= Kernel) gesendet werden kann und wurde dabei auf die uAllCollection verwiesen. Leider hat mir das nicht wirklich weitergeholfen. Kennt sich jemand mit der uAllCollection aus oder kann mir sagen, wie ich das realisieren kann? :gruebel:

Muetze1 23. Mai 2006 07:19

Re: Assembler im Kernel-Mode
 
Wozu nur? Der Idle Prozess (auch wenn es ja kein richtiger ist), der versetzt die CPU doch schon immer mit den Halt Kommandos in den Suspend, somit ist die Frage was du damit bezwecken willst? Mach einfach gar nix und du erreichst das gleiche...

Auch ist die Frage des reaktivierens aus dem Modus. Im Normalfall holt nur ein Hardwareereignis die CPU aus dem Halt Zustand wieder raus - wie willst du die denn bedienen bzw. programmieren?

Codewalker 23. Mai 2006 10:32

Re: Assembler im Kernel-Mode
 
Mein Ziel ist es, die Temperatur wieder zu reduzieren, sobald sie einen bestimmten Schwellwert überschritten hat. Soll für ein unbeaufsichtigtes System sein.

Muetze1 23. Mai 2006 10:54

Re: Assembler im Kernel-Mode
 
Mit anderen Worten: Wennn die Temperatur überschritten wurde, setzt du die Priorität der anderen laufenden Prozesse runter, so dass der Idle-Task wieder mehr Prozessorzeit bekommt und damit die CPU kühler wird.

Du hast einen deutlichen Aufwand deinen Weg überhaupt zu implementieren. Zum einen arbeitest du dort auf der höchsten Ebene im Kernelbereich - ein kleiner Fehler und das System ist wech. Du musst detaillierte Kenntnisse über die Vorgehensweise des Systems in dem Bereich haben und zum anderen auch die Kenntnisse über die Auswirkungen des Halt Befehls. Auch musst du aufpassen und wissen was du tust, da du Hardwarezugriffe durchführst, welche wieder anderen Elementen missfallen könnten.
Auch ist die Frage, ob du mit Delphi in den Bereichen überhaupt noch _vernünftig_ arbeiten kannst.

Codewalker 23. Mai 2006 11:02

Re: Assembler im Kernel-Mode
 
Ich möchte es zumindest versuchen. Alllerdings glaube ich, dass ich etwas
Starthilfe brauche, weil ich nicht weiß, wie ich den Befehl in Kernel-Ebene abgebe. Was muss ich dazu in Delphi machen. Ich bin doch nicht der erste der das versucht. Hast vielleicht etwas Source for mich?

Vjay 23. Mai 2006 11:03

Re: Assembler im Kernel-Mode
 
@Muetze1
Nun eine andere Möglichkeit hat er aber auch nicht.

Er kann ja nicht seine Prozess-Priorität hochsetzen und dann sleep aufrufen, denn die abfallende Rechenzeit wird ja nicht dem IDLE-Prozess übergeben, sonden dem nächsten Programm, welches Rechenzeit anfordert.

Muetze1 23. Mai 2006 11:09

Re: Assembler im Kernel-Mode
 
Zitat:

Zitat von Vjay
Er kann ja nicht seine Prozess-Priorität hochsetzen und dann sleep aufrufen, denn die abfallende Rechenzeit wird ja nicht dem IDLE-Prozess übergeben, sonden dem nächsten Programm, welches Rechenzeit anfordert.

1. Wer sagt denn, dass er seine eigene hochsetzen soll? Dann würde der Idle Task nie zum Zuge kommen.
2. Die abfallende Rechenzeit wird dem nächsten Prozess zugeteilt - u.a. auch dem Idle Prozess. Und damit die anderen Prozesse nicht soviel Rechenzeit bekommen, diese in der Priorität herunter setzen.

Nach deiner Aussage würde der Idle Prozess nie Rechenzeit bekommen, weil nach deiner Aussage verteilt er keine Rechenzeit auf diesen. Wann würde dieser denn bei dir überhaupt zum tragen kommen?

@Codewalker:
Du kannst es gerne versuchen, aber ohne dich vorher vllt. ein halbes Jahr zum Kernel zu belesen und dann vllt. nochmal ein Vierteljahr zu Assembler, wirst du nicht weit kommen. Und Code Ausschnitte bringen dabei eh nix, wenn man nicht weiss, was sie machen und wie und in welchem Umfeld man sie abändern/einsetzen kann. Und in Delphi dies zu probieren - naja, da könntest du wirklich vielleicht der erste sein. Ansonsten gibt es hier fähige Leute im Forum die sich dazu bestimmt nochmal im Detail äussern können.

/EDIT: Nicknamen eingesetzt

himitsu 23. Mai 2006 11:11

Re: Assembler im Kernel-Mode
 
Zitat:

Mein Ziel ist es, die Temperatur wieder zu reduzieren, sobald sie einen bestimmten Schwellwert überschritten hat.
Hast du auch mal daran gedacht einfach die Kühlleistung raufzusetzen?

Am einfachsten einen temperaturgeregelten Kühler für 'ne stärkere CPU draufsetzen.

Frickeldrecktuxer_TM 23. Mai 2006 11:21

Re: Assembler im Kernel-Mode
 
@Codewalker: Warum willst du so ein Programm unbedingt selber schreiben? Je nachdem, welchen Prozessor du hast, gibt es deutlich effektivere Möglichkeiten als den HALT-State, und der wird unter NT-Systemen ohnehin benutzt, wenn gerade nichts zu tun ist. Und wenn etwas zu tun ist, sollte es auch getan werden, es ist nicht sinnvoll, möglicherweise wichtigen Prozessen einfach die Arbeitsgrundlage wegzunehmen.
Schau dir CPUCool an. Das unterstützt auch die effektiveren Kühlmodi, taktet deinen Prozessor auch temperaturgeregelt runter und ist wirklich sein Geld wert.

Olli 23. Mai 2006 11:35

Re: Assembler im Kernel-Mode
 
Assembler sollte im Kernelmode nicht benutzt werden. Nichtmal IN und OUT sollten direkt in Form der Assemblerbefehle benutzt werden. Dies hat nicht nur praktische Bedeutung (Portabilität dank HAL) sondern ist auch eine Sicherheitsfrage, genau wie die, daß im Kernelmode keine FP-Operationen verwendet werden sollen.

Wir brauchen hier auch garnicht diskutieren, ob irgendwelche Hacker in irgendwelchen e-zines schonmal gezeigt haben, daß man Assembler benutzen kann, denn das ist nicht die Frage. Die Frage ist, ob man ihn benutzen darf. Im Gegensatz zu 9x/Me, wo man anfänglich jeden Treiber fast ausschließlich in Assembler schrieb, rät MS für NT-Systeme genauso ab, wie andere Experten in Treiberfragen (zB OSR).

Zitat:

Zitat von Peter Viscarola (OSR)
DON'T EMBED ASSEMBLY LANGUAGE IN WINDOWS DRIVERS.

It's highly system specific, it's WAAAAAY too easy to THINK you know what you're doing ("it worked on DOS") but get an unexpected result (as in INT 1 versus INT 3), and it won't even compile in the x64 cross compiler.

It has NEVER been acceptable to use an INT 1 or an INT 3 or any other such convention in a Windows NT driver. Really.

[Quelle]

Ach ja, manchmal hat Assembler natürlich auch seine Bewandnis ...

Codewalker 23. Mai 2006 11:45

Re: Assembler im Kernel-Mode
 
Ich merk schon... das wird nicht so einfach. Ich habe mir auch schon CPUCool angesehen, aber ich möchte das selbst schreiben, weil ich die Funktion mit einigen anderen in mein Programm einbinden will. Dann werd ich mich da wohl durchbeißen müssen. Gibt's denn keine Beispiele zu den Stromsparmodi die CPUCool einsetzt. (Das System ist ein kleiner Server mit Xeon-Prozessor).


@Frickeldrecktuxer_TM:
Ich will den Programmen ja nicht die Arbeitsgrundlage entziehen, sondern es soll nur etwas weniger zur Verfügung stehen.

Im BIOS habe ich einen Eintrag gefunden der "Processor Throttle" heisst. Damit kann man das System in 10%-Schritten auf bis zu 50% reduzieren. Wie läuft das denn dann?

Kann man nicht Rechenzeit beanspruchen ohne zu rechen? (Ich ahne schon, nur im Kernel-Mode?) Vielleicht hat ja jemand noch einen alternativen Vorschlag, wie man das ganze halbwegs allgemeingültig lösen kann (ohne dabei auf spezielle Hardware zu setzen, wie regelbare Kühler)


@Muetze1: Hast du vielleicht einen Lesetipp dazu für mich?

Olli 23. Mai 2006 11:50

Re: Assembler im Kernel-Mode
 
Zitat:

Zitat von Codewalker
Kann man nicht Rechenzeit beanspruchen ohne zu rechen? (Ich ahne schon, nur im Kernel-Mode?)

Und genau das macht der "Idle Process" schon.

Codewalker 23. Mai 2006 11:53

Re: Assembler im Kernel-Mode
 
ja klar, nur der nimmt halt nur die Idle-Time. Ich würde den dann gern mit höherer Priorität als "Idle" ausführen. Kann man dessen Priorität nicht ändern?

Olli 23. Mai 2006 11:56

Re: Assembler im Kernel-Mode
 
Zitat:

Zitat von Codewalker
Ich würde den dann gern mit höherer Priorität als "Idle" ausführen. Kann man dessen Priorität nicht ändern?

:shock: ... der "Idle Process" ist ein Pseudoprozeß, weswegen ich ihn in Anführungszeichen gesetzt habe. Deine Frage sollte damit beantwortet sein: nein.

Frickeldrecktuxer_TM 23. Mai 2006 12:09

Re: Assembler im Kernel-Mode
 
Zitat:

Zitat von Codewalker
Gibt's denn keine Beispiele zu den Stromsparmodi die CPUCool einsetzt. (Das System ist ein kleiner Server mit Xeon-Prozessor).

Ist schon ein bisschen länger her, daß ich mich mal ansatzweise dafür interessiert habe (ich suchte eine freie (speech) Alternative zu CPUCool), aber ich habe damals nicht auf Anhieb Codebeispiele gefunden. Das heißt aber nicht, daß es keine gibt, sondern nur, daß ich nicht sonderlich viel Energie reingesteckt habe, welche zu finden ;-)

Zitat:

Zitat von Codewalker
Ich will den Programmen ja nicht die Arbeitsgrundlage entziehen, sondern es soll nur etwas weniger zur Verfügung stehen.

Untertakten wäre eine Möglichkeit. Für Mobilprozessoren wird es da mit Sicherheit gute Beispiele geben, zum Beispiel aus der Linux-Welt. Für gewöhnliche Desktop-Prozessoren oder gar Xeons, die beispielsweise nicht mit gewöhnlichen Desktop-Chipsets arbeiten möchten.

Zitat:

Zitat von Codewalker
Vielleicht hat ja jemand noch einen alternativen Vorschlag, wie man das ganze halbwegs allgemeingültig lösen kann (ohne dabei auf spezielle Hardware zu setzen, wie regelbare Kühler)

Ich rate dir einfach, einen Kühler zu nehmen, der für deinen Prozessor ausgelegt ist. Das muss nichtmal ein regelbarer sein, sondern einfach nur einer, der deinen Prozessor auch bei voller Last noch hinreichend kühlen kann.
Wie warm wird den dein Prozessor? Vielleicht erfährt man dann etwas mehr über deine Motivation, den Prozessor kühler zu halten.

enricoffo 1. Jun 2006 07:11

Re: Assembler im Kernel-Mode
 
Also man könnte doch die Taktfrequenz ändern. Wenn bei 1,7GHz die CPU-Last bei z.B. 20% liegt, könnte man doch den Multiplikator verkleinern, dann wäre die CPU z.B auf 300Mhz getaktet und würde Strom sparen. Die Auslastung wäre dann evtl. 60%...

Die Frage ist nur, wie man mit Delphi den Multiplikator ändert. Ich habe dazu nix im WWW gefunden..

Olli 1. Jun 2006 11:19

Re: Assembler im Kernel-Mode
 
Zitat:

Zitat von enricoffo
Die Frage ist nur, wie man mit Delphi den Multiplikator ändert.

... und es wäre schlimm, wenn das einem Delphi- sprich Usermodeprogramm erlaubt sein würde ...

MagicAndre1981 1. Jun 2006 11:44

Re: Assembler im Kernel-Mode
 
Zitat:

Zitat von enricoffo
Die Frage ist nur, wie man mit Delphi den Multiplikator ändert. Ich habe dazu nix im WWW gefunden..

garnicht, dass geht nur im Kernelmode mit dem WRMSR-Befehl. Im Usermode gibts eine schöne Exception (priveligierte Operation :zwinker: ).

enricoffo 1. Jun 2006 12:09

Re: Assembler im Kernel-Mode
 
Also mit Asm geht das?
Naja, man kann doch mit der giveio.sys oder mit der uallCollecton direkt auf die Hardware zugreifen, oder?

thetrue 1. Jun 2006 12:32

Re: Assembler im Kernel-Mode
 
Zitat:

Zitat von Codewalker
Hallo zusammen.

Ich möchte gerne bei meinem Rechner die Leistung verringern indem ich ein HALT-Kommando an die CPU sende.

Delphi-Quellcode:
asm
  HLT ; thx to Frickel[...]TM
end;
In diesem Thread habe ich schon erfahren, dass dies wohl ein privilegiertes Kommando ist und nur aus Ring0 (= Kernel) gesendet werden kann und wurde dabei auf die uAllCollection verwiesen. Leider hat mir das nicht wirklich weitergeholfen. Kennt sich jemand mit der uAllCollection aus oder kann mir sagen, wie ich das realisieren kann? :gruebel:

der befehlt hlt von assembler hält die CPU an, die verarbeitet dann nichts weiter ;)

enricoffo 1. Jun 2006 12:42

Re: Assembler im Kernel-Mode
 
Hi,

ich will die CPU ja nicht anhalten, ich will sie runtertakten.
Hat da jmd ein Codebeispiel oder eine WWW-Adresse zu?

MagicAndre1981 1. Jun 2006 12:53

Re: Assembler im Kernel-Mode
 
das ist für jede CPU anders. Du musst das MSR (modelspefic register) und die Werte kennen, die den jeweiligen Multiplikator festlegen.

enricoffo 1. Jun 2006 12:58

Re: Assembler im Kernel-Mode
 
Gibt es noch ne andere Möglichkeit?
FSB ändern oder so?

MagicAndre1981 1. Jun 2006 12:59

Re: Assembler im Kernel-Mode
 
Für den FSB musste den PLL kennen, der auf dem Mainboard verbaut ist und wissen wie der angespeuert wird.

Olli 1. Jun 2006 13:48

Re: Assembler im Kernel-Mode
 
Zitat:

Zitat von enricoffo
Naja, man kann doch mit der giveio.sys oder mit der uallCollecton direkt auf die Hardware zugreifen, oder?

Ich krieg gleich nen Herzkasper :shock: :shock: :shock:

Klar, man kann auch gleich einen Treiber schreiben, der einen von dir zu erfindenden Binärcode als Interpreter auswertet um jede beliebige Aktion immer gleich im Kernelmode auszuführen .... :shock:

Zitat:

Zitat von enricoffo
Hat da jmd ein Codebeispiel oder eine WWW-Adresse zu?

Ich hoffe nicht! Wenn jemand ohne Grundwissen auch noch im KM rumfrickelt, na dann gute Nacht ... :?

Zitat:

Zitat von enricoffo
Gibt es noch ne andere Möglichkeit?
FSB ändern oder so?

Ja, im BIOS. Einfach neu starten und umstellen. :wall:

Sag mal, du hast dich noch nicht gefragt, wie es kommt, daß du immer eine simple Lösung willst, egal was dir gerade vorgeschlagen wird?

Geh doch bitte erstmal Hausaufgaben machen ...


Ist doch wahr! :roll: :|

Vjay 1. Jun 2006 15:16

Re: Assembler im Kernel-Mode
 
Zitat:

Zitat von Olli
erstmal Hausaufgaben machen ...

Und wenn das seine Hausaufgabe ist? Dann hast du soeben eine Endlosschleife erzeugt :shock:

:freak:

Muetze1 1. Jun 2006 15:18

Re: Assembler im Kernel-Mode
 
Mit anderen Worten: es fehlt ihm hier an grundlegendem Wissen, somit ist die Diskussion hier nicht gross von Nutzen.

Olli 1. Jun 2006 15:25

Re: Assembler im Kernel-Mode
 
Zitat:

Zitat von Muetze1
Mit anderen Worten: es fehlt ihm hier an grundlegendem Wissen, somit ist die Diskussion hier nicht gross von Nutzen.

Jupp, aber nicht vergessen, es ist nicht Codewalker (also der ursprüngliche Fragesteller).

Muetze1 1. Jun 2006 16:07

Re: Assembler im Kernel-Mode
 
Zitat:

Zitat von Muetze1
Mit anderen Worten: es fehlt ihm hier an grundlegendem Wissen, somit ist die Diskussion hier nicht gross von Nutzen.

/EDIT: Richtig, nicht auf CodeWalker bezogen sondern auf enricoffo...

/EDIT2: Juhu verklickt... *peinlich* :oops: :wall:

Codewalker 1. Jun 2006 16:42

Re: Assembler im Kernel-Mode
 
Oh mann. Ich hätte nicht gedacht, dass ich da so was lostrete. Da fehlt es wohl an generellem Material darüber....
Ich werd mich damit jetzt mal ein wenig befassen, auch wenn ich nicht wirklich weiß, wo ich anfangen soll. :gruebel:

Zitat:

Zitat von Olli
Jupp, aber nicht vergessen, es ist nicht Codewalker (also der ursprüngliche Fragesteller).

Danke :wink:

enricoffo 2. Jun 2006 08:25

Re: Assembler im Kernel-Mode
 
@Olli
Zitat:

Geh doch bitte erstmal Hausaufgaben machen ...
Kein Grund gleich so auszurasten. Das waren nur Gedanken. Im übrigen habe ich dazu eine Umsetzung in Delphi gefunden, bei der die GiveIO.sys verwendet wird.

Mich hat das ganze einfach interessiert. Im übrigen habe ich unter DOS mit Assembler gearbeitet und mir ist auch klar, was direkter Zugriff auf die Hardware unter Windows bedeutet.

Trotzdem danke für die schnellen Antworten.

NicoDE 2. Jun 2006 09:19

Re: Assembler im Kernel-Mode
 
Zitat:

Zitat von Olli
Klar, man kann auch gleich einen Treiber schreiben, der einen von dir zu erfindenden Binärcode als Interpreter auswertet um jede beliebige Aktion immer gleich im Kernelmode auszuführen .... :shock:

.NET?
(;))

Muetze1 2. Jun 2006 09:19

Re: Assembler im Kernel-Mode
 
Zitat:

Zitat von enricoffo
Kein Grund gleich so auszurasten. Das waren nur Gedanken. Im übrigen habe ich dazu eine Umsetzung in Delphi gefunden, bei der die GiveIO.sys verwendet wird.

Es war ein freundlicher Hinweis - ausgerastet ist doch keiner hier.

Zitat:

Zitat von enricoffo
Mich hat das ganze einfach interessiert. Im übrigen habe ich unter DOS mit Assembler gearbeitet und mir ist auch klar, was direkter Zugriff auf die Hardware unter Windows bedeutet.

RealMode oder Protected Mode oder nur das FLAT Modell?

enricoffo 2. Jun 2006 09:47

Re: Assembler im Kernel-Mode
 
Also dann ist gut. Unter Dos habe ich mit Asm programmiert wo es langsam mit protected mode losging, als im realmode. Das war auf 80386, bei 80486 kamen ja noch ein paar sachen dazu und da war ich einfach nur zu faul damit weiterzumachen. Dank dem Turbopascal bin ich ja dann auf bei Delphi gelandet. Obwohl ich glaube, das man mit C/C++ mehr machen kann und auch mehr dazu im Inet findet. Leider bin ich zu dusselig für C, das wirkt auf mich durch die ganzen Klammern so kompliziert...


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz