[prev in list] [next in list] [prev in thread] [next in thread] 

List:       linux-rt
Subject:    Re: [rtl] Linux BootPrompt Question + side question
From:       Laurent.Kersten () alcatel ! be
Date:       2000-11-28 9:02:08
[Download RAW message or body]




Hello,

I've used a similar technique, for sharing memory (256 Mb computer but the amount of \
mem doesn't matter here) , rtai_shm is not appropriate here because I must have big \
(8 Mb) block of contiguous physical memory to share with others device via a VME /PCI \
bridge

I changed my lilo.conf file with :

append="248M"

then, run lilo again (obvious but I forgot to do it once .... ).

And, .... I got a segmentation fault when I try to insert my module that want s to \
access my shared memory.

I then did a dmesg in order to check what happened. It  turned out that the faulty \
instruction (assembly level), was a  move to the first address of shared memory, the \
kernel indicated that it  cannot handle a  page fault at the address of my first word \
of shared memory.

After that I tried to inspect the GDT (a quick hack in inline assembly with a simple \
SGDT statement. Note that you can do it  even in user mode ) , and segment register \
(dumped in log file when the segmentation fault occured, Data one DS/ES  (code didn't \
seem to be involved)).

 This leads me to discover that  :

- The segment  descriptors pointed to the GDT (I really expected it ;-)).
 -The pointed GDT entry was a full flat segment with base 0 and limit  set to FFFFF ( \
it was the third  (segment register value were 0x18 which means third entry in the \
GDT with  requested priviledge level). one in the GDT, but honnestly I don't know the \
exact structure of the GDT for linux )

So,  I decided to try  to inspect the page table with a simple gdb session as root :

gdb /usr/src/linux/vmlinux /proc/kcore

And then I ask to see memory, at the  CR3 value (0x0xxxxxx) that was indicated by the \
kernel panic  (normally at that time the CR3 register should contains the physical \
address  of the page table register). But unfortunately, the debugger can't access \
this address (or more precisely the equivalent virtual address).

After that, I remembered that the kernel address space was made of large pages, and \
that my  address (248 Mb after 0) was just on a 4Mb aligned address and that would \
logically generate a page fault (Am I right here ?) ... So I decided to change my \
lilo.conf to

append="mem=245M"

And then, I could access my memory till (248Mb-1 byte). So I came to the conclusion \
that maybe there is something wrong with the page table setting. But if I change \
that, how can I prevent the regular linux kernel to use that memory for it's own use \
?

So my questions is:

 How can I actually use more than 4Mb ofcontiguous  memory ?


Configuration:

- VME PC PentiumII Mobile 400Mhz  with 256Mb (VMIC 7695).
- Suse Linux 7.0 Professionnal (Kernel 2.2.16) with RTAI 1.5 on top of it.


My module do the following in order to access the shared memory:

- I setup a base pointer, to the value of the high_memory variable (= virtual address \
of the TOP of the "declared"  RAM, BTW  if somebody could explain me the difference \
                between high_memory and memory_end, that would be interresting ...).
-  I initialize the VME Bridge
- Then do a simple write access to memory.

The "funny" part of it is that I could access the whole memory over the VME bus ....

Laurent Kersten
ABSp.






"Estabridis, Janet P" <EstabridisJP@navair.navy.mil> on 11/27/2000 07:10:45 PM
                                                              
                                                              
                                                              
 To:      "'RT Linux Group'" <rtl@rtlinux.org>                
                                                              
 cc:      (bcc: Laurent KERSTEN/BE/ALCATEL)                   
                                                              
                                                              
                                                              
 Subject: [rtl] Linux BootPrompt Question                     
                                                              





Hi,

I want use the old type of shared memory on my embedded system running the
miniRTL (kernel 2.2.14 rtlv2.3).  I have 128MBytes of memory and I have
added the statement:

append="mem=125M"

to the linux.cfg file on the disk.



Here is my linux.cfg file:

.\zimage
append="mem=125M"
append=load_ramdisk=1
initrd=root.rtl
initrd_archive=minix
ramdisk_size=50000
root=/dev/ram0
boot=/dev/hda1,msdos
RTL=etc,sshd,log,local,modules,thttpd
RTLPATH=/linux/



The problem is that I do not see the memory getting set aside when I do a
more on /proc/meminfo.   Consequently, I get a Segmentation Fault when I
insert the module and there are any statements that try and access any
shared memory variables.

Can I not use this type of shared memory anymore ?

I'm I doing something stupid and I need enlightenment?

Thanks in advance --

Janet Estabridis
Electrical Engineer
NAWC Code 472E40D
Building 31440 Room 1017
China Lake, CA 93555
estabridisjp@navair.navy.mil
(760) 939-2896  FAX (760) 939 -3075

-- [rtl] ---
To unsubscribe:
echo "unsubscribe rtl" | mail majordomo@rtlinux.org OR
echo "unsubscribe rtl <Your_email>" | mail majordomo@rtlinux.org
---
For more information on Real-Time Linux see:
http://www.rtlinux.org/rtlinux/




-- [rtl] ---
To unsubscribe:
echo "unsubscribe rtl" | mail majordomo@rtlinux.org OR
echo "unsubscribe rtl <Your_email>" | mail majordomo@rtlinux.org
---
For more information on Real-Time Linux see:
http://www.rtlinux.org/rtlinux/


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic