Windows Programming Development Memory Management Algorithms And Implementation In C 1st edition by Bill Blunden 1556223471 978-1556223471 - The latest updated ebook version is ready for download
Windows Programming Development Memory Management Algorithms And Implementation In C 1st edition by Bill Blunden 1556223471 978-1556223471 - The latest updated ebook version is ready for download
com
https://ebookball.com/product/windows-programming-
development-memory-management-algorithms-and-implementation-
in-c-1st-edition-by-bill-
blunden-1556223471-978-1556223471-15236/
OR CLICK BUTTON
DOWLOAD EBOOK
https://ebookball.com/product/memory-as-a-programming-concept-in-c-
and-c-1st-edition-by-frantisek-franek-
isbn-0521520436-9780521520430-12552/
ebookball.com
https://ebookball.com/product/memory-as-a-programming-concept-in-c-
and-c-1st-edition-by-frantisek-franek-
isbn-051183862x-9780511838620-14982/
ebookball.com
https://ebookball.com/product/data-structure-algorithms-using-c-a-
practical-implementation-1st-edition-by-sachi-nandan-mohanty-pabitra-
kumar-tripathy-9781119752035-1119752035-18754/
ebookball.com
https://ebookball.com/product/excel-add-in-development-in-c-c-
applications-in-financewiley-finance-series-1st-edition-by-steve-
dalton-0470024690-978-0470024690-11520/
ebookball.com
Algorithms in C 1st edition by Robert Sedgewick 0201514257
9780201514254
https://ebookball.com/product/algorithms-in-c-1st-edition-by-robert-
sedgewick-0201514257-9780201514254-15226/
ebookball.com
https://ebookball.com/product/data-structures-and-algorithms-in-c-1st-
edition-by-adam-drozdek-asin-b002wlxmby-25076/
ebookball.com
https://ebookball.com/product/ebook-pdf-windows-8-and-windows-
phone-8-game-development-1st-edition-by-adam-
dawes-1430258373-9781430258377-full-chapters-22698/
ebookball.com
https://ebookball.com/product/data-structures-algorithms-and-
applications-in-c-with-microsoft-compiler-1st-edition-by-sartaj-sahni-
isbn-007236226x-978-0072362268-16394/
ebookball.com
https://ebookball.com/product/windows-batch-file-programming-1st-
edition-by-premkumar-isbn-16868/
ebookball.com
Memory Management
Algorithms and
Implementation in C/C++
by
Bill Blunden
ISBN 1-55622-347-1
10 9 8 7 6 5 4 3 2 1
0208
Product names mentioned are used for identification purposes only and may be trademarks of
their respective companies.
All inquiries for volume purchases of this book should be addressed to Wordware
Publishing, Inc., at the above address. Telephone inquiries may be made by calling:
(972) 423-0090
This book is dedicated to Rob, Julie, and Theo.
iii
Table of Contents
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . xi
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . xiii
v
Table of Contents
Memory Allocation . . . . . . . . . . . . . . . . . . . . 66
Case Study: Linux . . . . . . . . . . . . . . . . . . . . . . 67
History and MINIX . . . . . . . . . . . . . . . . . . . . 67
Design Goals and Features. . . . . . . . . . . . . . . . 68
Linux and Segmentation . . . . . . . . . . . . . . . . . 69
Linux and Paging . . . . . . . . . . . . . . . . . . . . . 72
Three-Level Paging . . . . . . . . . . . . . . . . . . 72
Page Fault Handling . . . . . . . . . . . . . . . . . . 76
Memory Allocation . . . . . . . . . . . . . . . . . . . . 76
Memory Usage . . . . . . . . . . . . . . . . . . . . . . 81
Example: Siege Warfare . . . . . . . . . . . . . . . . . 82
Example: Siege Warfare, More Treachery . . . . . . . 87
Case Study: Windows . . . . . . . . . . . . . . . . . . . . 92
Historical Forces . . . . . . . . . . . . . . . . . . . . . 92
Memory Map Overview . . . . . . . . . . . . . . . . . 96
Windows and Segmentation . . . . . . . . . . . . . . . 99
Special Weapons and Tactics . . . . . . . . . . . . . 99
Crashing Windows with a Keystroke . . . . . . . . 102
Reverse Engineering the GDT . . . . . . . . . . . 102
Windows and Paging . . . . . . . . . . . . . . . . . . 105
Linear Address Space Taxonomy . . . . . . . . . . 105
Musical Chairs for Pages. . . . . . . . . . . . . . . 106
Memory Protection . . . . . . . . . . . . . . . . . 108
Demand Paging . . . . . . . . . . . . . . . . . . . . 109
Memory Allocation . . . . . . . . . . . . . . . . . . . 110
Memory Usage . . . . . . . . . . . . . . . . . . . . . 114
Turning Off Paging . . . . . . . . . . . . . . . . . . . 117
Example: Things That Go Thunk in the Night . . . . 118
Closing Thoughts . . . . . . . . . . . . . . . . . . . . . 122
References . . . . . . . . . . . . . . . . . . . . . . . . . 123
Books and Articles . . . . . . . . . . . . . . . . . . . 123
Web Sites . . . . . . . . . . . . . . . . . . . . . . . . 125
vi
Table of Contents
vii
Table of Contents
Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Trade-Offs . . . . . . . . . . . . . . . . . . . . . . . . 247
malloc() Version 2: Sequential Fit . . . . . . . . . . . 248
Theory . . . . . . . . . . . . . . . . . . . . . . . . . . 249
Implementation . . . . . . . . . . . . . . . . . . . . . 251
memmgr.cpp . . . . . . . . . . . . . . . . . . . . . 251
mallocV2.cpp . . . . . . . . . . . . . . . . . . . . . 260
driver.cpp . . . . . . . . . . . . . . . . . . . . . . . 261
Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
Trade-Offs . . . . . . . . . . . . . . . . . . . . . . . . 264
malloc() Version 3: Segregated Lists . . . . . . . . . 265
Theory . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Implementation . . . . . . . . . . . . . . . . . . . . . 266
memmgr.cpp . . . . . . . . . . . . . . . . . . . . . 267
mallocV3.cpp . . . . . . . . . . . . . . . . . . . . . 274
Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
Trade-Offs . . . . . . . . . . . . . . . . . . . . . . . . 279
Performance Comparison . . . . . . . . . . . . . . . . . 279
viii
Table of Contents
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
ix
Acknowledgments
xi
Acknowledgments
xii
Introduction
xiii
Introduction
Historical Setting
In the late 1930s, a group of scholars arrived at Bletchley Park in an
attempt to break the Nazis’ famous Enigma cipher. This group of
codebreakers included a number of notable thinkers, like Tommy
Flowers and Alan Turing. As a result of the effort to crack Enigma,
the first electronic computer was constructed in 1943. It was named
Colossus and used thermionic valves (known today as vacuum tubes)
for storing data. Other vacuum tube computers followed. For exam-
ple, ENIAC (electronic numerical integrator and computer) was
built by the U.S. Army in 1945 to compute ballistic firing tables.
xiv
Introduction
ASIDE
“After 45 minutes or so, we’ll see that the results are
obvious.”
— David M. Lee
I have heard Nobel laureates in physics, like Dave Lee,
complain that students who rely too heavily on calculators
lose their mathematical intuition. To an extent, Dave is cor-
rect. Before the dawn of calculators, errors were more com-
mon, and developing a feel for numeric techniques was a
useful way to help catch errors when they occurred.
During the Los Alamos project, a scientist named Dick
Feynman ran a massive human computer. He once mentioned
that the performance and accuracy of his group’s computa-
tions were often more a function of his ability to motivate
people. He would sometimes assemble people into teams
and have them compete against each other. Not only was
this a good idea from the standpoint of making things more
interesting, but it was also an effective technique for catching
discrepancies.
xv
Introduction
In 1958, the first integrated circuit was invented. The inventor was
a fellow named Jack Kilby, who was hanging out in the basement of
Texas Instruments one summer while everyone else was on vaca-
tion. A little over a decade later, in 1969, Intel came out with a 1
kilobit memory chip. After that, things really took off. By 1999, I
was working on a Windows NT 4.0 workstation (service pack 3) that
had 2GB of SDRAM memory.
The general trend you should be able to glean from the previous
discussion is that memory components have solved performance
requirements by getting smaller, faster, and cheaper. The hardware
people have been able to have their cake and eat it too. However,
the laws of physics place a limit on how small and how fast we can
actually make electronic components. Eventually, nature itself will
stand in the way of advancement. Heisenberg’s Uncertainty Princi-
ple, shown below, is what prevents us from building infinitely small
components.
x p (h/4 )
For those who are math-phobic, I will use Heinsenberg’s own words
to describe what this equation means:
“The more precisely the position is determined, the less pre-
cisely the momentum is known in this instant, and vice versa.”
In other words, if you know exactly where a particle is, then you
will not be able to contain it because its momentum will be huge.
Think of this like trying to catch a tomato seed. Every time you try
to squeeze down and catch it, the seed shoots out of your hands and
flies across the dinner table into Uncle Don’s face.
Einstein’s General Theory of Relativity is what keeps us from
building infinitely fast components. With the exception of black
holes, the speed limit in this universe is 3x108 meters per second.
Eventually, these two physical limits are going to creep up on us.
When this happens, the hardware industry will have to either
make larger chips (in an effort to fit more transistors in a given area)
or use more efficient algorithms so that they can make better use of
existing space. My guess is that relying on better algorithms will be
the cheaper option. This is particularly true with regard to memory
management. Memory manipulation is so frequent and crucial to
performance that designing better memory management subsys-
tems will take center stage in the future. This will make the time
spent reading this book a good investment.
xvi
Introduction
Impartial Analysis
In this book, I try very hard to offer memory management solutions
without taking sides. I have gone to great lengths to present an
unbiased discussion. This is important because it is extremely
tempting to champion a certain memory management algorithm
(especially if you invented it). There are some journal authors who
would have you believe that their new algorithm is a panacea to
cure the ills of the world. I do not have the ulterior motives of a col-
lege professor. I am here to offer you a set of tools and then let you
decide how best to use them. In this book, I will present you with
different techniques and try to point out the circumstances in which
they perform well.
The question “Which is the best memory management algo-
rithm?” is very similar in spirit to any of the following questions:
“Which operating system is the best?”
“Which programming language is the best?”
“Which data structure is the best?”
“Which type of screwdriver is the best?”
I can recall asking a program manager at Eaton Corp., John
Schindler, what the best operating system was. John was managing
at least a dozen different high-end platforms for Eaton, and I
thought he would know. I was expecting him to come right back
with a quick answer like: “Oh, OpenBSD is the best.” What actually
happened was something that surprised me. He looked at me for a
minute, as if the question was absurd. Then he smiled and said,
“Well, it really depends on what you’re going to use the machine for.
I use Solaris for networking, HP-UX for app servers, AIX to talk to
our mainframe, NT for mail, . . . ”
The truth is there is no “best” solution. Most solutions merely
offer certain trade-offs. In the end, the best tool to use will depend
upon the peculiarities of the problem you are trying to solve.
This is a central theme that appears throughout the domain of
computer science. Keep it in the back of your mind, like some sort
of Buddhist mantra:
“There is no best solution, Grasshopper, only trade-offs.”
For example, linked lists and arrays can both represent a linear set
of items. With a linked list, you get easy manipulation at the
expense of speed. Adding an element to a linked list is as easy as
modifying a couple of pointers. However, to find a given list
xvii
Introduction
element, you may have to traverse the entire list manually until you
find it. Conversely, with an array, you get access speed at the
expense of flexibility. Accessing an array element is as easy as add-
ing an integer to a base address, but adding and deleting array
elements requires a lot of costly shifting. If your code is not going to
do a lot of list modification, an array is the best choice. If your code
will routinely add and delete list members, a linked list is the better
choice. It all depends upon the context of the problem.
Audience
This book is directed toward professional developers and students
who are interested in discovering how memory is managed on pro-
duction systems. Specifically, engineers working on PC or
embedded operating systems may want to refresh their memory or
take a look at alternative approaches. If this is the case, then this
book will serve as a repository of algorithms and software compo-
nents that you can apply to your day-to-day issues.
Professionals who design and construct development tools will
also find this book useful. In general, development tools fall into the
class of online transaction processing (OLTP) programs. When it
comes to OLTP apps, pure speed is the name of the game. As such,
programming language tools, like compilers, often make use of
suballocators to speed up the performance of the code that manipu-
lates their symbol table.
With regard to compiling large software programs consisting of
millions of lines of code, this type of suballocator-based optimization
can mean the difference between waiting for a few minutes and
waiting for a few hours. Anyone who mucks around with
suballocators will find this book indispensable.
Software engineers who work with virtual machines will also be
interested in the topics that I cover. The Java virtual machine is
famous for its garbage collection facilities. In this book I explore
several automatic memory management techniques and also pro-
vide a couple of concrete garbage collection implementations in
C++.
Finally, this book also targets the curious. There is absolutely
nothing wrong with being curious. In fact, I would encourage it. You
may be an application developer who has used memory manage-
ment facilities countless times in the past without taking the time to
xviii
Introduction
determine how they really work. You may also have nurtured an
interest that you have had to repress due to deadlines and other pri-
orities. This book will offer such engineers an opportunity to
indulge their desire to see what is going on under the hood.
Organization
This book is divided into six chapters. I will start from the ground
up and try to provide a comprehensive, but detailed, view of mem-
ory management fundamentals. Because of this, each chapter builds
on what has been presented in the previous one. Unless you are a
memory management expert, the best way to read this book is
straight through.
xix
Introduction
operating system that took advantage of all four layers. All the sys-
tems that I examined use a vastly simplified two-layer scheme.
xx
Introduction
Approach
When it comes to learning something complicated, like memory
management, I believe that the most effective way is to examine a
working subsystem. On the other hand, it is easy to become lost in
the details of a production memory manager. Contemporary mem-
ory managers, like the one in Linux, are responsible for keeping
track of literally hundreds of run-time quantities. Merely tracking
the subsystem’s execution path can make one dizzy. Hence, a bal-
ance has to be struck between offering example source code that is
high quality and also easy to understand. I think I have done a suffi-
cient job of keeping the learning threshold low without sacrificing
utility.
xxi
Introduction
Typographical Conventions
Words and phrases will appear in italics in this book for two reasons:
n To place emphasis
n When defining a term
The courier font will be used to indicate that text is one of the
following:
n Source code
n An address in memory
n Console input/output
n A filename or extension
Numeric values appear throughout this book in a couple of different
formats. Hexadecimal values are indicated by either prefixing them
with “0x” or appending “H” to the end.
For example:
0xFF02
0FF02H
The C code that I include will use the former notation, and the
assembler code that I include will use the latter format.
Binary values are indicated by appending the letter “B” to the
end. For example:
0110111B
Prerequisites
“C makes it easy to shoot yourself in the foot; C++ makes it
harder, but when you do, it blows away your whole leg.”
— Bjarne Stroustrup
xxii
Introduction
interrupts, that can only be fleshed out using assembler. This is one
reason why mid-level languages, like C, provide syntactic facilities
for inline assembly code. If you look at the Linux source code, you
will see a variety of inline assembly code snippets. If at all possible,
I wrapped my assembly code in C. However, you can’t always do
this.
Learning assembly language may seem like an odious task, but
there are several tangible and significant rewards. Assembly lan-
guage is just a mnemonic representation of machine instructions.
When you have a complete understanding of a processor’s assembly
language, including its special “privileged” instructions, you will
also have a fairly solid understanding of how the machine functions
and what its limitations are. In addition, given that compilers gener-
ate assembly code, or at least spit it out in a listing file, you will also
be privy to the inner workings of development tools.
In short, knowing assembly language is like learning Latin. It
may not seem immediately useful, but it is . . . just give it time.
I use C early in the book for small applications when I felt like I
could get away with it. Most of the larger source code examples in
this book, however, are written in C++. If you don’t know C or
C++, you should pick up one of the books mentioned in the “Refer-
ences” section at the end of the Introduction. After a few weeks of
cramming, you should be able to follow my source code examples.
I think C++ is an effective language for implementing memory
management algorithms because it offers a mixture of tools. With
C++, you can manipulate memory at a very low, bit-wise level and
invoke inline assembly code when needed. You can also create
high-level constructs using the object-oriented language features in
C++. Encapsulation, in particular, is a compiler-enforced language
feature that is crucial for maintaining large software projects.
NOTE At times, you may notice that I mix C libraries and conven-
tions into my C++ source code. I do this, most often, for reasons
related to performance. For example, I think that C’s printf() is
much more efficient than cout.
xxiii
Introduction
Companion Files
Software engineering is like baseball. The only way you will ever
acquire any degree of skill is to practice and scrimmage whenever
you get the chance. To this end, I have included the source code for
most of the examples in this book in a downloadable file available at
www.wordware.com/memory.
Dick Feynman, who was awarded the Nobel Prize in physics in
1965, believed that the key to discovery and insight was playful
experimentation. Dick was the kind of guy who followed his own
advice. In his biography, Surely You’re Joking, Mr. Feynman, Dick
recounts how spinning plates in a dining hall at Cornell led to his-
toric work in quantum mechanics. By testing a variety of new ideas
and comparing the results to your predictions, you force yourself to
xxiv
Introduction
References
Brey, Barry. The Intel Microprocessors: 8086/8088, 80186, 80286,
80386, 80486, Pentium, Pentium Pro, and Pentium II. 2000,
Prentice Hall, ISBN: 0-13-995408-2.
This is a fairly recent book and should take care of any ques-
tions you may have. Barry has been writing about Intel chips
since the first one came out.
Kernighan, Brian and Dennis Ritchie. The C Programming Lan-
guage. 1988, Prentice Hall, ISBN: 0131103628.
This is a terse, but well-read introduction to C by the founding
fathers of the language.
Reid, T. R. The Chip: How Two Americans Invented the Microchip
and Launched a Revolution. 2001, Random House, ISBN:
0375758283.
Schildt, Herbert. C++ From the Ground Up. 1998, Osborne
McGraw-Hill, ISBN: 0078824052.
If you have never programmed in C/C++, read this book. It is
a gentle introduction written by an author who knows how to
explain complicated material. Herb starts by teaching you C and
then slowly introducing the object-oriented features of C++.
Stroustrup, Bjarne and Margaret Ellis. The Annotated C++ Refer-
ence. 1990, Addison-Wesley, ISBN: 0201514591.
Once you have read Schildt’s book, you can use this text to fill
in the gaps. This book is exactly what it says it is — a reference
— and it is a good one.
xxv
Introduction
Warning
In this book I provide some rather intricate, and potentially danger-
ous, source code examples. This is what happens when you go
where you are not particularly supposed to be. I recommend that
you use an expendable test machine to serve as a laboratory. Also,
you might want to consider closing all unnecessary applications
before experimenting. If an application dies in the middle of an
access to disk, you could be faced with a corrupt file system.
If you keep valuable data on the machine you are going to use, I
suggest you implement a disaster recovery plan. During the writing
of this book’s manuscript, I made a point to perform daily incremen-
tal backups and complete weekly backups of my hard drive. I also
had a secondary machine that mirrored by primary box. Large cor-
porations, like banks and insurance companies, have truly extensive
emergency plans. I toured a production site in Cleveland that had
two diesel fuel generators and a thousand gallons of gas to provide
backup power.
Neither the publisher nor author accept any responsibility for any
damage that may occur as a result of the information contained
within this book. As Stan Lee might say, “With great power comes
great responsibility.”
xxvi
Author Information
Bill Blunden has been obsessed with systems software since his
first exposure to the DOS debug utility in 1983. His single-minded
pursuit to discover what actually goes on under the hood led him to
program the 8259 interrupt controller and become an honorable
member of the triple-fault club. After obtaining a BA in mathemati-
cal physics and an MS in operations research, Bill was unleashed
upon the workplace. It was at an insurance company in the beautiful
city of Cleveland, plying his skills as an actuary, that Bill got into his
first fist fight with a cranky IBM mainframe. Bloody but not beaten,
Bill decided that groking software beat crunching numbers. This led
him to a major ERP player in the midwest, where he developed
CASE tools in Java, wrestled with COBOL middleware, and was
assailed by various Control Data veterans. Having a quad-processor
machine with 2GB of RAM at his disposal, Bill was hard pressed to
find any sort of reason to abandon his ivory tower. Nevertheless, the
birth of his nephew forced him to make a pilgrimage out west to Sil-
icon Valley. Currently on the peninsula, Bill survives rolling power
blackouts and earthquakes, and is slowly recovering from his initial
bout with COBOL.
xxvii
Chapter 1
Memory Management
Mechanisms
“Everyone has a photographic memory. Some people just don’t
have film.”
— Mel Brooks
1
2 Chapter 1
ASIDE
An arm-waving explanation is a proposition that has not been
established using precise mathematical statements. Mathe-
matical statements have the benefit of being completely un-
ambiguous: They are either true or false. An arm-waving
explanation tends to eschew logical rigor entirely in favor of
arguments that appeal to intuition. Such reasoning is at best
dubious, not only because intuition can often be incorrect, but
also because intuitive arguments are ambiguous. For example,
people who argue that the world is flat tend to rely on arm-
waving explanations.
NOTE Back when Dave Cutler’s brainchild, Windows NT, came out,
there was a lot of attention given to the operating system’s Hardware
Abstraction Layer (HAL). The idea was that the majority of the operat-
ing system could be insulated from the hardware that it ran on by a
layer of code located in the basement. This was instituted to help
counter the hardware dependency issue that I mentioned a minute
ago. To Dave’s credit, NT actually did run on a couple of traditionally
UNIX-oriented hardware platforms. This included Digital’s Alpha pro-
cessor and the MIPS RISC processor. The problem was that Microsoft
couldn’t get a number of its higher-level technologies, like DCOM, to
Memory Management Mechanisms 3
Chapter 1
a binary standard!
The solution that favors speed always wins. I was told by a former
Control Data engineer that when Seymour Cray was designing the
6600, he happened upon a new chip that was quicker than the one
he was currently using. The problem was that it made occasional
computational errors. Seymour implemented a few slick work-
arounds and went with the new chip. The execs wanted to stay out
of Seymour’s way and not disturb the maestro, as Seymour was
probably the most valuable employee Control Data had. Unfortu-
nately, they also had warehouses full of the original chips. They
couldn’t just throw out the old chips; they had to find a use for them.
This problem gave birth to the CDC 3300, a slower and less expen-
sive version of the 6600.
My point: Seymour went for the faster chip, even though it was
less reliable.
Speed rules.
The result of this tendency is that every commercial operating
system in existence has its memory management services firmly
rooted in data structures and protocols dictated by the hardware.
Processors provide a collection of primitives for manipulating mem-
ory. They constitute the mechanism side of the equation. It is up to
the operating system to decide if it will even use a processor’s
memory management mechanisms and, if so, how it will use them.
Operating systems constitute the policy side of the equation.
In this chapter, I will examine computer hardware in terms of
how it offers a mechanism to access and manipulate memory.
Memory Hierarchy
When someone uses the term “memory,” they are typically refer-
ring to the data storage provided by dedicated chips located on the
motherboard. The storage these chips provide is often referred to
as Random Access Memory (RAM), main memory, and primary stor-
age. Back in the iron age, when mainframes walked the earth, it was
called the core. The storage provided by these chips is volatile,
which is to say that data in the chips is lost when the power is
switched off.
There are various types of RAM:
n DRAM
n SDRAM
n SRAM
4 Chapter 1
n VRAM
Dynamic RAM (DRAM) has to be recharged thousands of times
each second. Synchronous DRAM (SDRAM) is refreshed at the
clock speed at which the processor runs the most efficiently. Static
RAM (SRAM) does not need to be refreshed like DRAM, and this
makes it much faster. Unfortunately, SRAM is also much more
expensive than DRAM and is used sparingly. SRAM tends to be
used in processor caches and DRAM tends to be used for wholesale
memory. Finally, there’s Video RAM (VRAM), which is a region of
memory used by video hardware. In the next chapter, there is an
example that demonstrates how to produce screen messages by
manipulating VRAM.
Recent advances in technology and special optimizations imple-
mented by certain manufacturers have led to a number of additional
acronyms. Here are a couple of them:
n DDR SDRAM
n RDRAM
n ESDRAM
DDR SDRAM stands for Double Data Rate Synchronous Dynamic
Random Access Memory. With DDR SDRAM, data is read on both
the rising and the falling of the system clock tick, basically doubling
the bandwidth normally available. RDRAM is short for Rambus
DRAM, a high-performance version of DRAM sold by Rambus that
can transfer data at 800 MHz. Enhanced Synchronous DRAM
(ESDRAM), manufactured by Enhanced Memory Systems, provides
a way to replace SRAM with cheaper SDRAM.
A bit is a single binary digit (i.e., a 1 or a 0). A bit in a RAM chip
is basically a cell structure that is made up of, depending on the type
of RAM, a certain configuration of transistors and capacitors. Each
cell is a digital switch that can either be on or off (i.e., 1 or 0). These
cells are grouped into 8-bit units call bytes. The byte is the funda-
mental unit for measuring the amount of memory provided by a
storage device. In the early years, hardware vendors used to imple-
ment different byte sizes. One vendor would use a 6-bit byte and
another would use a 16-bit byte. The de facto standard that every-
one seems to abide by today, however, is the 8-bit byte.
There is a whole set of byte-based metrics to specify the size of a
memory region:
1 byte = 8 bits
1 word = 2 bytes
1 double word = 4 bytes
Memory Management Mechanisms 5
Chapter 1
1 octal word = 8 bytes
1 paragraph = 16 bytes
1 kilobyte (KB) = 1,024 bytes
1 megabyte (MB) = 1,024KB = 1,048,576 bytes
1 gigabyte (GB) = 1,024MB = 1,073,741,824 bytes
1 terabyte (TB) = 1,024GB = 1,099,511,627,776 bytes
1 petabyte (PB) = 1,024TB = 1,125,899,906,842,624 bytes
Figure 1.1
Chapter 1
Figure 1.2
NOTE A recurring point that I will make throughout this book is the
high cost of disk input/output. As I mentioned previously, the latency
for accessing disk storage is on the order of milliseconds. This is a long
time from the perspective of a processor. The situation is analogous to
making a pizza run from a remote cabin in North Dakota. If you are
lucky, you have a frozen pizza in your freezer/cache and it will only
take 30 minutes to heat up. If you are not lucky, you will have to call
the pizza delivery guy (i.e., access the data from disk storage) and wait
for five hours as he makes the 150-mile trek to your cabin.
Using virtual memory is like making a deal with the devil. Sure, you
will get lots of extra memory, but you will pay an awful cost in terms
of performance. Disk I/O involves a whole series of mandatory
actions, some of which are mechanical. It is estimated that paging
on Windows accounts for roughly 10% of execution time. Managing
virtual memory requires a lot of bookkeeping on the part of the pro-
cessor. I will discuss the precise nature of this bookkeeping in a
later section.
ASIDE
I worked at an ERP company where one of the VPs used to
fine engineers for performing superfluous disk I/O. During
code reviews, he would grep through source code looking for
the fopen() and fread() standard library functions. We
were taught the basic lesson that you cached everything you
possibly could in memory and only moved to disk storage
when you absolutely had no other alternative (and even then
you needed permission). To the VP’s credit, the company’s
three-tier middleware suite was the fastest in the industry.
Disk storage has always been cheaper than RAM. Back in the 1960s
when 8KB of RAM was a big investment, using the disk to create
virtual memory probably made sense. Today, however, the cost dis-
crepancy between DRAM and disk drives is not as significant as it
was back then. Buying a machine with 512MB of SDRAM is not
unheard of. It could be that virtual memory will become a complete
relic or implemented as some sort of emergency safeguard.
Memory Management Mechanisms 9
Chapter 1
Each byte in DRAM is assigned a unique numeric identifier called
an address, just like houses on a street. An address is an integer
value. The first byte in memory is assigned an address of zero. The
region of memory near address zero is known as the bottom of mem-
ory, or low memory. The region of memory near the final byte is
known as high memory. The number of physical (i.e., DRAM) bytes
that a processor is capable of addressing is known as the processor’s
physical address space. (See Figure 1.3.)
Figure 1.3
Figure 1.4
When the processor reads from memory, the following steps are
performed:
1. The processor places the address of the byte to be read on the
address lines.
2. The processor sends the read signal on the control bus.
3. The DRAM chip(s) return the byte specified on the data bus.
When the processor writes to memory, the following steps are
performed:
1. The processor places the address of the byte to be written on
the address lines.
2. The processor sends the write signal on the control bus.
3. The processor sends the byte to be written to memory on the
data bus.
This description is somewhat of an oversimplification. For example,
the Pentium processor reads and writes data 4 bytes at a time. This
is one reason why the Pentium is called a 32-bit chip. The processor
will refer to its 32-bit payload using the address of the first byte
(i.e., the byte with the lowest address). Nevertheless, I think the
general operation is clear.
Memory Management Mechanisms 11
Chapter 1
You have seen how a processor reads and writes bytes to memory.
However, most processors also support two advanced memory man-
agement mechanisms: segmentation and paging.
Segmentation is instituted by breaking up a computer’s address
space into specific regions, known as segments. Using segmentation
is a way to isolate areas of memory so that programs cannot inter-
fere with one another. Segmentation affords what is known as
memory protection. It is possible to institute memory segmentation
without protection, but there are really no advantages to such a
scheme.
Under a segmentation scheme that enforces memory protection,
each application is assigned at least one segment. Large applications
often have several segments. In addition, the operating system will
also have its own custom set of segments. Segments are assigned a
specific set of access writes so that policies can be created with
regard to who can update what. Typically, the operating system code
segments will execute with the highest privilege and applications
will be loaded into segments with less authority.
Figure 1.5
The catch to all this is that the address of a byte in this artifi-
cial/virtual address space is no longer the same as the address that
the processor places on the address bus. This means that transla-
tion data structures and code will have to be established in order to
map a byte in the virtual address space to a physical byte (regard-
less of whether that byte happens to be in DRAM or on disk).
When the necessary paging constructs have been activated, the
virtual memory space is divided into smaller regions called pages. If
the operating system decides that it is running low on physical
memory, it will take pages that are currently stored in physical
memory and write them to disk. If segmentation is being used,
bookkeeping will have to be performed in order to match a given
page of memory with the segment that owns it. All of the account-
ing work is done in close conjunction with the processor so that the
performance hit associated with disk I/O can be kept to a minimum.
Figure 1.6
Chapter 1
decided to use the Pentium to help illustrate segmentation and pag-
ing. I would love to demonstrate theory with a MIPS64 processor,
but I can’t afford an SGI server (sigh). Being inexpensive is one of
the primary reasons for Intel’s continued success. Hackers, like me,
who couldn’t afford an Apple IIe back in the 1980s were left
scrounging for second-hand Intel boxes. There were thousands of
people who had to make this kind of financial decision. So, in a
sense, the proliferation of Intel into the workplace was somewhat of
a grass roots movement.
The Pentium class of processors is descended from a long line of
popular CPUs:
CPU Release Date Physical Address Space
8086 1978 1MB
8088 1979 1MB
80286 1982 16MB
80386 1985 4GB
80486 1989 4GB
Pentium 1993 4GB
Pentium Pro 1995 64GB
Pentium II 1997 64GB
Pentium III 1999 64GB
Pentium 4 2000 64GB
NOTE When the IBM PC came out in 1981, it shipped with a 4.77
MHz 8088. Without a doubt, mainframe developers were overjoyed.
This was because the PC gave them a place of their own. In those
days, the standard dummy terminals didn’t do anything more than
shuttle a data buffer back and forth to a mainframe. In addition, an
engineer had little or no control over when, or how, his code would be
run. The waiting could be agonizing. Tom Petty was right. Bribing a
sysop with pizza could occasionally speed things up, but the full court
grovel got tiring after a while. With an IBM PC, an engineer finally had
a build machine that was open all night with no waiting.
ASIDE
I know one CDC engineer, in particular, who ported a FOR-
TRAN ’77 compiler to a PC in 1982 for this very reason. His
supervisor would walk over and say: “Why do you want to run
on that little three-wheeler instead of the production ma-
chine?” His answer: “Because it is mine, damn it.” This one
statement probably summarizes the mindset that made PCs
wildly successful.
14 Chapter 1
Chapter 1
displayed in Figure 1.7.
Figure 1.7
As you can see, the “E” prefix has been removed from the regis-
ter names. In addition, each of the 16-bit general registers, AX, CX,
DX, and EX, can be manipulated in terms of two 8-bit registers. For
example, the AX register can be seen as the combination of the AH
and AL registers. The AH register refers to the high byte in AX,
and the AL register refers to the low byte in AX.
NOTE The memory and mode registers shown in Figure 1.2 are still
visible in real mode. They still exist if the processor is a 32-bit class
CPU but they have no significance or use in real mode. The only
exception to this rule is if you are trying to switch to protected mode.
Sometimes, for reasons that I will explain later, this is also written
as:
0x8200[0]:0x0100
Figure 1.8
NOTE The fact that there are six segment registers means that at
any time, only six segments of memory can be manipulated. A pro-
gram can have more than six segments, but only six can be accessible
at any one point in time.
Memory Management Mechanisms 17
Chapter 1
bits in size. Given that an offset address is 16 bits, this limits each
segment to 64KB in size.
QUESTION
If the segment address and offset address are both stored in
16-bit registers, how can the sum of two 16-bit values form a
20-bit value?
ANSWER
The trick is that the segment address has an implicit zero
added to the end. For example, a segment address of 0x0C00 is
treated as 0x0C000 by the processor. This is denoted, in practice,
by placing the implied zero in brackets (i.e., 0x0C00[0]). This is
where the processor comes up with a 20-bit value.
As you can see, the real mode segment/offset approach does provide
a crude sort of segmentation. However, at no point did I mention
that the boundaries between segments are protected. The ugly
truth is that there is no memory protection in real mode. When you
run a program in real mode, it owns everything and can run amok if
it wants.
Running an application in real mode is like letting a den of Cub
Scouts into your home. They’re young, spirited, and all hopped-up
on sugar. If you’re not careful, they will start tearing the house
down. Crashing a real mode machine is simple, and there is little
you can do to prevent it (other than back up your work constantly).
In case you are wondering, and I’m sure some of you are, here is
an example of a C program that can crash a computer running in real
mode:
/* --crashdos.c-- */
void main()
{
unsigned char *ptr;
int i;
Intel’s processors would never have made inroads into the enter-
prise with this kind of Mickey Mouse memory management. In an
attempt to support more robust operating systems and larger
address spaces, Intel came out with the 80386. The 80386 had a
physical address space of 4GB and supported a new mode of opera-
tion: protected mode.
Chapter 1
The best way to understand segmentation on Intel is to take a visual
look at how it is implemented. A picture is worth 1,024 words, and
that is particularly true in this case. So take a good, hard look at
Figure 1.9 and compare it to Figure 1.8. You might also want to
bookmark Figure 1.9 so that you can return to it when needed.
Figure 1.9
The first thing to note is that protected mode uses the full-blown
set of Pentium registers displayed in Figure 1.2. Back to 32-bit reg-
isters we go. Also, the segment registers no longer store 16-bit
segment address values. Instead, it holds what is known as a seg-
ment selector.
A segment selector is a 16-bit data structure containing three
fields. Its composition is displayed in Figure 1.10. The really impor-
tant field is the index field. The index field stores an index to a
descriptor table. Index values start at zero.
Figure 1.10
NOTE Almost all of the operating systems this book examines focus
on the GDT and offer very minimal use of the LDT (if they use it at all).
Figure 1.11
Memory Management Mechanisms 21
QUESTION
Chapter 1
How does the processor map a segment selector’s index to a
descriptor?
ANSWER
The processor takes the index, specified by the segment
selector, multiplies the index by eight (as in 8 bytes because
descriptors are 64 bits in length), and then adds this product to
the base address specified by GTDR or LDTR.
NOTE In case you are looking at Figure 1.2 and wondering about
the other two memory management registers, IDTR and TR, I did not
forget them. They are not as crucial to this discussion as GDTR and
LDTR. The IDTR and TR registers are used to manage hardware inter-
rupts and multitasking. This book is focused on pure memory
management, so I will not discuss these registers in any detail. If you
happen to be interested, I recommend that you pick up the Intel man-
ual referenced at the end of this chapter.
Figure 1.12
Language: English
WOMEN, CHILDREN,
LOVE and MARRIAGE
BY
C. GASQUOINE HARTLEY
AUTHOR OF “THE TRUTH ABOUT WOMAN,” “WOMEN’S WILD OATS,”
“MOTHER AND SON,” ETC.
London
HEATH CRANTON, LIMITED
6 Fleet Lane E.C.4
1924
Printed in Great Britain for Heath Cranton, Ltd., by Clements Bros., Chatham
CONTENTS
PAGE
Foreword 11
Section I.—WOMEN 13
1. Women and Cats 15
2. The Women of Spain 19
3. The Dangerous Age 29
4. The Legal Position of the Mother 35
5. Problems of Birth Control 37
Section II.—CHILDREN 41
1. A Boy’s Misery 43
2. Criminals Made in Our Nurseries 49
3. The Tyranny of Parents 51
4. The Superfluous Father 55
5. The Perfect Mother 59
6. Nobody’s Children 61
7. Let Us Pension the Mothers 71
8. Boy and Girl Offenders and Adult Misunderstanding 73
9. New Ways of Teaching Children 79
10. Difficulties and Mistakes in Sex Education 87
Sex Instruction. The Age at which Knowledge Should be
11. 107
given
12. The Myth of the Virtuous Sex 113
Sentimental Tampering with Difficult Problems with some
13. 117
Remarks on Sex Favouritism
14. The Seduction of Men 123
15. Playing with Love 127
Section III.—MARRIAGE AND OTHER RELATIONSHIPS 131
1. Is Passionate Love the Surest Foundation for Marriage? 133
2. Marriage Reform 139
To-day’s Ideas on Marriage. Are we seeking vainly after
3. 141
happiness?
4. Why Men are Unfaithful 145
5. Why Wives are Unfaithful 149
6. Should Doctors Tell? 157
7. The Modern Wife and the Old-fashioned Husband 161
8. The Temporary Gentleman and his Young Wife 165
9. Is Marriage Too Easy? 169
10. Passionate Friendships 173
11. Conclusion—Regeneration 187
INDEX 189
FOREWORD
The essays here collected were written on various occasions over a
considerable space of time. This will account for the diversity in the
subjects and for a certain amount of restatement of my own beliefs
and position.
I have not thought it advisable to attempt to alter this, since though
some of the things I have said before may be repeated, the point of
view and special application are in each case different.
Some of the essays have appeared already in various journals, but
all have been very carefully revised and altered and the great
majority entirely re-written.
In spite of the diversity of the subjects there is a common idea
beneath all the essays—a common back-ground of faith. I do not
know whether I am justified in my confidence that this idea—this
faith is abundantly manifest. If I should try to formulate it into one
short statement, I should say it was the responsibility that the old
have to the young—the debt that one generation owes to the next.
In my gospel there is one commandment which may not be broken:
Ye shall not hurt a little child.
C. GASQUOINE HARTLEY.
Merton Park,
March, 1924.
Section I
WOMEN
Under this title the Danish writer, known as Karin Michaelis, in the
far-back years before the war—a time now marked as the terrible
period of the suffrage craze, gave to the world a remarkable and
intimate revelation of a woman. It is perhaps the most illuminating
work that has been written in recent years about women, from its
rare quality of femininity, expressed with an unconscious sincerity
and biting truth.
It is very late in the day to describe a book which, though now
forgotten, was, at the time of its publication, very widely read and
still more widely criticised and discussed in almost all European
countries. It appeared at a time of great feminist unrest, which
accounts, to some extent, for the reception it gained.
The story matters very little, for it is not as the confession of one
woman that “The Dangerous Age” gains its importance, it is because
it affords a diagnosis of an old and a very great evil, as well it is an
acute observation of a certain type of woman’s soul or character.
It is from this aspect that I wish to approach it, and for this reason I
have called it “A Tract for the Times.”
Thus it is of very little importance to my present purpose that the
book is not a new one. It does not matter if the story is
remembered, or indeed, if the book itself has, or has not, been read.
If the reader will recall to his or her mind any one of the restless,
unsatisfied women they must know—women, not young but not old,
they will have the history (the variety in the details will not matter at
all) of Elsie Lindtner, the heroine of this story.
This admirable piece of observation deals with a section of women
who have come into being through our industrial civilisation with its
wrong ideals and stupid customs. Marcel Prévost1 in his preface to
the book, speaks of Elsie Lindtner’s confession as a revelation of the
feminine soul of all time. With the latter part of this opinion I entirely
disagree. Rather would I say that it is a revelation of the soul of
woman as that soul has been evolved through the repression of
natural instincts and the want of satisfying fields for the expression
of energy, in an atmosphere which very surely gives birth to the
modern demons of confused desires and unconscious unhappiness.
The title of the book is not, I think, well chosen. The Dangerous Age
—Elsie Lindtner was forty-two when she wrote her confession—was
dangerous because of the life which had preceeded it. There is,
without doubt, a cleavage in life, which may be said to be marked by
the diminishing of attraction towards the opposite sex. But this is
common to men as well as to women. It belongs to no special age,
and its proportion of danger to the individual rests, first on the
fulness or poverty of experience before this period arrives, and
secondly on the power to extract from the past the joyous impulse
for continuous living. But to Elsie Lindtner, as to all women of such
false and restricted experience, it was far more than a cleavage, and
because she had never lived simply and completely, she experienced
that emptiness which strikes the soul with death when the
consciousness comes that the opportunities of life are passing.
The terror of approaching age robbed her of all her hope of future
happiness, just because she had emptiness in her past.
It is easy to condemn her, to speak of her selfishness, her falseness,
her colossal egoism—there are few adjectives of condemnation that
I have not heard applied to the Elsie
Lindtner’s of life. Yet if we look at the matter rightly, rather ought we
to admire her for the perfect self-sacrifice with which she pursued
the one occupation.
II
The question at its root is one of right functioning. For mark the real
point of Elsie Lindtner’s history is this: all her actions were based on
search for pleasure. To gain the possessions of this world was the
fixed aim for which she bartered her soul. What does she tell us in
one of her letters? She is writing of her school-days. A class mate
had said to her, “Of course, a prince will marry you, for you are the
prettiest girl here.” She carried the words home to a maid who
added to the poison:
“That’s true enough,” she said, “a pretty face is worth a pocketful of
gold.”
“Can one sell a pretty face, then?” the child asked.
“Yes, to the highest bidder,” was the answer given.
The seed thus sown gave a rich harvest. Sex-trade became the
object, which Elsie Lindtner pursued with the same unflinching
purpose which directs all those who create for themselves the false
gods of possessions. Truly, while we support with our praise the
successful financier, we cannot in justice give less esteem to the
woman who pursues the same end in the way that is the easiest and
surest of success.
It is no part of my purpose to give a resumé of the history of Elsie
Lindtner. The details matter little; a structure of life built on a false
foundation must of necessity fall to ruin. And there is another point I
wish to make clear. The destroying penalty paid by this woman for
the gain of wealth and position was a failure of the power to love.
The real explanation of her unrest, hysteria, and manifold symptoms
of excitement was caused by the unceasing warfare within her of
two antagonistic forces—the desire for comfort and ease, partly
instinctive, but also fixed by habit, strengthened by a wish to keep
the moral dignity imposed upon women by the conditions of the
society in which she lived, fighting with the deeply instinctive desire
for satisfying sex experience to fulfil the functioning of life.
It is necessary for women to speak plainly. You cannot deny the
needs of the body, or prostitute their use, without the soul paying its
penalty. That is what women too often forget. A false purity held
Elsie Lindtner from giving herself to her lover, Jorgen Mallthe, and
kept her faithful in the letter of the law to the husband she had
married for his wealth. She had no children. I say without any doubt
that she would have been a purer and a better, because a happier
and more healthy woman, if she had followed the cry of her heart,
at the first, as she was driven in the end to want to do—when it was
too late. That she did not do this, but chose to sacrifice her lover in
the same way that she had sacrificed her husband must, in my
opinion, be counted as sin against her. Only the falseness which had
wrapped her own life in a net of pretence could have made her fail
to see the truth for herself.
It is a fact of very special importance that Elsie Lindtner and all the
women who enter into this book belong to the Scandinavian race,
among whom chastity was extolled as the chief virtue of a woman,
while any lapse was punished with terrible severity. If the husband
of an ancient Dane discovered his wife in adultery he was allowed to
kill and castrate her lover. “There is a city,” says the Scandinavian
Edda, “remote from the sun, the gates of which face the north,
poison rains there through a thousand openings, the place is all
composed of the carcasses of serpents. There run certain torrents,
in which are plunged the bodies of the perjurers, assassins, and
those who seduce married women. A black-winged dragon flies
incessantly round and devours the bodies of the wretched who are
there imprisoned.” Again, the Icelandic Hava Maél contains this
caustic apophthegm “Trust not the words of a girl, neither to those
which a woman utters, for their hearts have been made like the
wheel that turns round; levity was put into their bosoms. Trust not
to the ice on one day’s freezing, neither to the serpent which lies
asleep, nor to the caresses of her you are going to marry.”
III
Now, it may be asked: What has all this to do with Elsie Lindtner?
My answer is: “Everything!” The customs of a past social life do
subsist beneath the surface of modern society; we cannot without
strong effort escape from the chains of our inheritance. In the sad
nations of the cold north, where the natural joy of the body has
been regarded as something to be fought with and denied, a
perpetual confusion has arisen at the very source of life. For the sex-
passion is a force, huge and fateful, which has to be reckoned with.
Woman is more primitive, more intuitive, more emotional than man.
And the outlets allowed to her in the past have been more
restricted; thus the price she pays for any repression of the natural
rights of love is heavier. Elsie Lindtner’s history is a sermon to all
those who set up the false god of chastity for women.
I am aware that this statement will arouse opposition—especially in
women. To-day we hear much talk, and often among women who
are working nobly for the better life for women, of control of sex and
the need of imposing on men the same code of repression which for
so long has been imposed upon them. This is, of course, very
natural, but that does not make it wise. It is a truth realised by few
women that repression is not, and never can be, control. There
seems to be a very widespread opinion that to use the divine gift of
sex even in marriage, for joy, is wrong. One would be inclined to
laugh, if the sadness of this falsehood did not make one want to
weep.
The whole subject, wide as life itself, escapes anything like adequate
treatment. The lady—the Elsie Lindtners of society—the household
drudge and the prostitute, are the three main types of women
resulting in our so-called civilisation of to-day, from the process of
the past, and it is hard to know which is the most wretched, which is
the most wronged, the most destructive, and the furthest removed
from that ideal woman which a happier future may evolve.
What, then, in conclusion, is the lesson to be learnt from this “Tract
for the Times?” Women must be free—free to work and free to love.
Then, and then only, can they claim to be the fitting mates of men,
then and then only, will they be able to fulfil aright their supreme
work as the mothers of the sons and daughters of the race. This is
the path along which freedom is to be found. What, then, is the
individual woman to do? This question is one which women at the
present have to answer for themselves. But one thing is certain—
they must have the courage to tear from their eyes the old and the
new bandages that have kept them, and still keep them, in the
darkness of ignorance; better even to sin and know the truth than to
live in falsehood and in a child’s world of pretence.
ebookball.com