Look at the implementation of the IP2K compiler and linker.
It uses a segmented paged architecture just like the machine you are
describing.
In essence what we did was implement linker relaxation to deal with
this.
When we called any function, we emitted the appropriate long-call by
setting
the page register and jumping to the location on that page.
In the linker, we implemented relaxation code that looked to see if
we were changing to the SAME page, and if so deleted the instruction
changing
the PAGE and did a local jump to the destination. Now, because a
function could cross a page
boundary (we only had 4kb pages (and 16 bit instructions), all our
branches were done this way
(if I recall correctly).
It's a little tedious, but not too technically demanding a solution....
Al Lehotsky
On Nov 30, 2008, at 2:06 PM, Dong Phuong wrote:
I'm porting for a microcontroler which has segmented
memory.
THe memory is devided into many pages, each page is
16K. And I'm going to use 256 pages for code. But
these 256 pages are not continuous in physical memory,
so when I want to jump to a function, I have to know
what is the segment address of this function, and then
set the CSP with this value, and jump to it.
So what I want to know is if I'm in a function, is
there any way for me to know what code segments I'm
locating in ? If I know this, when I have to jump to
another function, I can decide wheather this function
is in the same segment with the function that I'm
locating in, and then can decide if I have to change
the CSP.
And when I compile a long long program with so many
methods, is there any way for GCC so that it can
realize that the code has exceeded 16K and have to use
a new segments ? or the user must explicit declare
this in the C source program ?
If you know any hints or any doccument about this,
please show me. THank you very much.