Speeding up wineserver syncronization objects with shared memory
David Howells
dhowells at cambridge.redhat.com
Thu Mar 8 02:44:53 CST 2001
> I'll have to write a small program to collect some statistics:-)
Okay, I did a quick and dirty program to do that. It looked through the
following products that I've got installed:
Win2000 sp1
MSDEV 98
MS Office 2000
Using the following command:
find /fs/win2000/WINNT \
"/fs/win2000/Program Files/Microsoft Visual Studio" \
"/fs/win2000/Program Files/Microsoft Office" -type f |
./scandll
And came up with the following statistics:
files accessed : 3985
valid PE images : 1752
- libraries : 1280
- badly VM aligned : 20
- standard image base : 42
- specific image base : 1218
- file align by sector: 976
- file align by page : 284
- executables : 472
- badly VM aligned : 133
- standard image base : 70
- specific image base : 269
- file align by sector: 287
- file align by page : 52
I've attached the program I used.
As you can see, most DLLs actually have their image base set manually to avoid
conflicts. Also a lot of EXEs have it set too... presumably so that they can
also be used as DLLs.
However! the majority of DLLs and EXEs are sector-aligned (512) in the files,
not page-aligned (4096).
David
-------------- next part --------------
/* scandll.c: scan DLLs and EXEs
*
* Copyright (c) 2001 David Howells (dhowells at redhat.com).
*/
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <linux/types.h>
typedef __u8 BOOL, BYTE;
typedef __u16 WORD;
typedef __u32 DWORD, UINT;
#define PAGE_SIZE 4096
#define _H_229A4E44_C7CC_11D4_8F92_0000C0005742 /* skip section.h */
#include "pefile.h"
IMAGE_SECTION_HEADER sechdr;
IMAGE_DOS_HEADER imghdr;
IMAGE_NT_HEADERS nthdr;
int files;
int valid_image;
int dlls;
int exes;
int bad_vm_align[2];
int file_align_sector[2];
int file_align_page[2];
int normal_image_base[2];
int specific_image_base[2];
/*****************************************************************************/
/*
*
*/
int main(int argc, char **argv)
{
char fname[1024], *cp;
int fd = -1, tmp, isexe;
while (close(fd),
fd = -1,
fgets(fname,sizeof(fname),stdin)
)
{
cp = strpbrk(fname,"\r\n");
if (cp)
*cp = 0;
fd = open(fname,O_RDONLY);
if (!fd) {
if (errno==EISDIR)
continue;
perror("open");
return 1;
}
/* get the DOS image header */
tmp = read(fd,&imghdr,sizeof(imghdr));
if (tmp<0) {
if (errno==EISDIR)
continue;
perror("read doshdr");
return 1;
}
if (tmp<sizeof(imghdr))
continue;
files++;
if (imghdr.e_magic != IMAGE_DOS_SIGNATURE)
continue;
/* get the NT image header */
lseek(fd,imghdr.e_lfanew,SEEK_SET);
tmp = read(fd,&nthdr,sizeof(nthdr));
if (tmp<0) {
perror("read nthdr");
return 1;
}
if (tmp<sizeof(nthdr))
continue;
if (nthdr.Signature != IMAGE_NT_SIGNATURE ||
nthdr.FileHeader.Machine != IMAGE_FILE_MACHINE_I386
)
continue;
if (!(nthdr.FileHeader.Characteristics &
IMAGE_FILE_EXECUTABLE_IMAGE))
continue;
if (nthdr.OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR_MAGIC)
continue;
/* okay... it's a valid PE image */
valid_image++;
/* is it an EXE file? */
if (nthdr.FileHeader.Characteristics & IMAGE_FILE_DLL) {
dlls++;
isexe = 0;
}
else {
exes++;
isexe = 1;
}
/* check the VM alignment */
if (!nthdr.OptionalHeader.SectionAlignment ||
nthdr.OptionalHeader.SectionAlignment&(PAGE_SIZE-1)
) {
bad_vm_align[isexe]++;
continue;
}
/* check the file alignment */
if (!nthdr.OptionalHeader.FileAlignment ||
nthdr.OptionalHeader.FileAlignment&(PAGE_SIZE-1)
) {
file_align_sector[isexe]++;
}
else {
file_align_page[isexe]++;
}
/* consider the image base */
printf("%08x %s\n",nthdr.OptionalHeader.ImageBase,fname);
if (nthdr.OptionalHeader.ImageBase==0x10000000 ||
nthdr.OptionalHeader.ImageBase==0x00400000
) {
normal_image_base[isexe]++;
}
else {
specific_image_base[isexe]++;
}
}
printf("files accessed : %d\n",files);
printf("valid PE images : %d\n",valid_image);
printf("- libraries : %d\n",dlls);
printf(" - badly VM aligned : %d\n",bad_vm_align[0]);
printf(" - standard image base : %d\n",normal_image_base[0]);
printf(" - specific image base : %d\n",specific_image_base[0]);
printf(" - file align by sector: %d\n",file_align_sector[0]);
printf(" - file align by page : %d\n",file_align_page[0]);
printf("- executables : %d\n",exes);
printf(" - badly VM aligned : %d\n",bad_vm_align[1]);
printf(" - standard image base : %d\n",normal_image_base[1]);
printf(" - specific image base : %d\n",specific_image_base[1]);
printf(" - file align by sector: %d\n",file_align_sector[1]);
printf(" - file align by page : %d\n",file_align_page[1]);
return 0;
} /* end main() */
\n",exes);
printf(" - badly VM aligned : %d\n",bad_vm_align[1]);
printf(" - standard image base : %d\n",normal_image_base[1]);
printf(" - specific image base : %d\n",specific_image_base[1]);
printf(" - file align by sector: %d\n",file_align_sector[1]);
printf(" - file align by page : %d\n",file_align_page[1]);
return 0;
} /* end main() */
More information about the wine-devel
mailing list