Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70 porta il concetto di smartphone ultrasottile su un terreno più concreto e accessibile: abbina uno spessore sotto i 6 mm a una batteria di capacità relativamente elevata, un display pOLED da 6,7 pollici e un comparto fotografico triplo da 50 MP. Non punta ai record di potenza, ma si configura come alternativa più pragmatica rispetto ai modelli sottili più costosi di Samsung e Apple
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026
Sono molte le novità che ASUS ha scelto di presentare al CES 2026 di Las Vegas, partendo da una gamma di soluzioni NUC con varie opzioni di processore passando sino agli schermi gaming con tecnologia OLED. Il tutto senza dimenticare le periferiche di input della gamma ROG e le soluzioni legate alla connettività domestica
Le novità ASUS per il 2026 nel settore dei PC desktop
Le novità ASUS per il 2026 nel settore dei PC desktop
Molte le novità anticipate da ASUS per il 2026 al CES di Las Vegas: da schede madri per processori AMD Ryzen top di gamma a chassis e ventole, passando per i kit di raffreddamento all in one integrati sino a una nuova scheda video GeForce RTX 5090. In sottofondo il tema dell'intelligenza artificiale con una workstation molto potente per installazioni non in datacenter
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 13-01-2005, 18:27   #1
anx721
Senior Member
 
L'Avatar di anx721
 
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
[C] Zona di memoria "sicura"

Salve,

sapete se c'è un modo per porre delle variaili di un programma in una zona di memoria 'sicura', in cui non ci possano essere accessi illegali, ad esempio evitando che si acceda a quella zona al di fuori di una funzione?

Il mio obiettivo è registrare una funzione che viene richiamata se si genera un segmentation fault; in C ciò è possibile registrando una funzione come handler per il segnale di segmentation fault; quando l'errore si verifica, la funzione viene eseguita, ad esempio tale funzione puo semplicemente stampare una stringa del tipo:

"C'è stato un errore di segmentation fault".

Il prolema è pero che se il segmentation fault si è verificato, alcuni dati del programma possono essere stati alterati, quindi la stessa stringa può essere stata danneggiata...il mio scopo era allora far in modo che non si potesse accedere all'aria di memoria che corrisponde a quella stringa, al di fuori della funzione handler, in modo che quella variabile non venga di sicuro alterata.

Come si puo fare?

Ciao e grazie.
__________________
Sun Certified Java Programmer
EUCIP Core Level Certified

European Certification of Informatics Professionals
anx721 è offline   Rispondi citando il messaggio o parte di esso
Old 14-01-2005, 08:51   #2
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
This function changes the access protection on a region of committed pages in the virtual address space of the calling process.

BOOL VirtualProtect(
LPVOID lpAddress,
DWORD dwSize,
DWORD flNewProtect,
PDWORD lpflOldProtect
);
Parameters
lpAddress
[in] Pointer to the base address of the region of pages whose access protection attributes are to be changed.

All pages in the specified region must be allocated in a single call to the VirtualAlloc function.

The pages cannot span adjacent regions that were allocated by separate calls to VirtualAlloc.
dwSize
[in] Specifies the size, in bytes, of the region whose access protection attributes are to be changed.

The region of affected pages includes all pages containing one or more bytes in the range from the lpAddress parameter to lpAddress+dwSize. This means that a 2-byte range straddling a page boundary causes the protection attributes of both pages to be changed.
flNewProtect
[in] Specifies the new access protection.

You can specify any one of the following flags, along with the PAGE_GUARD and PAGE_NOCACHE protection modifier flags, as necessary.
Value Description
PAGE_READONLY Enables read access to the committed region of pages.

An attempt to write to the committed region results in an access violation.

If the system differentiates between read-only access and execute access, an attempt to execute code in the committed region results in an access violation.
PAGE_EXECUTE Enables execute access to the committed region of pages.

An attempt to read or write to the committed region results in an access violation.
PAGE_EXECUTE_READ Enables execute and read access to the committed region of pages.

An attempt to write to the committed region results in an access violation.
PAGE_GUARD Pages in the region become guard pages.

An attempt to access a guard page causes the system to raise a STATUS_GUARD_PAGE exception and turn off the guard page status. Guard pages thus act as a one-shot access alarm.

The PAGE_GUARD flag is a page protection modifier. An application uses it with one of the other page protection flags, with one exception: it cannot be used with PAGE_NOACCESS.

When an access attempt leads the system to turn off guard page status, the underlying page protection takes over.

If a guard page exception occurs during a system service, the service typically returns a failure status indicator.
PAGE_NOACCESS Disables all access to the committed region of pages.

An attempt to read from, write to, or execute in the committed region results in an access violation exception, called a general protection (GP) fault.
PAGE_NOCACHE Allows no caching of the committed regions of pages.

The hardware attributes for the physical memory should be specified as no cache. This is not recommended for general use. It is useful for device drivers; for example, mapping a video frame buffer with no caching.

This flag is a page protection modifier and is valid when used with a page protection other than PAGE_NOACCESS.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 14-01-2005, 09:22   #3
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Re: [C] Zona di memoria "sicura"

Quote:
Originariamente inviato da anx721
Il prolema è pero che se il segmentation fault si è verificato, alcuni dati del programma possono essere stati alterati, quindi la stessa stringa può essere stata danneggiata...il mio scopo era allora far in modo che non si potesse accedere all'aria di memoria che corrisponde a quella stringa, al di fuori della funzione handler, in modo che quella variabile non venga di sicuro alterata.

Come si puo fare?
Utilizzando una zona di memoria a sola lettura. Una stringa const char * dovrebbe essere posta in .rodata, ma non è garantito (credo stia al buon senso del compilatore). Puoi allocare un pò di memoria tramite mmap privato, inizializzarla, e poi renderla a sola lettura tramite mprotect. E' un pò il modo illustrato da Cionci per sistemi win32.
La man page di mprotect mostra un esempio tramite malloc+mprotect (ti consiglio comunque di usare mmap al posto della malloc).
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 14-01-2005, 16:00   #4
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Ah...cavolo non avevo pensato se era per Windows o per Linux
Anzi credo che fosse proprio per Linux...visto il "Segmentation Fault"...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 14-01-2005, 16:35   #5
anx721
Senior Member
 
L'Avatar di anx721
 
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
Grazie,

ho capito l'esempio di mrotect+malloc, ma non ho capito a che serve mmap e come dovrei usarla al posto di malloc
__________________
Sun Certified Java Programmer
EUCIP Core Level Certified

European Certification of Informatics Professionals
anx721 è offline   Rispondi citando il messaggio o parte di esso
Old 14-01-2005, 16:36   #6
anx721
Senior Member
 
L'Avatar di anx721
 
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
Quote:
Originariamente inviato da cionci
Ah...cavolo non avevo pensato se era per Windows o per Linux
Anzi credo che fosse proprio per Linux...visto il "Segmentation Fault"...
in realtà se riuscissi a farla per entrambi sarebbe meglio
__________________
Sun Certified Java Programmer
EUCIP Core Level Certified

European Certification of Informatics Professionals
anx721 è offline   Rispondi citando il messaggio o parte di esso
Old 14-01-2005, 16:47   #7
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da anx721
Grazie,

ho capito l'esempio di mrotect+malloc, ma non ho capito a che serve mmap e come dovrei usarla al posto di malloc
mmap serve a "mappare qualcosa" (file, dispositivo, memoria fisica, memoria "anonima"...) nel tuo spazio di indirizzamento.
A te serve memoria "anonima".
Questo esempio è analogo a quello che trovi nella manpage, ma fa uso di mmap:

Codice:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/mman.h>

int main(void)
{
	void *map;
	char c;
	char *p;
	map = mmap(NULL, 1024, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
	if(map==MAP_FAILED) {
		perror("mmap");
		return -1;
	}
	p = map;
	c = p[666];
	fprintf(stderr, "Read 1 ok c=%d\n", c);
	p[666] = 42;
	fprintf(stderr, "Write 1 ok\n");
	if(mprotect(p, 1024, PROT_READ)) {
		perror("mprotect");
		return -1;
	}
	c = p[666];
	fprintf(stderr, "Read 2 ok c=%d\n", c);
	p[666] = 42;
	fprintf(stderr, "Write 2 ok\n");
	munmap(map, 1024);
	return 0;
}
Dovresti ottenere un segfault sulla seconda write.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 14-01-2005, 17:19   #8
anx721
Senior Member
 
L'Avatar di anx721
 
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
Grazie per l'esempio,

volevo pero capire una cosa; leggendo la documentazione mi sembrava di capire che mprotect deve ricevere come indirizzo iniziale un indirizzo che coincide con l'inizio di una pagina di memoria (difatti nell'esempio della manpage si allineava il valore di p con il primo indirizzo multiplo di 4096 se la pagina è di 4096 bytes). mmap restituisce deirettamente un puntatore all'inizio di una pagina o anche in questo caso bisogna eseguire quell'allineamento? E poi perche conviene usare mmap al posto di malloc?

Grazie e ciao.
__________________
Sun Certified Java Programmer
EUCIP Core Level Certified

European Certification of Informatics Professionals
anx721 è offline   Rispondi citando il messaggio o parte di esso
Old 14-01-2005, 17:52   #9
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
mmap lavora solo per multipli di pagina. Anche se ho chiesto 1024 byte, alloca almeno una pagina. La memoria ovviamente è già allineata. Lo stesso per mprotect.
Quote:
E poi perche conviene usare mmap al posto di malloc?
E' solo con la mmap che il funzionamento è garantito. Da man mprotect:
Quote:
POSIX.1b says that mprotect can be used only on regions of memory obtained from mmap(2).
malloc può allocare memoria con syscall diverse da mmap (ad es. brk). Il fatto che mprotect funzioni anche con memoria ottenuta tramite brk è incidentale, e non richiesto dallo standard posix.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026 Display, mini PC, periferiche e networking: le n...
Le novità ASUS per il 2026 nel settore dei PC desktop Le novità ASUS per il 2026 nel settore de...
Le novità MSI del 2026 per i videogiocatori Le novità MSI del 2026 per i videogiocato...
I nuovi schermi QD-OLED di quinta generazione di MSI, per i gamers I nuovi schermi QD-OLED di quinta generazione di...
L'uso dell'IA nei giochi è cancer...
Meta punta sul nucleare USA per alimenta...
Le migliori offerte Amazon del weekend: ...
La crisi dell'hardware spinge i negozi g...
Apple Watch SE 3 scontato su Amazon: il ...
Robot aspirapolvere davvero scontati: si...
DDR5 troppo cara: il passato di AMD potr...
5 sconti TOP nuovi di zecca e altre offe...
Il più venduto e apprezzato: ECOV...
Era e resta un super top di gamma: il TV...
DOOGEE T10 Pro, il miglior tablet di tut...
Il miglior deumidificatore su Amazon sce...
Prosegue lo sviluppo del telescopio spaz...
28 astronauti cinesi hanno condotto un'e...
Dal Padiglione Italia al mercato globale...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 11:36.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v