week 10 bug fix submission (SF PDK version): Bug 1892, Bug 1897, Bug 1319. Also 3 or 4 documents were found to contain code blocks with SFL, which has been fixed. Partial fix for broken links, links to Forum Nokia, and the 'Symbian platform' terminology issues.
<?xml version="1.0" encoding="utf-8"?><!-- Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies) All rights reserved. --><!-- This component and the accompanying materials are made available under the terms of the License "Eclipse Public License v1.0" which accompanies this distribution, and is available at the URL "http://www.eclipse.org/legal/epl-v10.html". --><!-- Initial Contributors: Nokia Corporation - initial contribution.Contributors: --><!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN" "concept.dtd"><concept id="GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF" xml:lang="en"><title>ImportantChanges between EKA1 and Kernel Architecture 2</title><shortdesc/><prolog><metadata><keywords/></metadata></prolog><conbody><p>This document is a summary of the important changes made between EKA2 andthe Kernel Architecture 2. </p><ul><li id="GUID-39A4F67F-15DD-5443-AF04-B51E659AD158"><p> <xref href="GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF.dita#GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF/GUID-1F882F2F-3BF4-5891-824D-01144652A771">Real time kernel</xref> </p> </li><li id="GUID-703989BD-22DD-5B48-BD44-03A6BCDE4B96"><p> <xref href="GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF.dita#GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF/GUID-93FC5632-139C-529C-81BF-723D2931E422">Multi-threaded kernel</xref> </p> </li><li id="GUID-B8B0160F-9762-5CB2-BB0E-F363E89F6DB5"><p> <xref href="GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF.dita#GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF/GUID-58061C31-3D55-5C92-86A6-9A07748DE12D">Memory model</xref> </p> </li><li id="GUID-E5C26246-2536-5092-B241-49BC0D7639F4"><p> <xref href="GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF.dita#GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF/GUID-AEB5D074-7993-5ECE-8168-FFD7C7119842">Bootstrap</xref> </p> </li><li id="GUID-77CB12E7-B1AA-5B94-AACE-E616289BAC09"><p> <xref href="GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF.dita#GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF/GUID-858E4DFA-3988-566B-9B9C-614D7D64843D">Chunks per process</xref> </p> </li><li id="GUID-45E655B9-11E5-5790-AA7D-BEA5A57ADC44"><p> <xref href="GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF.dita#GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF/GUID-4F31E633-3418-5FEF-B034-E4E42D12ECAE">Releasing blocked threads</xref> </p> </li><li id="GUID-8DC829A6-ECF3-5DA6-A212-C47242B7CF2E"><p> <xref href="GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF.dita#GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF/GUID-86BE8113-3442-585D-8AA1-622C6A0E5C33">Stricter checking on the use of invalid handles</xref> </p> </li><li id="GUID-21898C1A-9AF1-5A6A-B151-2446D8B26210"><p> <xref href="GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF.dita#GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF/GUID-70A788E3-EDB4-52B5-85F1-083F0C041161">Kernel is no longer dependent on EUSER.DLL</xref> </p> </li><li id="GUID-1915EE78-FBCC-5B1A-BA16-84FF781331D1"><p> <xref href="GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF.dita#GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF/GUID-14A08FAE-ADA1-55A8-9398-309E7FE517E3">Kernel-side code no longer leaves</xref> </p> </li><li id="GUID-7372DD68-A1E0-552B-B83E-6469586F4369"><p> <xref href="GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF.dita#GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF/GUID-BCDC2615-0F4A-55A2-8806-0963C2939349">No kernel-Side support for unicode</xref> </p> </li><li id="GUID-9D2D33C4-B3E1-5169-B10C-229318C69D9F"><p> <xref href="GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF.dita#GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF/GUID-AA9A48C6-5033-5459-AC1A-809FAEFB9001">Kernel-side code uses DBase instead of CBase</xref> </p> </li><li id="GUID-080AD2D2-2394-5653-89E8-3ADA0FB9AA38"><p> <xref href="GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF.dita#GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF/GUID-745A19A0-FA97-5250-B493-C0613EAE162E">Asynchronous deletion</xref> </p> </li><li id="GUID-125A5C43-0D8C-5CEB-99F0-2FBF80C466FD"><p> <xref href="GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF.dita#GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF/GUID-EBD2C3D9-D422-5EDC-B2DF-BEBE713DFF49">Accessing user side memory directly not permitted</xref> </p> </li><li id="GUID-42EA847A-CC94-5630-BC52-FF2A33DD0D39"><p> <xref href="GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF.dita#GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF/GUID-E0313A56-3F85-5614-964A-30972BA0193D">Kernel side code uses DObject instead of CObject</xref> </p> </li><li id="GUID-B16C285F-58CF-543A-91DA-42E12738D70F"><p> <xref href="GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF.dita#GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF/GUID-FADA0E2F-A37B-58A1-93AD-5DEF04ECD0D1">Device Driver Model</xref> </p> </li><li id="GUID-4E25E221-01D6-5F68-A205-2D03EF837DC4"><p> <xref href="GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF.dita#GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF/GUID-66C87C5D-D71B-5D98-9B49-C7FD4D18D540">Base porting</xref> </p> </li><li id="GUID-B02F4ACE-2139-588B-AEF4-14773B16EDF3"><p> <xref href="GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF.dita#GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF/GUID-FA2341A0-1743-5FE3-9C22-E2575816BE8D">Emulator</xref> </p> </li><li id="GUID-35FE60FE-0C63-5CC1-BC50-85B050265ADB"><p> <xref href="GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF.dita#GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF/GUID-B3073835-E9D7-5219-BC63-D7296ABB9B5C">Kernel-side messages</xref> </p> </li><li id="GUID-8C1A6D8D-23C7-5A80-A915-0938FC129F28"><p> <xref href="GUID-AD2BD987-E097-5E1F-A914-B91CFB706D51.dita">EnvironmentSlots</xref> </p> </li><li id="GUID-A125477D-24BD-5C59-96FA-52C8448A8286"><p> <xref href="GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF.dita#GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF/GUID-8D788A9A-3AE1-5A5E-9761-5DCC81A60603">Power management</xref> </p> </li><li id="GUID-6A2B9214-A194-5819-A0FA-EC7B6E060563"><p> <xref href="GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF.dita#GUID-43BC99CA-9D60-557C-A43C-99EF1D6E4ECF/GUID-E8321E95-FEE1-516D-8EED-30B6C2C25E18">Support for alternative heap allocators</xref> </p> </li></ul><section id="GUID-1F882F2F-3BF4-5891-824D-01144652A771"><title>Real time kernel</title> <p>Oneof the main design goals for EKA2 is to provide real-time guarantees for asubset of kernel operations. Real time performance is one that guaranteesa response time; it does not mean that the response time is necessarily fast,it means that the time taken is bounded, i.e. it is deterministic or predictable. </p> <p>Veryfew changes to user side code are needed; the aim has been to maintain compatibilityat the EUSER level as far as possible. Device drivers, however, will needsome changes at the EUSER level, and more so on the kernel side. See the <xref href="GUID-0437DB4C-FC4E-51DC-BB4C-95C0B26834F5.dita">Device Driver Guide</xref> fordetails. </p> </section><section id="GUID-93FC5632-139C-529C-81BF-723D2931E422"><title> Multi-threadedkernel</title> <p>In EKA2, the kernel is multi-threaded, i.e. any number ofthreads can now run on the kernel side. This means that a lower priority kernelthread can be preempted by a higher priority thread. </p> <p>Each user threadhas two stacks: a user stack as in EKA1, and an additional kernel stack allowingit to be preempted virtually anywhere while executing kernel-side code. Thisadds approximately 4k to each thread's memory requirements. </p> <p>This changehas the effect of simplifying device driver design. It also means that mostkernel-side data structures need to be protected against concurrent accessesto prevent race conditions. Several synchronisation primitives are availableto achieve this. </p> <p>A deadlock prevention strategy must be followed bykernel-side code. </p> </section><section id="GUID-58061C31-3D55-5C92-86A6-9A07748DE12D"><title>Memory model</title> <p>TheEKA2 core kernel is MMU-agnostic. All MMU code is isolated into a “memorymodelâ€, which is linked at build time against the kernel. EKA2 provides threedifferent memory models: </p> <ul><li id="GUID-59368906-3EC3-52CF-A1B9-239ABAEB7F21"><p>Moving memory model:This is functionally equivalent to EKA1, and is intended for ARMv4 and ARMv5CPUs. A single page directory is used and page directory entries are movedbetween the home and run sections at address space switch time. </p> </li><li id="GUID-D4FCDAB7-0D20-5122-86CC-CAAA5F551DF7"><p>Multiple memory model:This is a new model for CPUs based on ARMv6 architecture. There is one pagedirectory per process </p> </li><li id="GUID-BE4852CB-3C4C-59A0-807D-D8E6150635EB"><p>Single memory model:This model can be used for CPUs that have no MMU, or to simplify of portingthe core kernel to a new MMU-aware CPU. In the latter case, the MMU is enabledbut there is a single address space in the system. This allows incrementalporting to a new CPU, by first porting the kernel and then the MMU. </p> </li></ul> <p>The memory map (e.g. the base address of the ROM image) has changed.Therefore any code relying on the EKA1 memory map will need changing. Theimpact should be minimal, as code outside the kernel should not be makingassumptions about memory layout. </p> </section><section id="GUID-AEB5D074-7993-5ECE-8168-FFD7C7119842"><title>Bootstrap</title> <p>TheC/C++ generic bootstrap used in EKA1 has been replaced with an assembler bootstrap,which is split into a generic layer usable on any ARM device and a device-specificlayer. </p> </section><section id="GUID-858E4DFA-3988-566B-9B9C-614D7D64843D"><title>Chunks perprocess</title> <p>The number of chunks per process is limited to 16 in themoving memory model. This ensures that switching between address spaces operatesin bounded time. </p> </section><section id="GUID-4F31E633-3418-5FEF-B034-E4E42D12ECAE"><title>Releasing blockedthreads</title> <p>Threads that are blocked on semaphores and mutexes arenow released in priority order, not in FIFO order. </p> </section><section id="GUID-86BE8113-3442-585D-8AA1-622C6A0E5C33"><title>Stricter checkingon the use of invalid handles</title> </section><section id="GUID-70A788E3-EDB4-52B5-85F1-083F0C041161"><title>Kernel is nolonger dependent on EUSER.DLL</title> <p>The kernel no longer has any dependencyon EUSER.DLL. Only user side code can link against EUSER.DLL. </p> <p>Thereare three main reasons for this: </p> <ul><li id="GUID-72571CC2-FFC1-56FF-8B64-C3AEF94F2581"><p>It allows more robuston-target application debugging, as it is no longer possible to crash thekernel by putting an application breakpoint in shared code. </p> </li><li id="GUID-91726D13-397C-58E8-9405-185D05C13F0E"><p>It reduces the sizeof the minimum system configuration. </p> </li><li id="GUID-61B6DEAD-42F4-5BBC-9A83-8C038149E114"><p>It allows the kernelto be built using a different compiler to that used to build the user side. </p> </li></ul> <p>This has important consequences for kernel side code. Any code thatruns on the kernel side, including device drivers, cannot use classes, functionality,or behaviour that is implemented by EUSER.DLL. Although not a complete replacementfor this lost functionality, the Nanokernel and the Symbian platform kerneldo provide a set of utility functions such as <xref href="GUID-E2C25A1E-46B4-3697-A939-613CA366D87A.dita"><apiname>memcpy()</apiname></xref>, <xref href="GUID-5A95E126-A82F-3F29-9810-FA1CD35E8B19.dita"><apiname>memset()</apiname></xref>,and <xref href="GUID-AC5005AE-EDC0-36EE-B877-2F91B09B0068.dita"><apiname>memmove()</apiname></xref>. </p> </section><section id="GUID-14A08FAE-ADA1-55A8-9398-309E7FE517E3"><title>Kernel-sidecode no longer leaves</title> <p>Kernel-side code can no longer use the leave/cleanupstack mechanism. If appropriate, functions must now provide a return code,and callers need to check return values. </p> <p>Note that this mechanismis still available on the user side. </p> </section><section id="GUID-BCDC2615-0F4A-55A2-8806-0963C2939349"><title>No kernel-Sidesupport for unicode</title> <p>The EKA2 kernel only provides support for ASCIIstrings. </p> <p>All kernel objects such as processes, threads, etc. haveASCII names. The kernel does use a few unicode strings but it treats themas opaque types. As kernel object names are limited to ASCII, user-side codemust use only the ASCII subset of unicode when creating such objects. </p> </section><section id="GUID-AA9A48C6-5033-5459-AC1A-809FAEFB9001"><title>Kernel-sidecode uses DBase instead of CBase</title> <p>Classes that are instantiatedon the kernel heap must now use <xref href="GUID-4FCB6127-84F3-38F6-8AD2-FC3B94D67DA3.dita"><apiname>DBase</apiname></xref> instead of <codeph>CBase</codeph>. <codeph>CBase</codeph> canonly be used by user-side code. </p> <p> <codeph>DBase</codeph> is definedin <filepath>...\e32\include\kernel\klib.h</filepath> and exported to <filepath>\epoc32\include\kernel\klib.h</filepath> </p> </section><section id="GUID-745A19A0-FA97-5250-B493-C0613EAE162E"><title>Asynchronousdeletion</title> <p>The <xref href="GUID-4FCB6127-84F3-38F6-8AD2-FC3B94D67DA3.dita"><apiname>DBase</apiname></xref> class provides the behaviourthat allows objects to be deleted asynchronously. This is particularly usefulwhen memory deallocation needs to be done by time critical code. </p> <p>Deletionis done by placing the object onto a queue and then triggering a DFC, whichruns in the context of the supervisor thread. </p> </section><section id="GUID-EBD2C3D9-D422-5EDC-B2DF-BEBE713DFF49"><title>Accessing userside memory directly not permitted</title> <p>Kernel side code must not accessuser side memory directly. Use the functions specifically provided for thepurpose: </p> <p> <xref href="GUID-B56A34CD-E5B5-3E3E-A2EE-3BC9D248B210.dita"><apiname>kumemget()</apiname></xref>, <xref href="GUID-15B62FF1-5D59-3A84-9648-EB0DBFE17232.dita"><apiname>kumemget32()</apiname></xref>, <xref href="GUID-C7AB0391-99D5-31A2-91D4-A7F195546FC3.dita"><apiname>kumemput()</apiname></xref>, <xref href="GUID-D141C3C4-F2F6-37DF-BDF6-63DDE9052FA0.dita"><apiname>kumemput32()</apiname></xref>, <xref href="GUID-B51F91FF-E5CD-3D5F-8BB3-B18E58761B62.dita"><apiname>kumemset()</apiname></xref>, <xref href="GUID-F5136CAF-B66F-388D-A610-D0153CAF7E23.dita"><apiname>umemget()</apiname></xref>, <xref href="GUID-B55573FC-B21C-384A-8B1E-A6A4301310E9.dita"><apiname>umemget32()</apiname></xref>, <xref href="GUID-371860F0-36BF-340D-BEF6-1763EF9874AE.dita"><apiname>umemput()</apiname></xref>, <xref href="GUID-B2DF3520-01CE-3D2C-8137-746ADBCBAE80.dita"><apiname>umemput32()</apiname></xref>, <xref href="GUID-16048974-7407-3778-9BD3-B8417E3F795A.dita"><apiname>umemset()</apiname></xref>, <xref href="GUID-C6946ECB-775F-3EC2-A56F-78F25B9FBE3D.dita#GUID-C6946ECB-775F-3EC2-A56F-78F25B9FBE3D/GUID-C505206F-F54F-3760-BA7D-2DB52AB4E0B3"><apiname>Kern::ThreadDesRead()</apiname></xref>, <xref href="GUID-C6946ECB-775F-3EC2-A56F-78F25B9FBE3D.dita#GUID-C6946ECB-775F-3EC2-A56F-78F25B9FBE3D/GUID-FA321582-6D75-37A1-8DAB-D50638F76593"><apiname>Kern::ThreadDesWrite()</apiname></xref>, <xref href="GUID-C6946ECB-775F-3EC2-A56F-78F25B9FBE3D.dita#GUID-C6946ECB-775F-3EC2-A56F-78F25B9FBE3D/GUID-904A42A8-8077-3FC6-BEF2-29619F079842"><apiname>Kern::ThreadRawRead()</apiname></xref>, <xref href="GUID-C6946ECB-775F-3EC2-A56F-78F25B9FBE3D.dita#GUID-C6946ECB-775F-3EC2-A56F-78F25B9FBE3D/GUID-182C88F4-326C-376E-9FBE-889E3CB9B68A"><apiname>Kern::ThreadRawWrite()</apiname></xref>, <xref href="GUID-C6946ECB-775F-3EC2-A56F-78F25B9FBE3D.dita#GUID-C6946ECB-775F-3EC2-A56F-78F25B9FBE3D/GUID-D7CE1BF2-F1B8-30E9-9D34-7BDDA39C1B0C"><apiname>Kern::KUDesGet()</apiname></xref>,and <xref href="GUID-C6946ECB-775F-3EC2-A56F-78F25B9FBE3D.dita#GUID-C6946ECB-775F-3EC2-A56F-78F25B9FBE3D/GUID-8B62DE20-357F-3499-9F2E-FAD4B18C34D6"><apiname>Kern::KUDesPut()</apiname></xref> </p> <p>See also <xref href="GUID-F46B87B7-97A9-530B-BAC4-EF1DB9C91E39.dita#GUID-F46B87B7-97A9-530B-BAC4-EF1DB9C91E39/GUID-4A7BCB91-C58B-597F-85B6-74463BE9BC04">accessing User Memory</xref> in <xref href="GUID-F46B87B7-97A9-530B-BAC4-EF1DB9C91E39.dita">Portinga device driver from EKA1 to EKA2</xref> </p> </section><section id="GUID-E0313A56-3F85-5614-964A-30972BA0193D"><title>Kernel sidecode uses DObject instead of CObject</title> <p>Kernel side objects that arereference counting, must now derive from <xref href="GUID-E48F1435-14B6-37F1-BE47-2EA803AFE497.dita"><apiname>DObject</apiname></xref> insteadof <codeph>CObject</codeph>. </p> <p> <codeph>CObjectCon</codeph> also hasa kernel-side equivalent <xref href="GUID-7FB9067F-D200-382C-84F7-49F0548D0A7F.dita"><apiname>DObjectCon</apiname></xref>. </p> </section><section id="GUID-FADA0E2F-A37B-58A1-93AD-5DEF04ECD0D1"><title>Device DriverModel</title> <p>The device driver model has changed. See the <xref href="GUID-0437DB4C-FC4E-51DC-BB4C-95C0B26834F5.dita">DeviceDriver Guide</xref> for the detail. </p> </section><section id="GUID-66C87C5D-D71B-5D98-9B49-C7FD4D18D540"><title>Base porting</title> <p>EKA1,allows only a single hardware interfacing architecture. The lowest layer ofthe kernel contains the ASSP-specific code and a separate variant DLL containsvariant-specific code called by the kernel. </p> <p>In contrast, the EKA2core kernel, <filepath>ekern.exe</filepath>, is agnostic as regards the hardwareinterfacing architecture. It does not contain any peripheral-related code,and and only requires a variant DLL. The amount of functionality to be providedby this DLL is much smaller than in EKA1. </p> <p>In general, EKA2 base portsuse one of the following two architectures: </p> <ul><li id="GUID-57765CBB-ED06-50FD-8A9D-A972BD1FD517"><p>ASSP+Variant: wherethe Variant is split into an ASSP layer (a DLL) and a Variant layer (a DLL).The first DLL contains all the ASSP-specific / device-agnostic code, and thesecond DLL contains the device-specific code. This allows code sharing betweendifferent devices using the same ASSP/ASIC. The interface between the ASSPand variant DLLs is private. </p> </li><li id="GUID-F52159AE-5A0A-5452-A742-F212DF68D948"><p>Variant alone: Boththe ASSP and the device specific code is included in a single Variant DLL.This saves the effort of partitioning the code if only one device is planned. </p> </li></ul> <p>In addition, peripheral-related features that are part of the kernelin EKA1 (e.g. DMA framework) are now implemented as kernel extensions. </p> </section><section id="GUID-FA2341A0-1743-5FE3-9C22-E2575816BE8D"><title>Emulator</title> <p>Anumber of changes in the emulator architecture have a system-wide impact. </p> <p><b>Process emulation</b> </p> <p>The emulator supports multiple Symbian platformprocesses. This removes the need for WINS-specific code in various places,notably in server start-up. </p> <p>The emulator still runs as a single WIN32process, so a Symbian platform process can still accidentally write into theaddress space of another Symbian platform process. </p> <p><b>Thread scheduling</b> </p> <p>The emulator uses the same scheduling algorithmas Symbian platform running on hardware. This is in contrast with EKA1 thatleaves Symbian platform thread scheduling to the Windows kernel leading todiscrepancies in behaviour between the emulator and hardware. </p> <p><b>Calling WIN32 APIs from Symbian OS code</b> </p> <p>Because the emulatornow uses the same scheduling algorithm as native Symbian platform, the Symbianplatform kernel may have to suspend a thread while it is executing some arbitrarycode inside Windows. If the thread holds one or more (Windows) locks whenit is suspended and another thread tries to acquire the same lock(s), a deadlockoccurs. To prevent this, Symbian platform code that calls into the WIN32 APImust use new Symbian platform APIs, <codeph>Emulator::Lock()/Unlock()</codeph> or <codeph>Emulator::Escape()/Reenter()</codeph>.The impact should be minimal because most of the code interacting with Windowsis in the Base subsystem. </p> </section><section id="GUID-B3073835-E9D7-5219-BC63-D7296ABB9B5C"><title>Kernel-sidemessages</title> <p>Because the kernel is multi-threaded in EKA2, <xref href="GUID-178E140F-BB15-5A82-99A6-D1BC0E11E018.dita">Kernel-sidemessages</xref> offer a means of communication between Symbian platform threadsexecuting kernel-side code. Typically, they are used by device drivers tocommunicate between a client thread, usually a user thread, and a kernel threadrunning the actual device driver code. </p> </section><section id="GUID-E897C3F8-F275-59F0-BBFC-7981865226F2"><title>Passing handles& data at process creation</title> <p>In EKA2, handles and binary data(in the form of descriptors, or integer values) can be passed to a processat process creation time. Up to 16 separate pieces of information can be passedto a process on creation. </p> <p>See <xref href="GUID-AD2BD987-E097-5E1F-A914-B91CFB706D51.dita">Passinghandles & data at process creation</xref> for more information. </p> </section><section id="GUID-8D788A9A-3AE1-5A5E-9761-5DCC81A60603"><title>Power management</title> <p>TheEKA1 power management framework has been replaced in EKA2 with a new frameworkthat aims at fixing known issues with the EKA1 one. The main design goal forthis new framework is increased flexibility, i.e.: </p> <ul><li id="GUID-03A92EBE-669D-50C1-905B-AA7B9A3FC68A"><p>providing support fora wide variety of power management hardware </p> </li><li id="GUID-FF1E50F6-6DE3-5919-A703-BDA5440E26A1"><p>separating mechanismand policy to allow different power management strategies. </p> </li></ul> <p>As an example of increased flexibility, the set of supported powerstates is extensible by licensees. </p> <p>The changes mean that, on the userside, there is no binary or source compatibility. The impacted componentsare app-framework/UIKON and the GUI LAF (e.g. techview/toolkit). </p> <p>Onthe kernel-side, there is no binary compatibility. Old-style power handlerscan still be built but if one or more of them are active, the system cannotswitch to standby mode. </p> <p>In EKA2, the power model DLL no longer exists.EKA2 replaces the EKA1 user-side framework with a new one based on the conceptof domain. A domain is a set of processes that share the same power managementcharacteristics. </p> <p><b>User-sidechanges</b> </p> <p>A new user-side domain server manages all domains in thesystem and centralises interactions with the kernel. The main requests supportedby this server are: </p> <ul><li id="GUID-63B5CEED-7B05-5F19-A99F-BD51DD144E23"><p>Transition all processesin a given domain to a new power state. </p> </li><li id="GUID-66E37108-73A4-5844-BA3C-5E2FC3C9E1EC"><p>Transition all domainsto a new power state. </p> </li></ul> <p>The set of all domains forms a tree. A request to transition a domainD to a new power state is cascaded down to its children first. D is then transitionedafter all its children have themselves transitioned to the new state. </p> <p>Thedomain server is policy-agnostic. It links against a customisable DLL thatprovides the policy part. This DLL notably specifies the structure of thedomain tree. Usage of the domain framework is optional. Licensees are freeto replace it with another user-side scheme or to implement all their powermanagement policy kernel-side. </p> <p><b>Kernel-sidechanges</b> </p> <p>The new kernel-side framework breaks down into the followingitems: </p> <ul><li id="GUID-2E0FC695-8527-59C7-8F56-09C6E9A349FB"><p>A power manager, embeddedin the core kernel, which implements the power management executive callsand manages the other kernel-side entities </p> </li><li id="GUID-5A04F61E-499A-5CE5-B6EF-19FA26517D53"><p>A set of power handlersimplemented within device drivers. When a power transition is requested, thepower manager dispatches it to every registered power handler. </p> </li><li id="GUID-5576AC0E-4CB6-544A-A547-674EBFC74513"><p>A power controller implementedin a kernel extension. It manages the different sleep modes supported by theCPU. </p> </li></ul> <p>The power handlers and power controller are device-specific. A specificimplementation could specify a private interface between these componentsto extend the generic framework. For example power handlers could notify thepower controller of state changes so the latter can select the most appropriatesleep mode. </p> </section><section id="GUID-E8321E95-FEE1-516D-8EED-30B6C2C25E18"><title> Support foralternative heap allocators</title> <p>User mode threads and processes cannow instantiate their own concrete heap allocator classes for use as the defaultallocator rather than be required to use the Symbian platform supplied <xref href="GUID-EFAFDD75-7E59-306A-882D-317F5564979E.dita"><apiname>RHeap</apiname></xref> class. </p> <p>Thishas been done by defining the new abstract class <xref href="GUID-9DB4A58C-6FC8-3292-A547-4C161BD188FC.dita"><apiname>RAllocator</apiname></xref>. <xref href="GUID-EFAFDD75-7E59-306A-882D-317F5564979E.dita"><apiname>RHeap</apiname></xref>,now derives from this new class. </p> <p>The new class allows threads andprocesses to replace the standard first-fit heap allocator class to improveallocation performance or solve memory fragmentation problems. </p> <p>Thechange has been made to minimise binary compatibilty and source compatibilityimpact on existing software. The following standard allocation functions arecompletely compatible: </p> <ul><li id="GUID-74113B2B-BA3B-57D8-B0E5-7CDB81E9B7A0"><p> <xref href="GUID-B89E4D10-0DFD-3270-B45B-565B01421466.dita"><apiname>operator new()</apiname></xref> </p> </li><li id="GUID-400E98C4-04DC-5608-879B-579D487139DF"><p> <xref href="GUID-05782A1A-60BF-3D6F-AA78-8C1B25E1A3C8.dita"><apiname> operatordelete()</apiname></xref> </p> </li><li id="GUID-317BADC6-0FBB-56A8-9B88-705231ED74AC"><p> <xref href="GUID-C197C9A7-EA05-3F24-9854-542E984C612D.dita#GUID-C197C9A7-EA05-3F24-9854-542E984C612D/GUID-67554CF1-F7D1-37E3-8088-1625B3FCEBB4"><apiname> User::Alloc()</apiname></xref> </p> </li><li id="GUID-C1A56138-2D40-558D-9A00-221F911974EF"><p> <xref href="GUID-C197C9A7-EA05-3F24-9854-542E984C612D.dita#GUID-C197C9A7-EA05-3F24-9854-542E984C612D/GUID-C035F07D-B6D9-3A21-A323-DAC89137280D"><apiname> User::AllocL()</apiname></xref> </p> </li><li id="GUID-0D584313-138F-5463-86B8-E5B558A5FE17"><p> <xref href="GUID-C197C9A7-EA05-3F24-9854-542E984C612D.dita#GUID-C197C9A7-EA05-3F24-9854-542E984C612D/GUID-8944FF54-F874-3340-872B-CF6AD001F694"><apiname>User::AllocLC()</apiname></xref> </p> </li><li id="GUID-84E0415D-66F4-5A61-818F-244790DAD52A"><p> <xref href="GUID-C197C9A7-EA05-3F24-9854-542E984C612D.dita#GUID-C197C9A7-EA05-3F24-9854-542E984C612D/GUID-A1B58B92-E9B2-3C0F-89B3-BA3230A1E14F"><apiname>User::Free()</apiname></xref> </p> </li><li id="GUID-356C7BD2-81BC-59EB-A626-E7DD4E1698DC"><p> <xref href="GUID-C197C9A7-EA05-3F24-9854-542E984C612D.dita#GUID-C197C9A7-EA05-3F24-9854-542E984C612D/GUID-076A396B-D9F1-3CB9-8D93-AF2E1D0C9415"><apiname>User::ReAlloc()</apiname></xref> </p> </li><li id="GUID-8C59C1D4-F248-5459-9AB8-B19E5F4316D5"><p> <xref href="GUID-C197C9A7-EA05-3F24-9854-542E984C612D.dita#GUID-C197C9A7-EA05-3F24-9854-542E984C612D/GUID-7804ECCB-D061-3572-A4C4-A629098F0790"><apiname> User::ReAllocL()</apiname></xref> </p> </li><li id="GUID-A9ABCC69-F7AD-589E-AA3A-B797757C7123"><p> <xref href="GUID-C197C9A7-EA05-3F24-9854-542E984C612D.dita#GUID-C197C9A7-EA05-3F24-9854-542E984C612D/GUID-AE5D927B-2CFB-3CE0-9EB7-437C4482241F"><apiname>User::AllocLen()</apiname></xref> </p> </li><li id="GUID-A1D29CE1-8D07-5587-8FBF-F9B8903561D5"><p> <xref href="GUID-C197C9A7-EA05-3F24-9854-542E984C612D.dita#GUID-C197C9A7-EA05-3F24-9854-542E984C612D/GUID-E970D052-A8D6-3430-9E23-EB935DD32335"><apiname> User::AllocSize()</apiname></xref> </p> </li><li id="GUID-D5CDA68B-0172-5A80-99AB-69FFD8985975"><p> <xref href="GUID-C197C9A7-EA05-3F24-9854-542E984C612D.dita#GUID-C197C9A7-EA05-3F24-9854-542E984C612D/GUID-62895F0B-089D-36F8-81C9-718B3D26585A"><apiname>User::Available()</apiname></xref> </p> </li><li id="GUID-21AB331F-A559-5D6A-8C5A-C0B65CEAF76F"><p> <xref href="GUID-C197C9A7-EA05-3F24-9854-542E984C612D.dita#GUID-C197C9A7-EA05-3F24-9854-542E984C612D/GUID-6755A02F-524F-3718-AD87-AE4A3BE20D3A"><apiname> User::CountAllocCells()</apiname></xref> </p> </li><li id="GUID-16A3DA52-1513-525A-84B2-B63C85E73DFB"><p> <xref href="GUID-C197C9A7-EA05-3F24-9854-542E984C612D.dita#GUID-C197C9A7-EA05-3F24-9854-542E984C612D/GUID-B2710076-A191-3F8B-B562-E92AE776549C"><apiname> User::FreeZ()</apiname></xref> </p> </li><li id="GUID-7E64E012-BF78-5618-9B07-112A566E892E"><p> <xref href="GUID-C197C9A7-EA05-3F24-9854-542E984C612D.dita#GUID-C197C9A7-EA05-3F24-9854-542E984C612D/GUID-82CD000F-BE5C-37EF-9B85-FC0A57570702"><apiname>User::Check()</apiname></xref> </p> </li><li id="GUID-7CD596C5-657A-58D4-91DF-9DE72D5B9CE5"><p> <xref href="GUID-C197C9A7-EA05-3F24-9854-542E984C612D.dita#GUID-C197C9A7-EA05-3F24-9854-542E984C612D/GUID-04A2474D-0A77-37A7-8567-BB7BC33C3CBE"><apiname> User::CompressAllHeaps()</apiname></xref> </p> </li></ul> <p>The following functions are compatible assuming that the thread hasnot replaced the heap allocator with a different object: </p> <ul><li id="GUID-7D68B874-0D5B-5432-8F9B-78CAA32B4036"><p> <xref href="GUID-C197C9A7-EA05-3F24-9854-542E984C612D.dita#GUID-C197C9A7-EA05-3F24-9854-542E984C612D/GUID-E6BB60B3-B367-34EF-B843-3D32568275FF"><apiname>User::Adjust()</apiname></xref> </p> </li><li id="GUID-D3324C8B-3FF1-58AA-86AB-C65CAFB7FA76"><p> <xref href="GUID-C197C9A7-EA05-3F24-9854-542E984C612D.dita#GUID-C197C9A7-EA05-3F24-9854-542E984C612D/GUID-4DDE6BB9-F0D8-3A0F-8F70-03728E80E26C"><apiname>User::AdjustL()</apiname></xref> </p> </li><li id="GUID-91DF8623-3DF2-5977-B097-FFC6953B7ACA"><p> <xref href="GUID-C197C9A7-EA05-3F24-9854-542E984C612D.dita#GUID-C197C9A7-EA05-3F24-9854-542E984C612D/GUID-42AC433D-1C9C-3AC6-8640-EB1A7BA876B5"><apiname>User::Heap()</apiname></xref> </p> </li><li id="GUID-D1895B52-9A53-598C-8B64-F97B1956992F"><p> <xref href="GUID-C197C9A7-EA05-3F24-9854-542E984C612D.dita#GUID-C197C9A7-EA05-3F24-9854-542E984C612D/GUID-D157A678-62BB-3BF8-8166-C9E03F258E2A"><apiname> User::SwitchHeap()</apiname></xref> </p> </li><li id="GUID-F1473064-A52E-511A-91AB-2FC51E01B705"><p> <xref href="GUID-B0E661BC-4058-3256-B9C3-5A4FD52F6DE5.dita#GUID-B0E661BC-4058-3256-B9C3-5A4FD52F6DE5/GUID-6FA3E28C-49D8-39CD-BFC7-FEAEADE40BA5"><apiname> RThread::Heap()</apiname></xref> </p> </li><li id="GUID-B45BE2A4-944D-51F3-94FA-BC005C8195DD"><p> <xref href="GUID-B0E661BC-4058-3256-B9C3-5A4FD52F6DE5.dita#GUID-B0E661BC-4058-3256-B9C3-5A4FD52F6DE5/GUID-4A1F473A-A804-3984-AEED-B47ACA79AE49"><apiname> RThread::SetHeap()</apiname></xref> </p> </li></ul> <p>The following functions have been added to support software thatwishes to replace the heap allocator: </p> <ul><li id="GUID-B0E30820-C1F2-5A70-8A04-33EA56ED3602"><p> <xref href="GUID-C197C9A7-EA05-3F24-9854-542E984C612D.dita#GUID-C197C9A7-EA05-3F24-9854-542E984C612D/GUID-25730109-73AF-3F5A-83F5-EE5FB18A5692"><apiname> User::Allocator()</apiname></xref> </p> </li><li id="GUID-3B23EB7D-D4D5-509A-827A-6853EC7578AE"><p> <xref href="GUID-B0E661BC-4058-3256-B9C3-5A4FD52F6DE5.dita#GUID-B0E661BC-4058-3256-B9C3-5A4FD52F6DE5/GUID-518DF5B4-3454-32B8-BC3F-F0D47274EF97"><apiname> RThread::Allocator()</apiname></xref> </p> </li></ul> <p> <codeph>RThread::GetRamSizes()</codeph> is now deprecated – theheap size is always reported as zero, and the stack size should now be extractedusing the new <xref href="GUID-B0E661BC-4058-3256-B9C3-5A4FD52F6DE5.dita#GUID-B0E661BC-4058-3256-B9C3-5A4FD52F6DE5/GUID-699F8282-62EF-3F13-85DC-5C0F7910A43D"><apiname>RThread::StackInfo()</apiname></xref> API. </p> <p>Softwarethat is dependent on the layout of the <xref href="GUID-EFAFDD75-7E59-306A-882D-317F5564979E.dita"><apiname>RHeap</apiname></xref> internal dataor virtual function table may no longer work after this change. Such softwareis likely to be rare or limited to test code. There is no legitimate dependencyon this information except where 3rd party software has derived a class fromRHeap, but this is considered to be very unlikely for anything other thantest purposes. </p> <p>The default allocator object stored for each heap isno longer a <xref href="GUID-EFAFDD75-7E59-306A-882D-317F5564979E.dita"><apiname>RHeap</apiname></xref>, but a <xref href="GUID-9DB4A58C-6FC8-3292-A547-4C161BD188FC.dita"><apiname>RAllocator</apiname></xref>.This means that it is possible that <xref href="GUID-C197C9A7-EA05-3F24-9854-542E984C612D.dita#GUID-C197C9A7-EA05-3F24-9854-542E984C612D/GUID-42AC433D-1C9C-3AC6-8640-EB1A7BA876B5"><apiname>User::Heap()</apiname></xref> does notactually return a reference to a <xref href="GUID-EFAFDD75-7E59-306A-882D-317F5564979E.dita"><apiname>RHeap</apiname></xref> object, possiblyresulting in broken software. However, as the default class used for allocationis still <xref href="GUID-EFAFDD75-7E59-306A-882D-317F5564979E.dita"><apiname>RHeap</apiname></xref>, then there is no additional impact unlessa thread or process explicitly instantiates an alternative allocator class.In the latter case, we would expect that the code using the allocator to alsobe updated to use the alternative class. </p> <p>The allocator is createdby the owning thread when it first runs, which means that software that dependson the heap existing before the thread is resumed will no longer work. Inparticular calling <xref href="GUID-B0E661BC-4058-3256-B9C3-5A4FD52F6DE5.dita#GUID-B0E661BC-4058-3256-B9C3-5A4FD52F6DE5/GUID-6FA3E28C-49D8-39CD-BFC7-FEAEADE40BA5"><apiname>RThread::Heap()</apiname></xref> before the thread runsand creates the heap will return NULL. This was a real pattern found in severalplaces in Symbian OS code to work around the lack of processes in the EKA1emulator, where a ‘command line’ is inserted into the created thread by allocatinga cell on the new thread’s heap. This is not an issue for EKA2 as it supportsprocesses in the emulator and such code should just be removed when adaptingit for the EKA2 emulator. </p> </section></conbody></concept>