13
votes

I'm wanting to read and understand the Linux kernel's Memory Management (in particular defrag\compaction\migration).

So, I turn off optimization for size in .config (using make menuconfig of course) and compile...This leaves me with still an optimized kernel.

NOTE: When I say optimized kernel, I mean that when I use gdb and tell it next that it'll jump around. I don't want that, I want to be able to follow the code line by line just as I would with a simple hello world.

Next, I edit the Makefile and swap -O2 with -O0 and that causes things to break.

I found this, but I don't know what files I'll want because I don't know how far down the rabbit hole goes.

Is there a more generic option that I can use? I understand the concepts of memory compaction; however, I want to see where everything happens and how it exactly happens.

1
How are you gdbing the kernel? Do you have kgdb support turned on?Eugene Sh.
@EugeneSh. I'm going through qemu -s in DEBUG_KERNEL is enabled. I'll enable kgdb and report the results.SailorCire
@EugeneSh. Although I couldn't get a pipe working with qemu (gdb threw fits), there doesn't seem to be a difference.SailorCire
While going through the question above, I'm suddenly curious, why Linux kernel has to be optimized for working properly?jaeyong

1 Answers

13
votes

You can't de-optimize the kernel. You might be able to de-optimize certain functions, like this:

void __attribute__((optimize("O0"))) foo(unsigned char data) {
    // unmodifiable compiler code
}

But the kernel as a whole requires -O2 because the code itself is written with assumptions that certain functions will be optimized in a certain way.

Sorry, but you really will need to know the size of the rabbit hole you want to go down.