Rajat Jain wrote:
On 8/3/06, Rajendra <rpm@xxxxxxxxxxxxx> wrote:
Ok, it seems like the stuff that i wrote was not quiet clear, let me
rephrase.
o When something runs on a processor, processor just understands the
the privilege
level (PL) of the code in case of linux it is either 0 or 3. The
whole idea of kernel space
and user space is an abstraction for understanding and
implementation.
o If the processor has paging enabled (which is always true), then it
requires to have
a page table entry for every page that is accessed be it PL 0 or
PL 3.
o Now we need some code to manage to whole of the physical memory and
suitably add
or remove the page table entries and we call such a code as kernel
code.
o In case of Linux everything that runs on the processor is always a
part of something called
a process. So, every instruction that runs has to be a part of some
process (except for interrupts)
The "process" is again a unix abstraction of grouping certain
sequence of instructions.
o We say that the process has access of the whole 4 GB virtual address
space as the processor
can generate that many unique virtual addresses.
o What we say is, the first three GB address will always run at PL3
while the next 1 GB will
be at PL 0.
o The top 1 GB address space is called the kernel and is common for all
processes.
o When a process is created, the X86 linux creates a page table for
process's first 3 GB entries
as required by the executable running while the last 1 GB is shared
with all processes
as it is the kernel address.
o Since the kernel code has to be always present and can never be paged
out, so it's entries
are pinned i.e. always present in page tables. Hence we identity map
the pages i.e. virtual
address is same as physical address (except for the MSB nibble which
is >= 0xC).
o Now the question that comes is, what if the physical memory is more
then 1 GB, so for
such a case we call it as high memory and manage it using temp. page
table entries.
o One thing we have to note here is that, kernel is the code that
creates page table entries
for user process and sometimes needs to access the pages. Now for
accessing the pages
it needs some entry in the page table that maps the virtual page
with physical page. For
the first 896 MB of physical pages, the entries are identity mapped
while for the rest we
have to first add an entry in page table and mark it as PL0 and then
only the processor
will allow a valid access.
o If we want to access the high memory with user space addresses then
kernel will
have to find the virtual address in the user space which is free and
map it to the high
memory and such a mapping will be available only for the process as
the entries are
present in it's page table only. (Page tables are per process in
linux)
Firstly, Thanks a TONN for the above mail (surely clarified all my
doubts)! But just one query.
If the kernel wants to access the high memory, it will map it into the
virtual address space of the KERNEL (3GB -> 4GB), right? Now at this
point, what will happen to the original (identity) mapping of that
kernel virtual memory address (to which it has now mapped the high
memory)?
TIA,
Rajat
That is why kernel does not access the whole 1 GB, it's only 896MB, the rest
of the 128MB is used to create temp page table entries for the high mem.
e.g. if you have 2 GB of ram, then the 896 MB will be identity mapped while
for the rest 1GB + 128MB we will use the 128 MB kernel address space for
accessing the "high memory". The 896 MB limit comes only if you have
compiled the
kernel with CONFIG_HIGHMEM option enabled else it is assumed that
you do not have high memory in you system.
regards,
~rpm
-
To unsubscribe from this list: send the line "unsubscribe linux-newbie" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.linux-learn.org/faqs