Re: Question on kernel startup

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 24-01-08 11:31, sahlot arvind wrote:

I compiled kernel for ARM processor.
I am trying to trace kernel control flow. I am looking at file "arch/arm/kernel/head.S" . Code starting with -------------------
        __INIT
        .type   stext, #function
ENTRY(stext)
        mov     r12, r0
        mov     r0, #PSR_F_BIT | PSR_I_BIT | MODE_SVC   @ make sure svc mode
        msr     cpsr_c, r0                      @ and all irqs disabled
        bl      __lookup_processor_type
-------------------
Question comes up at last line (bl __lookup_processor_type) of this code snippet. If I look into System.map file I find the address of symbol "__lookup_processor_type" as c0008168 and as per my understanding kernel image is loaded in the memory starting after first 1 MB.

On x86 that's the normal/classic arrangement at least yes. Don't know about ARM actually, but that sounds likely.

Here I assume that I am correctly interpreting System.map file. Please
let me know if I am misinterpreting this file. I assume that first column
contains address, second I dont know (please tell) and third symbol.
Right?

Right. It's a generic symbol file, for which "man nm" will provide more detail.

Now since MMU is disabled at this point of time how come we can branch to "__lookup_processor_type" whose address is after 3 GB??? What I mean is - at this stage page tables have not been setup then how can we access a symbol which has been assigned address as c0008168 and lying in some memory region???

Basically -- you get to ignore the symbol file in this case. The symbol file is generated _assuming_ the kernel runs at 3G since that's where it's at in virtual terms after paging has been enabled but it's not being told that for the bit that runs pre-paging such isn't in fact correct.

If you look at the comment preceding that bit, you'll see it say that the code is "mostly" (?) position independent and although I don't know ARM assembly nor have an ARM toolchain installed, I bet that if you look at the actual generated code, you'll see it generating the branch target as a relative target -- that is, as a "jump program_counter +/- offset", where "offset" is the only thing that is encoded in the instruction stream. In that case, it's only the _difference_ "target - program_counter" that is relevant and not any absolute values.

Rene.


--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx
Please read the FAQ at http://kernelnewbies.org/FAQ


[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux