🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.os.linux.programowanie
7 messages
7 total messages Started by Borneq Sat, 16 Aug 2014 19:13
Mapowanie pliku fizycznego do pamięci
#72698
Author: Borneq
Date: Sat, 16 Aug 2014 19:13
21 lines
1889 bytes
Znalazłem
http://stackoverflow.com/questions/8391094/equivalent-win-api-in-nix
gdzie opisane jest
open(2) / creat(2)
shm_open
mmap

open jako parametr ma łańcuch 8-bitowych znaków. Czy jest jakaś wersja 
16-bitowych lub działa to dla UTF8, lub też w Linuksie nie stosuje się 
nazw plików Unicode?
Teraz shm_open. W przykładzie jest tworzenie nazwy symbolicznej dla 
obszaru pamięci, która będzie wymieniana między procesami. To przydatne, 
ale teraz bardziej mi chodzi o mapowanie fizycznego pliku aby się po nim 
szybko poruszać.
Na przykład coś wyszukać od zadanego adresu, nie wiadomo od razu w jakim 
obszarze, gdy drugi raz wczytywałbym ze strumienia do bufora, to kłopot 
na granicy między jednym blokiem a drugim. Trzeba by użyć bardzo dużego 
bufora, ale aby uniknąć wczytywania wszystkiego do bufora lepiej zamapować.
Czy jest taka możliwość? Czy plik może mieć adresowanie 64 bitowe i czy 
jest jak w Windows możliwość wybrania 32 bitowego obszaru wewnątrz pliku 
z pewnym wyrównaniem? W Windows 8 jest wyrównanie do 64 KiB
Re: Mapowanie pliku fizycznego do pamięci
#72699
Author: Borneq
Date: Sat, 16 Aug 2014 19:30
8 lines
1253 bytes
W dniu 2014-08-16 o 21:13, Borneq pisze:
> Znalazłem
> open(2) / creat(2)
> open jako parametr ma łańcuch 8-bitowych znaków. Czy jest jakaś wersja

Jak pobrać wielkość pliku otwartego przez open()? Jeżeli chodzi o fopen 
działające na FILE, to tak trzeba użyć seek na koniec a potem zapytać 
się o pozycję, a jeżeli chodzi o open()?
Re: Mapowanie pliku fizycznego do pamięci
#72703
Author: Adam Osuchowski
Date: Sat, 16 Aug 2014 20:03
31 lines
2678 bytes
Borneq wrote:
> open jako parametr ma łańcuch 8-bitowych znaków. Czy jest jakaś wersja 
> 16-bitowych lub działa to dla UTF8, lub też w Linuksie nie stosuje się nazw 
> plików Unicode?

Dla kernela linuksowego na poziomie systemu plików nie ma znaczenia
kodowanie znaków. Nazwa pliku jest po prostu ciągiem 8-bitowych bajtów,
przy czym żaden z nich nie może być równy 0x2f (separator katalogów w
ścieżce) i 0x00 (znacznik końca łańcucha). To jakie znaki odpowiadają
poszczególnym bajtom lub sekwencjom bajtów leży w gestii userspaceowej
aplikacji (zazwyczaj i tak nie ma to dla niej większego znaczenia) i
samego użytkownika.

> Teraz shm_open. W przykładzie jest tworzenie nazwy symbolicznej dla obszaru 
> pamięci, która będzie wymieniana między procesami. To przydatne, ale teraz 
> bardziej mi chodzi o mapowanie fizycznego pliku aby się po nim szybko 
> poruszać.
> Na przykład coś wyszukać od zadanego adresu, nie wiadomo od razu w jakim 
> obszarze, gdy drugi raz wczytywałbym ze strumienia do bufora, to kłopot na 
> granicy między jednym blokiem a drugim. Trzeba by użyć bardzo dużego 
> bufora, ale aby uniknąć wczytywania wszystkiego do bufora lepiej zamapować.
> Czy jest taka możliwość? Czy plik może mieć adresowanie 64 bitowe i czy 
> jest jak w Windows możliwość wybrania 32 bitowego obszaru wewnątrz pliku z 
> pewnym wyrównaniem? W Windows 8 jest wyrównanie do 64 KiB

Chyba nie bardzo rozumiem jaki masz problem i o co chodzi z tym dużym
buforem. Mógłbyś to opisać jaśniej?
mmap() mapuje obszar pliku (w szczególności cały plik) w pamięci pod
zadanym przez użytkownika lub ustalonym automatycznie przez system adresem.
Na systemie 64-bitowym ten adres będzie oczywiście 64-bitowy. Wyrównanie
jest realizowane do granicy strony pamięci, czyli na x86 i x86-64 do 4 KiB.
Re: Mapowanie pliku fizycznego do pamięci
#72700
Author: Adam Osuchowski
Date: Sat, 16 Aug 2014 20:04
8 lines
1125 bytes
Borneq wrote:
> Jak pobrać wielkość pliku otwartego przez open()? Jeżeli chodzi o fopen 
> działające na FILE, to tak trzeba użyć seek na koniec a potem zapytać się o 
> pozycję, a jeżeli chodzi o open()?

fstat()

http://pubs.opengroup.org/onlinepubs/9699919799/functions/fstat.html
Re: Mapowanie pliku fizycznego do pamięci
#72704
Author: Borneq
Date: Sun, 17 Aug 2014 06:41
29 lines
2585 bytes
W dniu 2014-08-16 o 22:03, Adam Osuchowski pisze:
> Chyba nie bardzo rozumiem jaki masz problem i o co chodzi z tym dużym
> buforem. Mógłbyś to opisać jaśniej?

Właśnie robię komponent do podglądu wielkich plików, które nie będą 
ładowane w całości do pamięci. Na przykład pliki do kilkugigowe dumpy w 
postaci XML. Robię to z użyciem biblioteki FLTK więc przenośnie 
Linux<>Windows
Pierwsze podejście było strumeniowe z użyciem plików i seek.
Gdy poruszam suwakiem, wybieram pozycję w pliku np. 50% pliku, 100% 
czyli koniec. Gdy mam jakąś pozycję, w obsłudze PAINT muszę cofnąć się 
do początku linii, czasem też o kilka, nawet 40 linii gdy wyświetlam 
koniec pliku.
Przeważnie do wyświetlania 40 linii po 100 znaków wystarcza bufor 4 kilo 
do którego ładuję, jednak co gdy linie będą dłuższe? Drugi raz ładować 
mam ze strumienia do bufora i jeszcze raz? Co gdy na granicy części 
ładowanych będzie windowsowy znak podziału linii 13,10?
Chyba że od razu będę używał bufora gdzie zmieści się 40 najdłuższych 
linii, ale mogą być bardzo długie (np. plik może być binarny)

> mmap() mapuje obszar pliku (w szczególności cały plik) w pamięci pod
> zadanym przez użytkownika lub ustalonym automatycznie przez system adresem.

A jak go uzyć? Jako parametr ma uchwyt otwarty przez open()?
http://man7.org/linux/man-pages/man2/mmap.2.html
void *mmap(void *addr, size_t length, int prot, int flags,           int 
fd, off_t offset);
addr może być NULL?, lengh to 32 bitowa wartość, prot to PROT_READ?
offset to 64 bitowy początek mapowania w pliku?
Re: Mapowanie pliku fizycznego do pamięci
#72701
Author: PawelS cbrbob(at)wbcd(dot)pl
Date: Sun, 17 Aug 2014 17:48
13 lines
1533 bytes
Adam Osuchowski pisze:
> Borneq wrote:
>> Jak pobrać wielkość pliku otwartego przez open()? Jeżeli chodzi o fopen 
>> działające na FILE, to tak trzeba użyć seek na koniec a potem zapytać się o 
>> pozycję, a jeżeli chodzi o open()?
> 
> fstat()

skoro dla fopen() robisz fseek(,,SEEK_END) + seekpos=ftell(),
to analogicznie dla open() robisz seekpos=lseek(,0,SEEK_END),
lub wspomniany powyżej fstat(),
a jeśli dysponujesz nazwą to również stat()/lstat()
(przy czym lstat niedostępne na platformach win32)
Re: Mapowanie pliku fizycznego do pamięci
#72702
Author: PawelS cbrbob(at)wbcd(dot)pl
Date: Sun, 17 Aug 2014 17:48
13 lines
1494 bytes
Adam Osuchowski pisze:
> Borneq wrote:
>> Jak pobrać wielkość pliku otwartego przez open()? Jeżeli chodzi o fopen 
>> działające na FILE, to tak trzeba użyć seek na koniec a potem zapytać się o 
>> pozycję, a jeżeli chodzi o open()?
> 
> fstat()

skoro dla fopen() robisz fseek(,,SEEK_END) + seekpos=ftell(),
to analogicznie dla open() robisz seekpos=lseek(,0,SEEK_END),
lub wspomniany powyżej fstat(),
a jeśli dysponujesz nazwą to również stat()/lstat()
(przy czym lstat niedostępne na platformach win32)
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads