<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Computer, Electron and Technology &#187; mod</title>
	<atom:link href="http://www.donevii.com/post/tag/mod/feed" rel="self" type="application/rss+xml" />
	<link>http://www.donevii.com</link>
	<description>关注技术、移动互联网以及一切 GEEK &#38; NERD 的事情</description>
	<lastBuildDate>Wed, 21 Dec 2011 10:49:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>How to run mod file that is loaded into HEAP</title>
		<link>http://www.donevii.com/post/820.html</link>
		<comments>http://www.donevii.com/post/820.html#comments</comments>
		<pubDate>Sun, 17 May 2009 07:23:07 +0000</pubDate>
		<dc:creator>gavinkwoe</dc:creator>
				<category><![CDATA[life]]></category>
		<category><![CDATA[brew]]></category>
		<category><![CDATA[heap]]></category>
		<category><![CDATA[mod]]></category>
		<category><![CDATA[modloader]]></category>
		<category><![CDATA[动态加载]]></category>

		<guid isPermaLink="false">http://www.donevii.com/?p=820</guid>
		<description><![CDATA[05-15-2008, 11:20 PM Brewin Registered User Join Date: Mar 2006 Posts: 152 Rep Power: 4 How to run mod file that is loaded in the HEAP&#8230; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;... ]]></description>
			<content:encoded><![CDATA[<p>05-15-2008, 11:20 PM<br />
 Brewin<br />
Registered User   Join Date: Mar 2006<br />
Posts: 152<br />
Rep Power: 4</p>
<p> How to run <a href="http://www.donevii.com/post/tag/mod" class="st_tag internal_tag" rel="tag" title="Posts tagged with mod">mod</a> file that is loaded in the <a href="http://www.donevii.com/post/tag/heap" class="st_tag internal_tag" rel="tag" title="Posts tagged with heap">HEAP</a>&#8230;</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>Hi everyone,<br />
How can I run a MOD file that is loaded into the HEAP???? Any idea&#8217;s&#8230;</p>
<p>__________________<br />
Thanks everyone for the info they share here..<br />
Ramki@TTSL<br />
 VALUE HAS A VALUE ONLY IF ITS VALUE IS VALUED</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
Last edited by Brewin : 05-15-2008 at 11:27 PM. </p>
<p>Brewin<br />
View Public Profile<br />
Send a private message to Brewin<br />
Send email to Brewin<br />
Find all posts by Brewin<br />
Add Brewin to Your Buddy List </p>
<p>  #2   06-04-2008, 07:36 PM<br />
ArdyFalls<br />
Registered User   Join Date: Apr 2007<br />
Posts: 23<br />
Rep Power: 0</p>
<p>Steps for loading a mod into the heap</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>1) malloc memory on the heap that is the size of the mode file + 4 in bytes.<br />
2) Set the initial 4 btyes to point to the AEE struct thing that has all the AEEStdlib funcitons.<br />
3) Set the processors program counter (PC register) to address 0<br />
Please note, I could be kinda off, look at the code for AEE_ModLoad, it is always at address zero. It will tell you the arguments that you need to pass to it before setting the pc register to it. Remember, the first four arguments of any function are passed in registers r0 -r4.</p>
<p>I hope this helps</p>
<p>__________________<br />
Ardavon Falls<br />
Senior Software Engineer<br />
MobiTV Inc</p>
<p>ArdyFalls<br />
View Public Profile<br />
Send a private message to ArdyFalls<br />
Find all posts by ArdyFalls<br />
Add ArdyFalls to Your Buddy List </p>
<p>  #3   07-28-2008, 10:45 PM<br />
 Brewin<br />
Registered User   Join Date: Mar 2006<br />
Posts: 152<br />
Rep Power: 4</p>
<p> Loading and running a compressed mod file&#8230;</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>Hi All,<br />
To run a compressed mod file in <a href="http://www.donevii.com/post/tag/brew" class="st_tag internal_tag" rel="tag" title="Posts tagged with brew">BREW</a> you need to create a mod loader(Approxmately 700+ bytes, atleast mine).</p>
<p>For 2.x brew devices, your mod loader file name should be same as of your app name.<br />
Ex: myapp.mif, myapp.mod(your mod loader), filename.gz(your compressed myapp.mod file, you can name this file as filename.bar so that you don&#8217;t have any problems when user disables your app).</p>
<p>For 3.x brew devices on which we can read a mod file by setting the required permissions in MIF can add this mod loader file content at the start of your compressed mod file or you can use the same as that used for 2.x which don&#8217;t required any permissions or settings in MIF.<br />
Ex: myapp.mif, myapp.mod(your mod loader + filename.gz).</p>
<p>To create a mod loader, you have every information you need in 2 threads.</p>
<p>First read only the first post by user &#8220;ajiva&#8221; in the following thread. Then return to this thread for additional info you need.</p>
<p>Quote:</p>
<p>http://brewforums.qualcomm.com/showthread.php?t=11637</p>
<p>A call to AEEMod_Load that you have seen in the first thread will set the params in the registers.</p>
<p>Quote:<br />
Note 1: Don&#8217;t release the buffer that contains the uncompressed content of your actual mod file in your mod loader. Once the actual app is closed, it will released by BREW system.<br />
Note2: Release all other allocated buffers and interfaces you created in mod loader before making a call to AEEMod_Load.</p>
<p>Thanks for ajiva and Ardy Falls for the valuable info they provided. </p>
<p>__________________<br />
Thanks everyone for the info they share here..<br />
Ramki@TTSL<br />
 VALUE HAS A VALUE ONLY IF ITS VALUE IS VALUED</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
Last edited by Brewin : 08-06-2008 at 12:59 AM. </p>
<p>Brewin<br />
View Public Profile<br />
Send a private message to Brewin<br />
Send email to Brewin<br />
Find all posts by Brewin<br />
Add Brewin to Your Buddy List </p>
<p>  #4   07-29-2008, 12:36 AM<br />
Rajni<br />
Registered User   Join Date: Apr 2005<br />
Posts: 32<br />
Rep Power: 0</p>
<p> Really usefull</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>Hi Ramki,<br />
Really very useful information.</p>
<p>Rajni<br />
View Public Profile<br />
Send a private message to Rajni<br />
Find all posts by Rajni<br />
Add Rajni to Your Buddy List </p>
<p>  #5   08-06-2008, 12:57 AM<br />
 Brewin<br />
Registered User   Join Date: Mar 2006<br />
Posts: 152<br />
Rep Power: 4</p>
<p> Loading and running a compressed extension mod file&#8230;</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>Hi all,<br />
The above procedure is not working in case if the compressed mod file is an extension. Applet compressed mod file is running fine. The decompressed file of the extension mod is Identical with the original extension mod file, but device is getting crashed when AEEMod_Load of the extension mod is executed.</p>
<p>if both an applet and extensions loads the same way then<br />
why is this difference..</p>
<p>If I use normal extension mod everything goes well.</p>
<p>Do anyone has any idea about this. </p>
<p>Quote:<br />
The extension I used is xmlparser, I will write my own extension and check does it make any difference using debug info. </p>
<p>__________________<br />
Thanks everyone for the info they share here..<br />
Ramki@TTSL<br />
 VALUE HAS A VALUE ONLY IF ITS VALUE IS VALUED</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
Last edited by Brewin : 08-06-2008 at 01:02 AM. </p>
<p>Brewin<br />
View Public Profile<br />
Send a private message to Brewin<br />
Send email to Brewin<br />
Find all posts by Brewin<br />
Add Brewin to Your Buddy List </p>
<p>  #6   08-06-2008, 06:15 AM<br />
 Brewin<br />
Registered User   Join Date: Mar 2006<br />
Posts: 152<br />
Rep Power: 4</p>
<p> Loading a compressed module(Application/Extension)</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>I hope I got the resolution,<br />
Quote:<br />
Originally Posted by Brewin<br />
Hi all,<br />
The above procedure is not working in case if the compressed mod file is an extension. Applet compressed mod file is running fine. The decompressed file of the extension mod is Identical with the original extension mod file, but device is getting crashed when AEEMod_Load of the extension mod is executed.</p>
<p>if both an applet and extensions loads the same way then<br />
why is this difference..</p>
<p>If I use normal extension mod everything goes well.</p>
<p>Do anyone has any idea about this. </p>
<p>If the module irrespective of Application or Extension, is complied with standard AEEModGen.C then the MOD compression will work else the behavior is unknown.</p>
<p>Hope this helps, Please correct me if I am wrong.<br />
But since all module will have the same entry point why this happens&#8230; </p>
<p>__________________<br />
Thanks everyone for the info they share here..<br />
Ramki@TTSL<br />
 VALUE HAS A VALUE ONLY IF ITS VALUE IS VALUED</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
Last edited by Brewin : 08-06-2008 at 06:17 AM. </p>
<p>Brewin<br />
View Public Profile<br />
Send a private message to Brewin<br />
Send email to Brewin<br />
Find all posts by Brewin<br />
Add Brewin to Your Buddy List </p>
<p>  #7   08-07-2008, 12:32 PM<br />
TG1e<br />
Registered User   Join Date: May 2008<br />
Posts: 3<br />
Rep Power: 0</p>
<p>Reference code please [if possible]</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>Addressed to all who are working (or have worked) on this topic of loading a mod from heap mem&#8230;<br />
Will it be possible for you to post some reference code?</p>
<p>Also, for clarity&#8230;</p>
<p>Do we only have to call AEEMod_Load?<br />
Or do we have to call the other functions as well&#8230;.How does the AEE come to know that we have loaded the compressed (and now decompressed) mod? How will the AEE send events to this newly loaded mod?</p>
<p>Awaiting your response(s)&#8230;</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
Last edited by TG1e : 08-07-2008 at 12:34 PM. </p>
<p>TG1e<br />
View Public Profile<br />
Send a private message to TG1e<br />
Find all posts by TG1e<br />
Add TG1e to Your Buddy List </p>
<p>  #8   08-23-2008, 06:51 AM<br />
 Brewin<br />
Registered User   Join Date: Mar 2006<br />
Posts: 152<br />
Rep Power: 4</p>
<p> Loading compressed mod file..Step by Step</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>Quote:<br />
Originally Posted by TG1e<br />
Addressed to all who are working (or have worked) on this topic of loading a mod from heap mem&#8230;<br />
Will it be possible for you to post some reference code?</p>
<p>What code you need, first compress you MOD file with gzip(if 7zip is used then you need to supply you own decompressor code in the mod loader or bootloader)<br />
Example: You have an application with myapp.mod, myapp.bar, myapp.mif<br />
After compressing MOD, your files are myapp.zip, myapp.bar,myapp.mif.<br />
Now write a bootloader which will load myapp.zip into memory and uncompress..</p>
<p>1. Create a project with name ex: <a href="http://www.donevii.com/post/tag/modloader" class="st_tag internal_tag" rel="tag" title="Posts tagged with modloader">modloader</a>.</p>
<p>2. copy AEEModGen.C and AEEModGen.H into your project and add the following header files<br />
AEE.h, AEEShell.h, AEEUnzipStream.h, AEEFile.h, AEEHeap.h, AEEStdLib.h.</p>
<p>3. Delete everything not related to AEEMod_Load and AEEStaticMod_New in both files and add the below line</p>
<p>Quote:<br />
For AEEMod_Load typecast&#8230;..<br />
typedef int (*RunLoadMod)(IShell *ps, void * ph, IModule ** pMod);</p>
<p>2. Delete every thing inside the AEEStaticMod_New function.</p>
<p>3. Now inside the AEEStaticMod_New function declare pointers to IUnzipAStream, IFileMgr and IFile interfaces.</p>
<p>4. Create an Instance of IFileMgr and IUnzipStream(if compressed with gzip). else<br />
provide your own decompress function here.</p>
<p>5.Now allocate some memory and copy the &#8220;ph&#8221; variable which is the pointer to AEEHelper Functions into the first four bytes of allocated memory.</p>
<p>6. Open myapp.zip and Set it for uncompressing using<br />
&#8221; IUNZIPASTREAM_SetStream &#8220;.</p>
<p>7. Now read the uncompressed stream using &#8221; IUNZIPASTREAM_Read &#8221; and copy the contents from 5th byte onwards into the same buffer using MEMCPY, REALLOC as per requirements.<br />
( Now your buffer contains pointer to AEEHelper functions + uncompressed myapp.zip, now buffer size will be a minimum of 4+sizeof(myapp.mod) ).</p>
<p>8. Once your buffer is ready with the above you are done. Release the IFileMgr, Ifile and IUnzipStream interface pointers.</p>
<p>9. Now type cast the 5th byte of the buffer to AEEMod_Load with a return statement like</p>
<p>Quote:<br />
return (RunLoadMod)(buffer+4)(pIShell,ph,ppMod);<br />
to execute the actual mod file&#8230;.  </p>
<p>Note: Don&#8217;t release the buffer, once the app exits this memory will be released by AEE.</p>
<p>You modloader is ready now.<br />
Compile and create the mod file and rename the mod file as myapp.mod.</p>
<p>Now you app contains, myapp.mif, myapp.mod, myapp.zip, myapp.bar.</p>
<p>Quote:<br />
Also, for clarity&#8230;<br />
Do we only have to call AEEMod_Load?<br />
Or do we have to call the other functions as well&#8230;.How does the AEE come to know that we have loaded the compressed (and now decompressed) mod? How will the AEE send events to this newly loaded mod?</p>
<p>When you click on your app, AEE loads the mod file associated with the app name in this case it is myapp.mod(mod loader) and executes the first address i.e AEEMod_load which will feed the actual mod to the AEE, it&#8217;s not the AEE that load your actual MOD file.</p>
<p>There is no applet related to modloader, when AEE encounter the last statement in the AEEStaticMod_New of the modloader AEE just jumps to the address where we have kept the actual MOD file and exectues from there in the process whatever is created and registered(IModuleVtbl, Applet, Applet_HandleEvent) are all belongs to the actual application mod file and AEE will send events to the registered handleEvent of the top visible applet which is nothing but your application handle Event. </p>
<p>__________________<br />
Thanks everyone for the info they share here..<br />
Ramki@TTSL<br />
 VALUE HAS A VALUE ONLY IF ITS VALUE IS VALUED</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
Last edited by Brewin : 08-23-2008 at 06:59 AM. </p>
<p>Brewin<br />
View Public Profile<br />
Send a private message to Brewin<br />
Send email to Brewin<br />
Find all posts by Brewin<br />
Add Brewin to Your Buddy List </p>
<p>  #9   01-13-2009, 07:55 AM<br />
ed_est<br />
Registered User   Join Date: Jan 2009<br />
Posts: 3<br />
Rep Power: 0</p>
<p>Hi Brewin,<br />
I am interested in the functionality that you have described in this topic and I have tried to create a modloader by myself according the steps you have provided, but unfortunately my device just reboots when I am trying to execute the loaded into memory .mod file. I have tried my code on different devices with different BREW version and on all of them I had device reboot.<br />
Here is my code in AEEStaticMod_New function ( I have simplified it because I don&#8217;t use compression for .MOD file, also I have removed all checks):</p>
<p>ISHELL_CreateInstance(pIShell, AEECLSID_FILEMGR, (void**) &#038;piFileMgr);<br />
piFile = IFILEMGR_OpenFile(piFileMgr, &#8220;realmod.bin&#8221;, _OFM_READ);<br />
IFILE_GetInfo(piFile, &#038;iFileInfo);<br />
filesize = iFileInfo.dwSize;<br />
pBuf = (byte*) MALLOC (filesize + 4);<br />
MEMCPY(pBuf, ph, 4);<br />
pBuf2 = pBuf + 4;<br />
pFunc = (RunLoadMod)pBuf2;<br />
bytesread = IFILE_Read(piFile, pBuf2, filesize);<br />
IFILE_Release(piFile);<br />
IFILEMGR_Release(piFileMgr);<br />
return pFunc(pIShell,ph,ppMod);</p>
<p>Can you help me to understand why I can&#8217;t start .MOD file I have loaded by modloader? I am doing all needed steps that you provided in your post and everything seems correct for me, but maybe you will find that I am doing something wrong.</p>
<p>Thanks in advance.</p>
<p>ed_est<br />
View Public Profile<br />
Send a private message to ed_est<br />
Send email to ed_est<br />
Find all posts by ed_est<br />
Add ed_est to Your Buddy List </p>
<p>  #10   01-13-2009, 08:44 PM<br />
 Brewin<br />
Registered User   Join Date: Mar 2006<br />
Posts: 152<br />
Rep Power: 4</p>
<p>Helper functions Entry point problem&#8230;..</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>Quote:<br />
Originally Posted by ed_est<br />
MEMCPY(pBuf, ph, 4); *********<br />
pBuf2 = pBuf + 4;<br />
((RunLoadMod)pBuf2)(pIShell,ph,ppMod); </p>
<p>You problem is here. It not properly copying the ph pointer(Helper functions Entry point).<br />
MEMCPY(pBuf, ph, 4);</p>
<p>__________________<br />
Thanks everyone for the info they share here..<br />
Ramki@TTSL<br />
 VALUE HAS A VALUE ONLY IF ITS VALUE IS VALUED</p>
<p>Brewin<br />
View Public Profile<br />
Send a private message to Brewin<br />
Send email to Brewin<br />
Find all posts by Brewin<br />
Add Brewin to Your Buddy List </p>
<p>  #11   01-14-2009, 06:17 AM<br />
ed_est<br />
Registered User   Join Date: Jan 2009<br />
Posts: 3<br />
Rep Power: 0</p>
<p>Brewin,<br />
Thank you very match for your help.<br />
I have fixed the this part of code and now it works.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.donevii.com/post/820.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>在BREW程序中调用另一个mod的分析</title>
		<link>http://www.donevii.com/post/817.html</link>
		<comments>http://www.donevii.com/post/817.html#comments</comments>
		<pubDate>Sun, 17 May 2009 07:10:27 +0000</pubDate>
		<dc:creator>gavinkwoe</dc:creator>
				<category><![CDATA[brew]]></category>
		<category><![CDATA[c/c++/c#]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[mtk]]></category>
		<category><![CDATA[mod]]></category>
		<category><![CDATA[动态加载]]></category>

		<guid isPermaLink="false">http://www.donevii.com/?p=817</guid>
		<description><![CDATA[近日读到这样一段程序。可以在程序运行时调用另一个mod文件并执行。这样可以做到应用自升级，压缩程序文件等实用的功能。    要想理解这点，先看一下正常的BREW程序加载过程。  BREW程序... ]]></description>
			<content:encoded><![CDATA[<p>近日读到这样一段程序。可以在程序运行时调用另一个mod文件并执行。这样可以做到应用自升级，压缩程序文件等实用的功能。</p>
<p> </p>
<p> 要想理解这点，先看一下正常的BREW程序加载过程。</p>
<p> BREW程序的入口，即相当于c程序的main，是位于AEEModGen.c中的AEEMod_Load函数。这可以从mak文件的连接选项中看出来。</p>
<p> </p>
<p>LINK_ORDER = -first AEEMod_Load</p>
<p> </p>
<p> 这个选项使得链接程序将该函数放在程序文件的0地址处。函数的定义如下：</p>
<p> </p>
<p>int AEEMod_Load(IShell *pIShell, void *ph, IModule **ppMod)</p>
<p>{</p>
<p>  <span> </span>// Invoke helper function to do the actual loading.</p>
<p>   return AEEStaticMod_New(sizeof(AEEMod),pIShell,ph,ppMod,NULL,NULL);</p>
<p>}</p>
<p>  </p>
<p>  BREW底层调用这个函数，需要提供三个参数。pIShell是ISHELL接口的指针，有了它就可以创建和访问其它接口。ph是helper function类函数的函数列表指针，有了它就可以调用MALLOC等函数。ppMod是用于返回给BREW底层的地址，存储生成的module的信息。</p>
<p>  AEEMod_Load函数调用了AEEStaticMod_New函数。在这个函数中初始化了module数据结构，ppMod就是指向它的。函数结束后返回BREW底层。</p>
<p>  BREW底层稍后通过存储在module数据结构中的函数指针，调用同样位于AEEModGen.c中的AEEMod_CreateInstance函数，生成该Module的某一个Applet实例。在这个函数中会调用到我们所编写的AEEClsCreateInstance函数。在我们这个函数中注册了HandleEvent函数和FreeAppDate函数。这些信息同样通过一个applet数据结构指针返回给BREW底层。这之后，BREW会通过给HandleEvent发各种Event，来驱动程序运行。</p>
<p> </p>
<p>  通过这整个过程，可以总结出BREW程序运行的必要条件。</p>
<p>  程序必须得到IShell指针，Helper Function指针，这样程序中对BREW底层各种函数的调用才能进行。BREW底层必须知道两个地址，通过它们，可以将Event传递给程序，调用FreeAppDate函数。</p>
<p>  因此，想在程序中调用另外一个mod,只需要想办法把程序里的IShell指针，Helper Function指针传递给mod，同时得到mod中的HandleEvent函数，FreeAppDate函数的地址就可以了。</p>
<p>  剩下的问题就是,程序怎样和mod文件交互呢，mod文件的格式是怎样的？</p>
<p> </p>
<p>  生成mod的mak文件最后一般有这样两句话，</p>
<p> </p>
<p>ld *.o a.elf</p>
<p>fromelf &#8211;bin a.elf a.<a href="http://www.donevii.com/post/tag/mod" class="st_tag internal_tag" rel="tag" title="Posts tagged with mod">mod</a></p>
<p> </p>
<p>  arm链接器ld生成ELF格式，之后用格式转换工具fromelf将ELF文件转换成mod文件。</p>
<p>  ELF文件是带格式的可执行文件，对它的执行要靠操作系统的解析来进行。而通过&#8211;bin选项生成的mod文件，格式却是plain binary,即赤裸裸的二进制机器指令，其实是无格式的。只要将mod文件载入内存，跳转到它的0地址处，就可以一条条指令的执行下来。和mod文件交互，也就是要安排好mod文件0地址处的内容，知道mod文件的调用者会传入什么东西，mod文件会返回什么东西。</p>
<p> </p>
<p>  </p>
<p>  下面来看一种实际的调用方法吧。代码如下：</p>
<p> </p>
<p>typedef int (*RunLoadMod)(IShell *pIShell, void *ph, IModule **ppMod);</p>
<p> </p>
<p>pData = MyLoadZip(pIShell);</p>
<p>if( !pData )</p>
<p>return EFAILED;</p>
<p>DBGPRINTF(&#8220;to RunLoadMod&#8221;);</p>
<p>if( SUCCESS != ((RunLoadMod)pData)(pIShell,ph,&amp;pOrgMod) )</p>
<p>{</p>
<p>DBGPRINTF(&#8220;RunLoadMod_Err&#8221;);</p>
<p>goto Crt_Err;</p>
<p>}</p>
<p>  </p>
<p>  这段程序将mod文件读入内存，放在pData缓冲区内，用((RunLoadMod)pData)(pIShell,ph,&amp;pOrgMod)一句执行之。RunLoadMod只不过是用typedef定义的一种函数指针类型。这句话的意思相当于是为待调用的mod文件准备好pIShell,ph,pOrgMod三个数据后，直接跳到内存中的mod文件的第一个字节处，将它当做普通机器指令一样执行。这种方法调用的mod文件，应是一个用完整的BREW框架编译后生成的。0地址处放下的是AEEMod_Load函数。Mod文件直接将Applet信息传递给BREW底层，注册HandleEvent函数。实际上是Mod文件取代了调用者的位置。</p>
<p>  </p>
<p>  但是这段程序很可能会运行失败。因为BREW底层除了传参外，还做了其它事情。这在AEEStdlib.h中可以看出。</p>
<p> </p>
<p>#define GET_HELPER()      (*(((AEEHelperFuncs **)AEEMod_Load) &#8211; 1))</p>
<p>#define GET_HELPER_VER()  (*((uint32 *)(((byte *)AEEMod_Load) &#8211; sizeof(AEEHelperFuncs *) &#8211; sizeof(uint32))))</p>
<p> </p>
<p>  这两个宏定义可以看成是两个全局常量。第一个是BREW Helper Function的函数指针表，第二个是函数指针表的版本号。上面提到的通过参数传递Helper Function函数指针，是只在模拟器上成立的。手机上其实是通过全局常量形式传递的。为保证mod可以正常运行，也应在缓冲区前保存这两个常量。</p>
<p> </p>
<p>  这种“冒名顶替”的方式，对于只想压缩一下mod的应用来说是完全可以的。但有时，我们希望新调用的mod只是整个应用的一小部分，调用者继续存在。这就需要调用者充当BREW底层的一部分角色，记住mod返回的各种信息，在适当的时候调用mod中的相应函数。新调用的mod如果想要取得主mod的信息，类似于上面提到的HelperFuncs全局常量指针的方法是个可行的选择。</p>
<p> </p>
<p>  其实知道了BREW程序的加载过程，就可以比较灵活的达到调用mod的目的，甚至BREW程序架构都是可以改动的。但是改动之后，如何在模拟器上进行调试就又成了一个问题。</p>
<p> </p>
<p>  程序中调用mod的技巧，在国外几年前就已得到了应用。甚至有家公司专门开发了利用这个技巧压缩mod的工具。</p>
<p> </p>
<p>http://www.s-cradle.com/english/products/sophiacompress_<a href="http://www.donevii.com/post/tag/brew" class="st_tag internal_tag" rel="tag" title="Posts tagged with brew">brew</a>/index.html</p>
<p> </p>
<p>参考文章：</p>
<p> </p>
<p>1.How to build A mod to load B mod?<span> </span></p>
<p> </p>
<p>http://brewforums.qualcomm.com/showthread.php?t=11637</p>
<p> </p>
<p>2.How to run mod file that is loaded in the <a href="http://www.donevii.com/post/tag/heap" class="st_tag internal_tag" rel="tag" title="Posts tagged with heap">HEAP</a>&#8230;</p>
<p> </p>
<p>http://brewforums.qualcomm.com/showthread.php?t=18413&#038;highlight=<a href="http://www.donevii.com/post/tag/modloader" class="st_tag internal_tag" rel="tag" title="Posts tagged with modloader">modloader</a></p>
<p> </p>
<p>3.深入BREW模块加载机制</p>
<p> </p>
<p>http://nicefuture.ycool.com/post.722858.html</p>
<p> </p>
<p>4.深度剖析BREW实现原理收藏</p>
<p> </p>
<p>http://blog.csdn.net/Gemsea/archive/2006/09/07/1190206.aspx</p>
]]></content:encoded>
			<wfw:commentRss>http://www.donevii.com/post/817.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

