ProgrammingThis forum is for all programming questions.
The question does not have to be directly related to Linux and any language is fair game.
Notices
Welcome to LinuxQuestions.org, a friendly and active Linux Community.
You are currently viewing LQ as a guest. By joining our community you will have the ability to post topics, receive our newsletter, use the advanced search, subscribe to threads and access many other special features. Registration is quick, simple and absolutely free. Join our community today!
Note that registered members see fewer ads, and ContentLink is completely disabled once you log in.
If you have any problems with the registration process or your account login, please contact us. If you need to reset your password, click here.
Having a problem logging in? Please visit this page to clear all LQ-related cookies.
Get a virtual cloud desktop with the Linux distro that you want in less than five minutes with Shells! With over 10 pre-installed distros to choose from, the worry-free installation life is here! Whether you are a digital nomad or just looking for flexibility, Shells can put your Linux machine on the device that you want to use.
Exclusive for LQ members, get up to 45% off per month. Click here for more info.
What do you mean exactly? Did you compile the kernel or develop one on your own? And you must give much more info because I have no idea about what you want to know...
Distribution: M$ Windows / Debian / Ubuntu / DSL / many others
Posts: 2,339
Original Poster
Rep:
ok let me MAKE MY SELF CLEAR
i wrote a kernel from scratch and had a F### of a time getting it to work
i finnaly got it to work but i cannot read anything in the data segment
i think that DS is set wrong but i really ddo not know how to fix it
so could someone with experence please help me?
Unless you are doing something fancy, you should use the flat memory model, so DS should be same as the other segments. EDIT: didn't realize this is a 16-bit kernel.
Does it work if you print data from the stack?
Code:
char str[] = "Hey!";
kernel_print(str);
Last edited by ntubski; 10-01-2009 at 05:15 PM.
Reason: I had assumed 32-bit...
Distribution: M$ Windows / Debian / Ubuntu / DSL / many others
Posts: 2,339
Original Poster
Rep:
Quote:
Originally Posted by ntubski
Unless you are doing something fancy, you should use the flat memory model, so DS should be same as the other segments. Does it work if you print data from the stack?
If your goal is the "tiny" memory model (CS == DS == SS) then you should make sure your tool chain is linking that way and you should have your startup code copy CS to both DS and SS.
Your failure to get DS right, could represent either or both of the above are wrong.
If your goal is some other memory model, make sure you understand what memory model you want and how to get the tool chain to compile/link for that memory model and how to make your startup code initialize for that memory model.
That working indicates that DS == SS. It does not indicate that either DS or SS is correct and it doesn't indicate that you are linking correctly for the desired memory model.
Quote:
Originally Posted by ntubski
you should use the flat memory model
There is not complete agreement on the terminology, but usually "flat" memory model implies the offset size is at least 32 bits. In 16 bit programming, the "flat" memory model is usually called the "tiny" memory model.
So if you want to look up in your tool chain documentation how to get that memory model, you'll have an easier time using the common terminology.
The default memory model in 16 bit tool chains is "small". CS < DS == SS. If you want "small" memory model, you need to figure out how to make your startup code initialize DS and SS with the correct value.
I thought you could get tlink to generate tiny memory model after tcc compiles object files for small memory model. Maybe you can by specifying /t which also makes the output a .com instead of a .exe. Or maybe I'm misremembering and you need a switch to tcc to get tiny memory model instead of small.
Do you understand which you want "tiny" or "small"?
I don't recall the exetobin program. A .com is a flat binary format normally used with tiny memory model, but there is an implied extra 0x100 bytes at the beginning. Does exetobin also have an implied extra 0x100 bytes?
All those details must be coordinated between your loader and startup code and the way you use the tool chain.
Distribution: M$ Windows / Debian / Ubuntu / DSL / many others
Posts: 2,339
Original Poster
Rep:
yes it converts .exe to .com files
because if i tell the linker to do it i get an error (Error: Cannot generate COM file : invalid initial entry point address)
LinuxQuestions.org is looking for people interested in writing
Editorials, Articles, Reviews, and more. If you'd like to contribute
content, let us know.