mirror of
https://github.com/microsoft/MS-DOS.git
synced 2024-11-29 17:15:47 +00:00
90 lines
3.9 KiB
Plaintext
90 lines
3.9 KiB
Plaintext
MS-DOS PROGRAM PROFILER
|
||
FOR .EXE .COM FILES
|
||
|
||
|
||
I. PURPOSE
|
||
|
||
The PROFIL program is designed to produce an execution
|
||
profile of MS-DOS 1.25 or 2.00 .EXE or .COM files on
|
||
8086/8088 systems which have a programmable interrupting
|
||
clock. The method employed is to chop the program up
|
||
into a sequence of "buckets" and to increment the
|
||
appropriate (based on CS:IP) bucket count when the clock
|
||
interrupts. In addition there are counters for hits
|
||
in the I/O system and the DOS so some idea of how I/O
|
||
or DOS bound a program is. There is also a bucket for
|
||
hits above the program area, you might get counts here
|
||
if your program relocates itself, or goes haywire.
|
||
|
||
The PROFIL program is not intended as an end-user
|
||
program, but rather as a developement tool. To this
|
||
end it is not particularly robust or friendly, but gets
|
||
the job done. The OEM must write a PCLOCK routine (see
|
||
PCLOCK.ASM) which implements the hardware dependant clock
|
||
interrupt. The implementation should be evident from
|
||
examining the source code, it is quite simple. There
|
||
is a CLOCKON routine which sets up a clock interrupt
|
||
to the CLK_INTER routine every DX micro seconds. A
|
||
CLOCKOFF routine which un-does CLOCKON. And a LEAVE_INT
|
||
routine which is responsible for the actual "IRET" from
|
||
the clock interrupt. Also see the PROHIST documentation.
|
||
|
||
II. USAGE
|
||
|
||
The profiler is envoked by uttering:
|
||
|
||
PROFIL fname.ext
|
||
|
||
where the filename is completly specified, including
|
||
extension. You will then be prompted for the number
|
||
of paragraphs in one bucket. This number must be > 0,
|
||
based on this number the number of buckets is computed
|
||
by using the size of the executable file. Next you will
|
||
be prompted for the clock interval, and lastly for
|
||
parameters to the program. Type the parameters just
|
||
as if you were running the program at the command level.
|
||
|
||
NOTE: If a "bad" number is entered for the bucket size
|
||
or clock interval, you will be reprompted.
|
||
|
||
When the program terminates, normally or by Cntrl-C,
|
||
PROFIL will print a termination message (similar to
|
||
debug). The output file will be fname.PRF where fname
|
||
is the same as the file containing the program being
|
||
profiled.
|
||
|
||
III. OUTPUT FORMAT
|
||
|
||
The format of the output file is the following C
|
||
type structure.
|
||
|
||
struct profdata {
|
||
short clock_grain; /* Clock sample interval in
|
||
micro-seconds*/
|
||
short bucket_num; /* The total number of buckets */
|
||
short bucket_siz; /* Number of paragraphs per bucket */
|
||
short prog_low_pa; /* The Paragraph number of the lower
|
||
bound on the sample area */
|
||
short prog_high_pa; /* The Paragraph number of the upper
|
||
bound on the sample area */
|
||
short dos_pa; /* The Paragraph number of the I/O DOS
|
||
boundry */
|
||
|
||
/* When the clock interrupts the current segment is computed
|
||
from the CS:IP. If this is below dos_pa it is an I/O hit,
|
||
if between dos_pa and prog_low_pa it is a DOS hit, if between
|
||
prog_low_pa and prog_high_pa the appropriate bucket number
|
||
is computed and that bucket count is incremented, if above
|
||
prog_high_pa then it is a high hit. */
|
||
|
||
short hit_io; /* I/O bucket */
|
||
short hit_dos; /* DOS bucket */
|
||
short hit_high; /* Above program bucket */
|
||
};
|
||
|
||
short buckets[bucket_num];
|
||
/* The buckets *****NOTE: You can't declare it this way
|
||
(bucket_num is a variable), the size of this area is
|
||
determined by the value of bucket_num in the fixed header
|
||
*/
|
||
|