Skip to contentSkip to conversation

A hole in kernel space!

DISCUSSION Pannaga Bhushan 6 participants 7 messages Nov 6, 2002

lore
Share & tools
lore
#0 lore raw

Hi all,
I am looking for a setup where I need to have a certain amount
of data always available to the kernel. The size of data I am looking at is abt
40MB(preferably, but I will settle for 20MB too) . So the normal kmalloc will not help me. So what I did was, I created a hole in kernel space by putting
the following line in vmlinux.lds

    ALIGN(4096);
 __hole_start = .;
    . = . + 0xmy_size;

__hole_end = .;

First, I put these lines in code segment and found that 'my_size' cannot go beyond 0x500000(5MB) . Any larger value , the kernel image refuses to
boot up. I found the same problem with these lines being in data segment or in the bss segment.

But putting these line after

_end = .;

line in vmlinux.lds, I am able to give 0x1700000(17MB) to my_size and still boot with that kernel image.

My questions are :

1. Is there any other way I can get to keep 40MB(or even 20MB) of
contiguous kernel memory space ?

2. Abt the 17MB hole, I am able to use after the _end = .;
.... is this 17MB really there in kernel image?('cos it isn't in any
segment and also it
appears after _end).
if yes, are the pages corresponding to this region swappable or
is it that since this hole appears in kernel image, it is locked to a physical space
and this is never swapped. (basically, i want by data in kernel space always available to kernel without having to bother abt swapping the pages back)

Thanx in advance,
Pannaga Bhushan

#1 lore raw

Hi Pannaga!

Use the mem= parameter on the kernel command-line to specify less memory than what is available. Then you can use the last unused chunk of memory, e.g. if you have 256M memory and you want to "steal" a 40M chunk at the end:

mem=216M

Quoted 51 lines

Hi all,
I am looking for a setup where I need to have a certain amount
of data always available to the kernel. The size of data I am looking at is abt
40MB(preferably, but I will settle for 20MB too) . So the normal kmalloc will not help me. So what I did was, I created a hole in kernel space by putting
the following line in vmlinux.lds

    ALIGN(4096);
 __hole_start = .;
    . = . + 0xmy_size;

__hole_end = .;

First, I put these lines in code segment and found that 'my_size' cannot go beyond 0x500000(5MB) . Any larger value , the kernel image refuses to
boot up. I found the same problem with these lines being in data segment or in the bss segment.

But putting these line after

_end = .;

line in vmlinux.lds, I am able to give 0x1700000(17MB) to my_size and still boot with that kernel image.

My questions are :

1. Is there any other way I can get to keep 40MB(or even 20MB) of
contiguous kernel memory space ?

2. Abt the 17MB hole, I am able to use after the _end = .;
.... is this 17MB really there in kernel image?('cos it isn't in any
segment and also it
appears after _end).
if yes, are the pages corresponding to this region swappable or
is it that since this hole appears in kernel image, it is locked to a physical space
and this is never swapped. (basically, i want by data in kernel space always available to kernel without having to bother abt swapping the pages back)

Thanx in advance,
Pannaga Bhushan

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

Signature · 15 lines
Regards
 Abraham

UNIX enhancements aren't.

__________________________________________________________
 Abraham vd Merwe - 2d3D, Inc.

 Device Driver Development, Outsourcing, Embedded Systems

  Cell: +27 82 565 4451         Snailmail:
   Tel: +27 21 761 7549            Block C, Aintree Park
   Fax: +27 21 761 7648            Doncaster Road
 Email: [email protected]         Kenilworth, 7700
  Http: http://www.2d3d.com        South Africa
#2 lore raw
In reply to Pannaga Bhushan
Quoted 5 lines · Pannaga Bhushan

Hi all,
I am looking for a setup where I need to have a certain amount
of data always available to the kernel. The size of data I am looking at is abt 40MB(preferably, but I will settle for 20MB too) . So the normal kmalloc will not help me.

Will vmalloc() help ? The allocated memory is in special vmalloc address space (which is limited!) within the kernel, but accesses to it go via page-mapping tables, thus while it is virtually contiguous, physically it might be well scattered.

What properties do you need, to be exact ?

You are writing some sort of a device driver for a device that has somewhat stupid direct-memory-access facilities ?

Quoted 5 lines

if yes, are the pages corresponding to this region swappable or is it that since this hole appears in kernel image, it is locked to a physical space and this is never swapped. (basically, i want by data in kernel space always available to kernel without having to bother abt swapping the pages back)

Both kmalloc() and vmalloc() allocate kernel space memory that is unswappable, and therefore can not be allocated in excessive amounts.

Doing things in BIGMEM fashion will let you have gigabytes of in-core memory, but to access it, you must go thru the hoops (in i686 architecture) each time you access a page of it.

Quoted 2 lines

Thanx in advance,
Pannaga Bhushan

/Matti Aarnio

#3 lore raw
In reply to Pannaga Bhushan

Quoth Pannaga Bhushan:

Quoted 5 lines

Hi all,
I am looking for a setup where I need to have a certain amount
of data always available to the kernel. The size of data I am looking at is abt
40MB(preferably, but I will settle for 20MB too) . So the normal kmalloc

I wrote a driver which steals a certain amount of memory from the kernel and makes it available to userspace (somewhat like the rd driver). If you want - I can send it to you.

It exports a small device hierarchy which can be read, written and mmap'ed. The memory is contiguous. Not VERY elegant, but works quite well.

The driver steals a certain amount of memory from the kernel at boot time, a-la the mem= parameter. I have used "holes" of up to 1GB in size.

Marc

Signature · 3 lines
---MAV
                        Linguists do it cunningly
Marc A. Volovic                                             [email protected]
#4 lore raw
Quoted 16 lines · Marc A. Volovic

Quoth Pannaga Bhushan:

Quoted 5 lines

Hi all,
I am looking for a setup where I need to have a certain amount
of data always available to the kernel. The size of data I am looking at is abt
40MB(preferably, but I will settle for 20MB too) . So the normal kmalloc

I wrote a driver which steals a certain amount of memory from the kernel and makes it available to userspace (somewhat like the rd driver). If you want - I can send it to you.

It exports a small device hierarchy which can be read, written and mmap'ed. The memory is contiguous. Not VERY elegant, but works quite well.

Quoted 5 lines

The driver steals a certain amount of memory from the kernel at boot time, a-la the mem= parameter. I have used "holes" of up to 1GB in size.

Marc

You know, I hope, that you can kmalloc(GFP_KERNEL) something in init_module() and it will always be resident in the kernel until you kfree() it in cleanup_module(). You do not have to allocate/deallocate every time your module does something.

If you need a physical location, mmap() and ioremap() take care of that. With these capabilities, I don't think you need "holes" even if you are trying to map-out bad RAM. I think you need to re-think your requirements.

Cheers,
Dick Johnson
Penguin : Linux version 2.4.18 on an i686 machine (797.90 BogoMips).
Bush : The Fourth Reich of America

#5 lore raw

Quoth Richard B. Johnson:

Quoted 4 lines

You know, I hope, that you can kmalloc(GFP_KERNEL) something in init_module() and it will always be resident in the kernel until you kfree() it in cleanup_module(). You do not have to allocate/deallocate every time your module does something.

I do not alloc/dealloc every time ;-). I allocate at boot and do not bother deallocating at all. The module just uses that allocated memory and maps it into the filesystem namespace.

Quoted 1 line

Bush : The Fourth Reich of America

Errr, not that I care, but as far as I know, America had not yet had even its first Reich. ;-)... Germany had three, so a forth Reich might have been there...

Signature · 3 lines
---MAV
                        Linguists do it cunningly
Marc A. Volovic                                             [email protected]
#6 lore raw
Quoted 5 lines · Marc A. Volovic

I do not alloc/dealloc every time ;-). I allocate at boot and do not bother deallocating at all. The module just uses that allocated memory and maps it into the filesystem namespace.
...

Read pages 221-223 in

Alessandro Rubini and Jonathan Corbet. Linux device drivers. O'Reilly, second edition, 2001. Online version:
http://www.xml.com/ldd/chapter/book/index.html

cu
Adrian

Signature · 4 lines
       "Is there not promise of rain?" Ling Tan asked suddenly out
        of the darkness. There had been need of rain for many days.
       "Only a promise," Lao Er said.
                                       Pearl S. Buck - Dragon Seed