Windows CE 5
|
Windows Embedded CE
6.0
|
|
Boot Sequence
|
- kernel was
hard-coded to launch filesys.exe as the second process.
- starting order of system processes and applications was
controlled by registry settings underHKEY_LOCAL_MACHINE\Init.
|
- most of the system
processes have been converted to DLLs that load inside the kernel process,
the system uses a mechanism that supports both DLLs and executables.
- You cannot specify
command-line parameters for executables.
This is unchanged
from previous versions of Windows Embedded CE.
-
Application-loading sequences are specified under the HKEY_LOCAL_MACHINE\Init
registry key.
- You can specify
the load order of system DLLs, executables, and applications under
theHKEY_LOCAL_MACHINE\Init registry key. - The OS launches executables listed
under this key and loads DLLs under this key into the kernel.
You can specify
which DLL entry point to call when the application starts.
- The startup sequence is similar to the service startup
sequence in Services.exe and the registry enumerator.
|
Virtual Memory Layout
|
1. there was a limit
of 32 processes, and a 32 MB limit on virtual memory (VM) for each process.
2. all of the
processes shared the same 4 GB address space.
3. the current
application executed in slot zero
|
1. the kernel
process resides in the upper 2 GB of the 4-GB (32-bit) virtual memory space,
and the bottom 2 GB is unique for each process.
2. limit of about
32,000 processes, due to the number of handles that can be created. The
practical limit on the number of processes is bounded by the amount of
physical memory.
3. slot zero, and
all other process slots, are effectively 2 GB each.
4. Because virtual
memory access is translated into hardware access through the memory
management unit (MMU), virtual memory code is CPU-dependent. ARM and x86 CPUs
use hardware page tables, so the content of virtual memory is accessed
directly by the hardware.
|
Handle Tables
|
1. a handle to an
event, a thread, a process, a mutex, and so on, could be passed to a
different process and be usable by that process.
- If two
handles were opened to the same object, the handle value, which is the 32-bit
identifier that an application holds onto, was the same for both handles.
In Windows CE 5.0,
generated handle values could elevate user privileges.
- There was one
global list of handles that was shared by all processes. Handle objects are
locked before they are used, and unlocked after they are used. The locking
mechanism is a reference counter, which is incremented before the handle is
used and decremented after the handle is used.
- Handle
objects are destroyed only when their reference counter equals zero, so
handle objects in use are never destroyed.
- a handle object
could be destroyed while it was still in use, for example, in the middle of a
call to an API.
8.the reuse count
was only 3 bits, so a handle could easily be reused. Therefore, stale handles
could be a problem.
-returned the same
handle value for duplicated handles, or a named handle of the same name.
|
1. each process has
its own individual handle table.
- If two handles to
the same object are opened, they have different values, even within the same
process.
- A handle value in
one process cannot be used to access that object in another process. This
includes the kernel.
- The kernel
process, including the kernel-mode servers running under it, has its own
handle table, and cannot use a handle that was opened by a different process.
- If you try
to pass a handle from one process to another, that handle value may already
be used by the other process to refer to a different object. If that other
process tried to use the handle value, it would access a different object.
This improves security because handle guessing is eliminated.
- Handles are looked
up in the handle table, which the user cannot access. This prevents users
from generating handle values.
- Similar to Windows
desktop-based operating systems, every newly created handle, including newly
duplicated handles, has a unique value.
8. Handles cannot
easily be reused because there is a 16-bit reuse count. Therefore, about
64,000 operations to create and close handles would be required to exhaust
the reuse count.
Tradeoffs of the
Handle Tables
Handles are only valid within the process that created
them. Handles cannot be passed between processes. Existing code that passes
handles from process to process must be changed to useDuplicateHandle to create a new handle that the other process can use.
If necessary, use OpenProcessto access the other process.
|
Mapping Pointers and Sharing Memory
between Processes
|
- When a function
gets called, the kernel performed a 1-byte access check on pointer parameters
and marshaled the pointer by mapping it.
- The OS address space was arranged so that
the 32-MB virtual-memory address space for every process was accessible at
all times.
- Therefore,
mapping required only modifying the pointer to point to the right memory
space of the target process.
- The server process
was responsible for calling a function such as MapCallerPtr to verify that
the caller process had sufficient privileges to access the entire buffer, and
the server process was responsible for access-checking and marshaling any
embedded pointers.
- both the access
check and marshaling were covered by calling MapCallerPtr.
- The server was also responsible for performing a secure
copy, if necessary.
|
- when an
application calls a function, the kernel performs the full access check on
buffer parameters, taking responsibility for that protection away from the
server processes.
- This is made
possible by giving the kernel more information about parameter sizes. The
kernel still marshals pointer parameters, and servers must still marshal
embedded pointers. Servers must still perform a secure copy, if necessary.
The following list shows what has changed:
- The kernel has
taken over full access checking of pointer parameters.
- The function
servers must call to marshal parameters.
- Options available
for servers to perform a secure copy.
- marshaling must be handled if the server needs to
access a buffer asynchronously.
|
Loading DLLs in Kernel Mode or User Mode
|
- One DLL cannot
simultaneously load into both kernel mode and user mode.
- When you run an executable file or a DLL, the code must
be able to run at its specified address. For example, jumps within the code
or references to global variables must be modified to refer to the hard-coded
addresses. Because kernel DLLs load above 0x80000000 and user DLLs load below
0x80000000, it is impossible for a single copy of the DLL to be able to run
in both locations at once.
|
- In Windows
Embedded CE 6.0, the OS bypasses this limitation by having two versions of
some DLLs; one version to load in kernel mode and one version to load in user
mode.
- The kernel has a
new naming standard for DLLs that load in both kernel mode and user mode. The
kernel-mode DLL has a k. at the beginning of the name. user-mode version of
coredll is coredll.dll whereas the kernel-mode version is k.coredll.dll.
- The kernel
automatically translates kernel-mode accesses to user-mode DLLs into the
proper kernel-mode version for this version. For example, if a DLL is linked
to the user-mode coredll.dll, as almost all DLLs in the build system are,
when that DLL is loaded into the kernel process, the DLL is importing from
the kernel-mode k.coredll.dll, instead. There is no load error in this case
because the imports are seamlessly redirected to the kernel DLL. Similarly,
if code in the kernel process calls LoadLibrary on coredll.dll, it actually loads a reference to
k.coredll.dll. Therefore, if it calls GetProcAddress and calls a function, it calls the proper kernel-mode
function.
- if you implement
DLLs, you do not need to change all coredll.dll references to k.coredll.dll
references.
- In fact, that
would destroy portability of your code to user mode. In the future, you may
want to run your code in user mode, instead of inside the kernel.
OEMs may need to specify where their DLLs load with .bib
file flags. The Z flag specifies Windows CE 5.0 and prior versions. Z cannot
be combined with the compression flag C, whereas there are no such
|
Process Switching
|
File system.exe, GWES.exe, and Device.exe are process
hence process switch required.
|
File system.exe,
GWES.exe, and Device.exe have become libraries which are loaded into the
kernel. Now that they are libraries, there is no process switch between them.
- Services.exe is still a user-mode process.
|
Paging Pool
|
- the paging pool
was a fixed-size portion of memory reserved for executable code and
read-only, memory-mapped files.
- If the amount of
code loaded into memory at any time was smaller than the pool, the pool did
not shrink to match.
- if the amount of
coded loaded at any time was larger than the pool, only the most recently
used pages were held in memory, up to the size of the pool. - The pool did
not grow to hold more code, so executable code discarded.
- OEMs controlled
the size of the paging pool with an OEM adaptation layer (OAL) variable, cbNKPagingPoolSize.
- the page pool
maintained a physically contiguous range of pages and kept an array of
information to track each page in the pool.
- Pages were kept in a global first-in, first-out (FIFO)
list, and in a list per module for quick discarding of a module on unload.
|
- The pool can
temporarily exceed its reserved size.
- Rather than
setting a single size for the pool, an OEM can now choose a target size for
the pool, plus a maximum size.
- There is always
enough memory reserved for the pool to grow to reach its target.
- Above that, if
memory is available the pool continues to grow, up to the maximum limit.
- The pool never
exceeds the maximum.
- As soon as the
pool exceeds the target, the kernel wakes up a trimming thread that walks
through modules and discards pages.
- The trimming
thread runs at low priority normally, so that paging operations do not
disturb other system activity.
- If the pool
approaches its maximum limit, the trimming thread runs at higher priority
temporarily to ensure that pool memory is released.
- There are now two
pools.
- One pool, the
loader pool, holds executable code and read-only, memory-mapped files as
did the Windows CE 5.0 paging pool.
- A second
pool, the file pool, holds data pages from memory-mapped files and
from the new CE 6.0 file system cache manager.
- The file pool is
different from the loader pool in that its pages may also be read/write, so
they may need to be written back to disk before being discarded.
- Therefore, the
file pool can be configured separately from the loader pool to maximize
system performance.
- Because file
writes are relatively slow operations, the file pool trimming thread runs at
lower priority than the loader pool trimming thread.
- the OAL variable cbNKPagingPoolSize
is deprecated.
- Instead, to
configure paging pool parameters, OEMs can implement a new IOCTL in their
OAL: IOCTL_HAL_GET_POOL_PARAMETERS.
- If the OAL does
not implement this IOCTL, the kernel chooses suitable default settings.
- The kernel also
exposes information about the current state of the paging pool to
applications through the new kernel IOCTL IOCTL_KLIB_GET_POOL_STATE.
- Applications can call this IOCTL to query current
memory usage and other state information about the paging pools.
|
Kernel Mode
|
1. SetKMode and ALLKMODE exist.
|
1. modules (DLLs)
are loaded in the kernel process, a user process, or both.
2. any thread
owned by a module loaded in the kernel process is said to run in kernel mode.
3. any thread owned
by a module loaded in a user process is said to run in user mode.
4. For threads to migrate to different processes, but in
general, this happens only for a short duration when the threads are in
process server library (PSL) servers.
|
Kernel Servers
|
- a process server
library (PSL) is a process that implements a set of APIs for applications to
call.
- a kernel-mode
server is a DLL that loads into the kernel process and implements a set of
APIs for applications to call. Kernel.dll, filesys.dll, device.dll, gwes.dll,
and most of device drivers are kernel-mode servers.
- The kernel-mode
servers are supported by a kernel-only version of coredll named kcoredll.dll.
Any code that loads into the kernel, but was linked to coredll.dll, is
automatically redirected to use k.coredll.dll, instead.
Simplified and improved security for API calls.
|
- a user-mode server
is a process that registers an API set.
- Services.exe is a
user-mode server that loads some drivers that in previous version of Windows
Embedded CE were loaded by filesys, device, and gwes.
- Improved performance for most API calls.
|
I am an expert in WinCE driver to BSP development. I am too excellent in Linux development. I offer my services as consultant. Do mail me: exebinary@gmail.com Deeply involve in debugging and development activity. I am also available for training in Asia and International destination.
Wednesday, December 3, 2014
WinCE 5 vs WinCE 6 [Windows]
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment
Please add your valuable feedback and suggestion...
Note: Only a member of this blog may post a comment.