commanderkeen hat geschrieben:Hallo Ihr lieben!
Mich interessiert es schon länger ob jemand von euch Heute als Alternative zu Windows Linux nutzt?
Wir sind alle DOS Freunde. DOS ist ja auch Microsoft.
Nutzt Ihr heute auch alle Windows (weil Microsoft) oder haben einige von euch auch Linux?
Ich steige jetzt um auf Linux Mint da Windows Vista mich immer mehr in den Wahnsinn treibt. Mal sehen ob es besser wird
Wer von euch nutzt also noch Linux?
Ja ich benutze Linux. Eine Weile habe ich Debian(von Platte gebootet) benutzt und zur Zeit benutze ich Knoppix von CD als Router.
Für Linux bekomme ich Hilfe von meinen Neffen (wenn er mal Zeit hat).
..
Erste Anwendungen für Linux und dem dortigen Framebuffer-Device(fb0) machte ich auf einen/bzw. zwei Rechner mit jeweils einem AMD K6-2@550mhz. Zum Assemblieren benutze ich dort NASM. Zum Booten von Linux muss dafür der Framebuffer(fb0) mit 1024x768x32 verwendet werden. Bei Knoppix gibt es dafür eine Boot-Option um den Framebuffer mit 1024x768x32 zu verwenden. Das klappt mit einer dafür verwendeten MATROX-Grafikkarte ohne Probleme. Mit anderen Grafikkarten zB. einer GF4 bekam ich jedoch nur 24Bit-Truecolor mit dem FB-Device.
Wie man dort ebenfalls 32Bit-Truecolor für das FB-Device einschaltet habe ich noch nicht herausgefunden. Warum heute überhaupt noch 24Bit-Truecolor-Modi verwendet werden ist mir ein Rätsel, da doch z.B eine GF4 mit 64MB genug Speicher mitbringt im Vergleich der von mir verwendete Matrox-Grafikkarte mit nur 4MB.
Meine Anwendungen konnten hierbei sogar den Linux-Desktop des X-Servers überschreiben, das war schon etwas komisch. Ich glaube das so etwas mit den neueren Knoppix-Versionen aber nicht mehr geht.
So ist es zweckmässig nur die Konsole(in 1024x768x32) mit dem Framebuffer(fb0) zu verwenden.
Im folgenden Verlauf werden zwei kleine Anwendungen gezeigt für zwei Linux-Rechner die über Netzwerk(*) miteinander verbunden sind. Beide Rechner zusammen berechnen ein Fraktalbild und einer der beiden Rechner zeigt das Bild am Monitor.
Die Berechnung erfolgt zeilenweise und nach jeder Zeile überträgt der eine Rechner seine berechnete Bildzeile zum anderen Rechner der ebenfalls eine Bildzeile berechnet und dann beide Zeilen am Bildschirm anzeigt, so das man den Verlauf der Berechnung unmittelbar sehen kann.
Im Vergleich dazu kann man auch nur einen einzigen Rechner zur Berechnung verwenden, das dauert dann aber ungefähr doppelt so lange bis das komplette Bild bis unten berechnet ist.
(*) Beide Rechner verwenden für das verwendete TCP-Netzwerk jeweils eine feste IP-Adresse. Die Namen der beiden Anwendungen (SERVERFRAK und CLIENTFRAK) sind etwas verwirrend, da hier nur eine Netzwerkverbindung etabliert wird und beide Rechner hierbei gleichberechtigt sind.
Die Namen dienen folglich nur zur Unterscheidung der verschiedenen Anwendungen. Im "CLIENTFRAK" ist die IP-Adresse des anderen Rechners unter "sadin DW 2, 4330h, 0A8C0h, 200h, 0, 0, 0, 0" im
BIG-Endian-Format eingetragen: "0A8C0h, 200h" = IP: 192.168.0.2.
Das "SERVERFRAK" muss zuerst gestartet werden damit die Netzwerkverbindung etabliert werden kann und Daten über das Netwerk übertragen werden können.
Code: Alles auswählen
;----------------------------------------------------------------------------
; SERVER - F r a k t a l
; Frame Buffer(fb0): 1024x768x32 Bit True color
;
; OS: Linux
; Tool: mc (midnight comander)
; Editor: /usr/bin/mcedit (oder F4-Taste)
; assemble: nasm -f elf -o SERVERFRAK.o SERVERFRAK.ASM
; link: ld -s -o SERVERFRAK SERVERFRAK.o
; start: ./SERVERFRAK
;----------------------------------------------------------------------------
%define MaxX 400h
%define MaxY 300h
%define Cachesize (MaxX*4)
%define Zoom 20000
%define Teiler 1000000000
%define Pos_X1 99981950-Zoom
%define Pos_Y1 765290000+Zoom
%define Pos_X2 99982000+Zoom
%define Pos_Y2 765289950-Zoom
%define Iteration 3000
section .text
global _start
_start:
mov eax, 102 ; syscall nr: socketcall
mov ebx, 1 ; socketcall-type: socket()
mov ecx, sockopts ; options von socket()
int 80h
mov [bindopts], eax ; fd schonmal als arg fuer connect...
mov eax, 102 ; wieder socketcall
mov ebx, 2 ; socketcall-type: bind()
mov ecx, bindopts ; options von connect()
int 80h ; bind()et
mov eax, 102 ; you got it: socketcall
mov ebx, 4 ; socketcall-type: listen()
mov ecx, [bindopts] ; socket holen
mov [cadin], ecx ; socket in options packen
mov DWORD [cadin + 4], 1 ; backlog
mov ecx, cadin ; optionen...
int 80h ; listen now
mov eax, 102 ; jaja, socketcall :)
mov ebx, 5 ; socketcall-type: accept()
mov DWORD [bindopts + 4], cadin ; nicht mehr sadin sondern jetzt cadin
mov DWORD [bindopts + 8], casize ; in cadin kommt die client-ip
mov ecx, bindopts ; und der sourceport rein;
int 80h ; wartet bis jemand verbunden hat und gibt dann
mov [FD], eax
;----------------------------------------------
finit ; Floating-Point-Unit initialisieren
fild DWORD [VIER]
fstp st7 ; 4.0
fild DWORD [A]
fidiv DWORD [Z]
fchs
fstp DWORD [A1]
fild DWORD [B]
fidiv DWORD [Z]
fchs
fstp DWORD [B1]
fild DWORD [C]
fidiv DWORD [Z]
fstp DWORD [C1]
fild DWORD [D]
fidiv DWORD [Z]
fstp DWORD [D1]
fld DWORD [D1]
fsub DWORD [C1]
fidiv DWORD [YMAX]
fstp DWORD [G] ; G = (D-C)/YMAX
fld DWORD [B1]
fsub DWORD [A1]
fidiv DWORD [XMAX]
fstp DWORD [F] ; F = (B-A)/XMAX
;--------------------------------------
mov ecx, A ; Parameter senden
mov edx, Parasize
call SEND
;--------------------------------------
xor eax, eax
xor edx, edx ; erste Zeile
F1: xor ebx, ebx ; erste Spalte
mov esi, FRAMECACHE
FRAK: xor ecx, ecx
fld DWORD [G] ; Fraktal-Berechnung
fimul DWORD [Y]
fadd DWORD [C1]
fst st1 ; K = G * Y + C
fstp st2 ; J = K
fld DWORD [F]
fimul DWORD [X]
fadd DWORD [A1]
fst st3 ; I = F * X + A
fstp st4 ; H = I
fld st1 ; st(2-1)
fmul st0, st2
fstp st5 ; L = J * J
fld st3 ; st(4-1)
fmul st0, st4
fstp st6 ; M = H * H
FRAKIN: cmp ecx, Iteration
ja short PIXEL
inc ecx
fld st3 ; st(4-1)
fadd st0, st4
fmul st0, st2
fadd st0, st1
fstp st2 ; J = 2 * H * J + K
fld st5 ; st(6-1)
fsub st0, st5
fadd st0, st3
fstp st4 ; H = M - L + I
fld st1 ; st(2-1)
fmul st0, st2
fstp st5 ; L = J * J
fld st3 ; st(4-1)
fmul st0, st4
fst st6 ; M = H * H
fadd st0, st5 ; M + L
fcomp st7
fstsw ax
test ah, 1
jnz FRAKIN
;---------
PIXEL: inc ebx
mov edi, ecx
mov ebp, ecx
and ecx, 7 ; blau
and edi, 18h ; gruen
and ebp, 0E0h ; rot
shl ecx, 5
shl edi, 0Bh
shl ebp, 10h
or ecx, edi
or ecx, ebp
mov [esi], ecx ; Pixel setzen
inc DWORD [X]
add esi, 4
cmp ebx, MaxX ; Spalte
jb FRAK
;--------
call SENDLINE ; Zeile senden
;--------
add edx, 2
add DWORD [Y], 2 ; Zeile überspringen
mov DWORD [X], 0
cmp edx, MaxY ; Zeile
jb F1
;--------------------------------------
ERROR:
;--------------------------------------
section .fini ; fini wird am ende ausgefuehrt, wenn man nicht
mov eax, 1 ; vorher mit syscall 1 (exit) ausgestiegen ist
xor ebx, ebx
int 80h ; exit
;-----SUB------------------------------
SEND: mov ebx, [FD]
mov eax, 4
int 80h ; in socket schreiben
ret
;--------------------------------------
SENDLINE: mov ebp, edx
mov edx, MaxX
mov ecx, FRAMECACHE
call SEND
mov edx, MaxX
mov ecx, FRAMECACHE+MaxX
call SEND
mov edx, MaxX
mov ecx, FRAMECACHE+(MaxX*2)
call SEND
mov edx, MaxX
mov ecx, FRAMECACHE+(MaxX*3)
call SEND
mov edx, ebp
ret
;---------------------------------------------------------------------------
section .data
A DD Pos_Y1
A1 DD 0
B DD Pos_Y2
B1 DD 0
C DD Pos_X1
C1 DD 0
D DD Pos_X2
D1 DD 0
G DD 0
F DD 0
Z DD Teiler
X DD 0
Y DD 0
XMAX DD MaxX
YMAX DD MaxY
VIER DD 4
Parasize equ $ - A
;--------------------
sockopts DD 2, 1, 0
bindopts DD 0, sadin, 10h
sadin DW 2, 4330h, 0, 0, 0, 0, 0
cadin times 8 DW 0
casize DD 10h
FD DD 0
;---------------------------------------------------------------------------
section .bss
FRAMECACHE resb Cachesize
;---------------------------------------------------------------------------
Code: Alles auswählen
;----------------------------------------------------------------------------
; CLIENT F r a k t a l
; Frame Buffer: 1024x768x32 Bit True color
;
; OS: Linux
; Tool: mc (midnight comander)
; Editor: /usr/bin/mcedit (oder F4-Taste)
; assemble: nasm -f elf -o CLIENTFRAK.o CLIENTFRAK.ASM
; link: ld -s -o CLIENTFRAK CLIENTFRAK.o
; start: ./CLIENTFRAK
;----------------------------------------------------------------------------
%define MaxX 400h
%define MaxY 300h
%define Mapsize (MaxX*MaxY*4)
%define Iteration 3000
section .text
global _start ; entry point exportieren
_start:
call CONNECT ; client
mov ecx, A ; Parameter dahin lesen
mov edx, Parasize ; max 1024 bytes lesen
call SOCKREAD
cmp DWORD [A], 0
jnz short P0
jmp ERROR
;--------------------------------------
P0: call MAP_FB ; mmap
;--------------------------------------
call READLINE ; erste Zeile holen
;--------------------------------------
inc DWORD [Y] ; zweite Zeile
mov edx, 1 ; zweite Zeile
xor eax, eax
finit ; Floating-Point-Unit initialisieren
fild DWORD [VIER]
fstp st7 ; 4.0
F1: xor ebx, ebx ; erste Spalte
FRAK: xor ecx, ecx
fld DWORD [G] ; Fraktal-Berechnung
fimul DWORD [Y]
fadd DWORD [C1]
fst st1 ; K = G * Y + C
fstp st2 ; J = K
fld DWORD [F]
fimul DWORD [X]
fadd DWORD [A1]
fst st3 ; I = F * X + A
fstp st4 ; H = I
fld st1 ; st(2-1)
fmul st0, st2
fstp st5 ; L = J * J
fld st3 ; st(4-1)
fmul st0, st4
fstp st6 ; M = H * H
FRAKIN: cmp ecx, Iteration
ja short PIXEL
inc ecx
fld st3 ; st(4-1)
fadd st0, st4
fmul st0, st2
fadd st0, st1
fstp st2 ; J = 2 * H * J + K
fld st5 ; st(6-1)
fsub st0, st5
fadd st0, st3
fstp st4 ; H = M - L + I
fld st1 ; st(2-1)
fmul st0, st2
fstp st5 ; L = J * J
fld st3 ; st(4-1)
fmul st0, st4
fst st6 ; M = H * H
fadd st0, st5 ; M + L
fcomp st7
fstsw ax
test ah, 1
jnz short FRAKIN
;---------
PIXEL: inc ebx
mov edi, ecx
mov ebp, ecx
and ecx, 7 ; blau
and edi, 18h ; gruen
and ebp, 0E0h ; rot
shl ecx, 5
shl edi, 0Bh
shl ebp, 10h
or ecx, edi
or ecx, ebp
mov [esi], ecx ; Pixel setzen
inc DWORD [X]
add esi, 4
cmp ebx, MaxX ; Spalte
jb FRAK
;--------
call READLINE ; Zeile holen
;--------
add edx, 2
add DWORD [Y], 2
mov DWORD [X], 0
cmp edx, MaxY ; Zeile
jb F1
;--------------------------------------
ERROR:
;--------------------------------------
section .fini ; fini wird am ende ausgefuehrt, wenn man nicht
mov eax, 1 ; vorher mit syscall 1 (exit) ausgestiegen ist
xor ebx, ebx
int 80h ; exit
;--------------------------------------
CONNECT: mov eax, 102 ; syscall nr: socketcall
mov ebx, 1 ; socketcall-type: socket()
mov ecx, sockopts ; options von socket()
int 80h
mov [connopts], eax ; fd schonmal als arg fuer connect...
mov eax, 102 ; wieder socketcall
mov ebx, 3 ; socketcall-type: connect()
mov ecx, connopts ; options von connect()
int 80h
ret
;----------------------------
SOCKREAD: mov ebx, [connopts] ; socket, jetzt wie fd zu benutzen...
mov eax, 3 ; Syscall nr: read
int 80h ; einlesen
ret
;----------------------------
READLINE: mov edi, edx ; Zeile holen(edx retten)
mov ebp, 4
S0: mov edx, MaxX ; max 1024 bytes lesen
mov ecx, esi
W1: call SOCKREAD
cmp eax, -1
jz short OK
cmp eax, edx
jz short OK
sub edx, eax
add ecx, eax
jmp short W1
OK: add esi, MaxX
dec ebp
jnz short S0
mov edx, edi
ret
;--------------------------------------
MAP_FB: mov eax, 5 ; syscall nr: open
xor edx, edx
mov ebx, DEVICE ; pointer/offset auf File/Device-Name
mov ecx, 2 ; /usr/include/bits/fcntl.h = O_RDWR
int 80h
mov [FD], eax ; File discriptor
mov ebx, MMAP
mov eax, 5Ah ; mmap(90)
int 80h
mov esi, eax ; pointer mmap-FRAMEBUFFER
ret
;---------------------------------------------------------------------------
section .data
A DD 0 ; Pos_Y1
A1 DD 0
B DD 0 ; Pos_Y2
B1 DD 0
C DD 0 ; Pos_X1
C1 DD 0
D DD 0 ; Pos_X2
D1 DD 0
G DD 0
F DD 0
Z DD 0
X DD 0
Y DD 1
XMAX DD 0
YMAX DD 0
VIER DD 0
Parasize equ $ - A
;--------------------------------------
DEVICE DB "/dev/fb0", 0, 0, 0, 0
MMAP: DD 0 ; start - suggest memory address to allocate
DD Mapsize ; length
DD 3 ; prot (PROT_READ + PROT_WRITE)
DD 1 ; flags (MAP_SHARED = 1)
FD: DD 0 ; file discriptor(handle)
DD 0 ; offset into file to start reading
;--------------------------------------
sockopts DD 2, 1, 0
connopts DD 00, sadin, 10h
sadin DW 2, 4330h, 0A8C0h, 200h, 0, 0, 0, 0
;---------------------------------------------------------------------------
Dirk