Hi All, This is to understand the Virtual address space.Basically who generates the virtual addresses CPU or GNU compiler? Thanks Madhu
Hello Madhu, On Wed, Sep 28, 2016 at 10:36 AM, Madhu K <madhu.sk89@gmail.com> wrote:
Hi All,
This is to understand the Virtual address space.Basically who generates the virtual addresses CPU or GNU compiler?
I didn't really get your question. Linux kernel starts at a fixed location in virtual space. This is called PAGE_OFFSET. On a kernel split of 3GB/1GB, 32 system, its is 0xC000_0000. You can have a look at system.map file after compiling your kernel. When cpu runs with MMU on, your cpu generates virtual address. Regards, Arun
Thanks Madhu
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
Hi Arun, Thanks for your response. I will elaborate my question.Assume I have test.c file, I compiled test.c and generated the a.out ( Executable for linux ), when I do objdump of a.out, we can see addresses( virtual address ) associated with each instruction, these instructions are generated by whom? Thanks On Wed, Sep 28, 2016 at 11:35 AM, Arun Sudhilal <getarunks@gmail.com> wrote:
Hello Madhu,
On Wed, Sep 28, 2016 at 10:36 AM, Madhu K <madhu.sk89@gmail.com> wrote:
Hi All,
This is to understand the Virtual address space.Basically who generates the virtual addresses CPU or GNU compiler?
I didn't really get your question.
Linux kernel starts at a fixed location in virtual space. This is called PAGE_OFFSET. On a kernel split of 3GB/1GB, 32 system, its is 0xC000_0000. You can have a look at system.map file after compiling your kernel. When cpu runs with MMU on, your cpu generates virtual address.
Regards, Arun
Thanks Madhu
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
The virtual addresses what you see in the output of objdump is given/associated by Linker to every instruction and data symbol in the data/bss section except for symbols in the stack section. It is wrong to use generated in the context of Linker. When you initiate *$./a.out* for execution, the kernel will take your start address from the ELF header of *a.out* and place it on the PC (program counter) or IP (instruction pointer) of the CPU, thereafter CPU will start incrementing or generating virtual address for every subsequent instructions. Regards, Prabhu On Wed, Sep 28, 2016 at 3:41 PM, Madhu K <madhu.sk89@gmail.com> wrote:
Hi Arun,
Thanks for your response.
I will elaborate my question.Assume I have test.c file, I compiled test.c and generated the a.out ( Executable for linux ), when I do objdump of a.out, we can see addresses( virtual address ) associated with each instruction, these instructions are generated by whom?
Thanks
On Wed, Sep 28, 2016 at 11:35 AM, Arun Sudhilal <getarunks@gmail.com> wrote:
Hello Madhu,
On Wed, Sep 28, 2016 at 10:36 AM, Madhu K <madhu.sk89@gmail.com> wrote:
Hi All,
This is to understand the Virtual address space.Basically who generates the virtual addresses CPU or GNU compiler?
I didn't really get your question.
Linux kernel starts at a fixed location in virtual space. This is called PAGE_OFFSET. On a kernel split of 3GB/1GB, 32 system, its is 0xC000_0000. You can have a look at system.map file after compiling your kernel. When cpu runs with MMU on, your cpu generates virtual address.
Regards, Arun
Thanks Madhu
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
-- Regards, Prabhunath G Linux Trainer Bangalore
Virtual addresses will be used only in case MMU is enabled, otherwise for a processor an address is something it can put on the bus, irrespective of physical or virtual. So when your PC increments virtual address for a MMU enabled system, they will get translated to physical. On 28 Sep 2016 4:29 p.m., "Prabhunath G" <gprabhunath@gmail.com> wrote:
The virtual addresses what you see in the output of objdump is given/associated by Linker to every instruction and data symbol in the data/bss section except for symbols in the stack section. It is wrong to use generated in the context of Linker. When you initiate *$./a.out* for execution, the kernel will take your start address from the ELF header of *a.out* and place it on the PC (program counter) or IP (instruction pointer) of the CPU, thereafter CPU will start incrementing or generating virtual address for every subsequent instructions.
Regards, Prabhu
On Wed, Sep 28, 2016 at 3:41 PM, Madhu K <madhu.sk89@gmail.com> wrote:
Hi Arun,
Thanks for your response.
I will elaborate my question.Assume I have test.c file, I compiled test.c and generated the a.out ( Executable for linux ), when I do objdump of a.out, we can see addresses( virtual address ) associated with each instruction, these instructions are generated by whom?
Thanks
On Wed, Sep 28, 2016 at 11:35 AM, Arun Sudhilal <getarunks@gmail.com> wrote:
Hello Madhu,
On Wed, Sep 28, 2016 at 10:36 AM, Madhu K <madhu.sk89@gmail.com> wrote:
Hi All,
This is to understand the Virtual address space.Basically who generates the virtual addresses CPU or GNU compiler?
I didn't really get your question.
Linux kernel starts at a fixed location in virtual space. This is called PAGE_OFFSET. On a kernel split of 3GB/1GB, 32 system, its is 0xC000_0000. You can have a look at system.map file after compiling your kernel. When cpu runs with MMU on, your cpu generates virtual address.
Regards, Arun
Thanks Madhu
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
-- Regards, Prabhunath G Linux Trainer Bangalore
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
Hi, I compile main.s and it generates main.o. With objdump I can see: 0000000000000000 <_start>: 0: b8 01 00 00 00 mov $0x1,%eax 5: bb 00 00 00 00 mov $0x0,%ebx a: cd 80 int $0x80 After link main.o it generates main. With objdump I now can see: 0000000000400078 <_start>: 400078: b8 01 00 00 00 mov $0x1,%eax 40007d: bb 00 00 00 00 mov $0x0,%ebx 400082: cd 80 int $0x80 So, linker generates virtual address, doesn't it? But why it starts at 400078 and not in other any location? Is there any logic here? A virtual address can start at 0? Regards. El mié, 28-09-2016 a las 19:02 +0530, Gadre Nayan escribió:
Virtual addresses will be used only in case MMU is enabled, otherwise for a processor an address is something it can put on the bus, irrespective of physical or virtual. So when your PC increments virtual address for a MMU enabled system, they will get translated to physical. On 28 Sep 2016 4:29 p.m., "Prabhunath G" <gprabhunath@gmail.com> wrote:
The virtual addresses what you see in the output of objdump is given/associated by Linker to every instruction and data symbol in the data/bss section except for symbols in the stack section. It is wrong to use generated in the context of Linker. When you initiate $./a.out for execution, the kernel will take your start address from the ELF header of a.out and place it on the PC (program counter) or IP (instruction pointer) of the CPU, thereafter CPU will start incrementing or generating virtual address for every subsequent instructions. Regards, Prabhu
On Wed, Sep 28, 2016 at 3:41 PM, Madhu K <madhu.sk89@gmail.com> wrote: Hi Arun, Thanks for your response.
I will elaborate my question.Assume I have test.c file, I compiled test.c and generated the a.out ( Executable for linux ), when I do objdump of a.out, we can see addresses( virtual address ) associated with each instruction, these instructions are generated by whom?
Thanks
On Wed, Sep 28, 2016 at 11:35 AM, Arun Sudhilal <getarunks@gmail. com> wrote: Hello Madhu,
On Wed, Sep 28, 2016 at 10:36 AM, Madhu K <madhu.sk89@gmail.com wrote:
Hi All,
This is to understand the Virtual address space.Basically who generates the
virtual addresses CPU or GNU compiler?
I didn't really get your question.
Linux kernel starts at a fixed location in virtual space. This is
called PAGE_OFFSET. On a kernel split of 3GB/1GB, 32 system, its is
0xC000_0000. You can have a look at system.map file after compiling
your kernel.
When cpu runs with MMU on, your cpu generates virtual address.
Regards,
Arun
Thanks
Madhu
_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@kernelnewbies.org
https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbie s
_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@kernelnewbies.org
https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
-- Regards, Prabhunath G Linux Trainer Bangalore
_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@kernelnewbies.org
https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
On 30-Sep-2016, at 10:10 pm, Román Martínez <rgmf@riseup.net> wrote:
Hi,
I compile main.s and it generates main.o. With objdump I can see:
0000000000000000 <_start>: 0: b8 01 00 00 00 mov $0x1,%eax 5: bb 00 00 00 00 mov $0x0,%ebx a: cd 80 int $0x80
After link main.o it generates main. With objdump I now can see:
0000000000400078 <_start>: 400078: b8 01 00 00 00 mov $0x1,%eax 40007d: bb 00 00 00 00 mov $0x0,%ebx 400082: cd 80 int $0x80
So, linker generates virtual address, doesn't it? But why it starts at 400078 and not in other any location? Is there any logic here? A virtual address can start at 0?
The linker script would normally leave out some area and _not_ start from 0. (although this is not an absolute necessity ). It will pick up and valid virtual address and assign start of .text,.bss and .stack. This is possible because we now have virtual memory. And every program thinks that it has _all_ the memory for itself. So, 400078 is perfectly valid virtual address space and linker has chosen this for this executable. Also note that if the address space is getting shifted by little , this is because of the KASLR (layout randomisation) - If this is disabled then the linker would generate the same virtual address for all the executable every time. <snip>
Hi All, Thank you so much for all your answers. Regards, Madhu On Sun, Oct 2, 2016 at 8:22 AM, Arshad Hussain <arshad.super@gmail.com> wrote:
On 30-Sep-2016, at 10:10 pm, Román Martínez <rgmf@riseup.net> wrote:
Hi,
I compile main.s and it generates main.o. With objdump I can see:
0000000000000000 <_start>: 0: b8 01 00 00 00 mov $0x1,%eax 5: bb 00 00 00 00 mov $0x0,%ebx a: cd 80 int $0x80
After link main.o it generates main. With objdump I now can see:
0000000000400078 <_start>: 400078: b8 01 00 00 00 mov $0x1,%eax 40007d: bb 00 00 00 00 mov $0x0,%ebx 400082: cd 80 int $0x80
So, linker generates virtual address, doesn't it? But why it starts at 400078 and not in other any location? Is there any logic here? A virtual address can start at 0?
The linker script would normally leave out some area and _not_ start from 0. (although this is not an absolute necessity ). It will pick up and valid virtual address and assign start of .text,.bss and .stack. This is possible because we now have virtual memory. And every program thinks that it has _all_ the memory for itself. So, 400078 is perfectly valid virtual address space and linker has chosen this for this executable.
Also note that if the address space is getting shifted by little , this is because of the KASLR (layout randomisation) - If this is disabled then the linker would generate the same virtual address for all the executable every time.
<snip>
Hi Greg, As I understand CPU's work is Fetch, Decode and Execute. How can CPU generate virtual address.please correct me if my understanding is wrong. Thanks Madhu On Wed, Sep 28, 2016 at 11:39 AM, Greg KH <greg@kroah.com> wrote:
On Wed, Sep 28, 2016 at 10:36:59AM +0530, Madhu K wrote:
Hi All,
This is to understand the Virtual address space.Basically who generates the virtual addresses CPU or GNU compiler?
CPU.
On Wed, Sep 28, 2016 at 03:44:28PM +0530, Madhu K wrote:
Hi Greg,
As I understand CPU's work is Fetch, Decode and Execute. How can CPU generate virtual address.please correct me if my understanding is wrong.
What exactly do you mean by "generate virtual address"? Is this a homework assignment? greg k-h
On Wed, Sep 28, 2016 at 6:06 AM, Madhu K <madhu.sk89@gmail.com> wrote:
Hi All,
This is to understand the Virtual address space.Basically who generates the virtual addresses CPU or GNU compiler?
Hi, In my view, the linker. The compiler normally generates absolute addresses (starting from 0), creating object code. Then the linker generates an executable by combining different object files together and assigning virtual addresses. Finally, is CPU (MMU) job (with the kernel helping) to translate these virtual addresses to physical ones. Best regards, -- Augusto Mecking Caringi
Hi, Even I read somewhere, during compilation, compiler will take the linker script as input and it will generate the virtual addresses. Thanks, Madhu On Wed, Sep 28, 2016 at 2:44 PM, Augusto Mecking Caringi < augustocaringi@gmail.com> wrote:
On Wed, Sep 28, 2016 at 6:06 AM, Madhu K <madhu.sk89@gmail.com> wrote:
Hi All,
This is to understand the Virtual address space.Basically who generates the virtual addresses CPU or GNU compiler?
Hi,
In my view, the linker.
The compiler normally generates absolute addresses (starting from 0), creating object code.
Then the linker generates an executable by combining different object files together and assigning virtual addresses.
Finally, is CPU (MMU) job (with the kernel helping) to translate these virtual addresses to physical ones.
Best regards,
-- Augusto Mecking Caringi
On Wed, Sep 28, 2016 at 8:06 AM, Madhu K <madhu.sk89@gmail.com> wrote:
Hi All,
This is to understand the Virtual address space.Basically who generates the virtual addresses CPU or GNU compiler?
Thanks Madhu
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
In no way does this response claim to be based on personal expert knowledge, but if my understanding of Chapter 2 (Page tables) of https://pdos.csail.mit.edu/6.828/2016/xv6/book-rev9.pdf is correct, it is the hardware that performs the mapping of physical memory, RAM, to virtual addresses on x86: Quote: As a reminder, x86 instructions (both user and kernel) manipulate virtual addresses. The machine’s RAM, or physical memory, is indexed with physical addresses. The x86 page table hardware connects these two kinds of addresses, by mapping each virtual address to a physical address.
On 28-Sep-2016, at 10:36 am, Madhu K <madhu.sk89@gmail.com> wrote:
Hi All,
The support comes right through from the architecture. Linear address: Also virtual address. This is Address CPU can address. This is 0 - 4GB under 32bit architecture. Physical address: This are actual memory installed in your system. Linear address have to be converted to physical address eventually. MMU translate linear address with the help of paging to physical address.
This is to understand the Virtual address space.Basically who generates the virtual addresses CPU or GNU compiler?
A program image generated by compiler & linker uses Virtual Address . During execution of the program CPU + MMU translates or maps each virtual address to physical address. Net-net this is architecture dependent and would highly recommend reading Intel’s Architecture Manual for your reference.
Thanks Madhu _______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
Hi, I COMPILE MAIN.S and it generates MAIN.O. With objdump I can see: 0000000000000000 <_start>: 0: b8 01 00 00 00 mov $0x1,%eax 5: bb 00 00 00 00 mov $0x0,%ebx a: cd 80 int $0x80 After LINK MAIN.O it generates MAIN. With objdump I now can see: 0000000000400078 <_start>: 400078: b8 01 00 00 00 mov $0x1,%eax 40007d: bb 00 00 00 00 mov $0x0,%ebx 400082: cd 80 int $0x80 So, linker generates virtual address, doesn't it? But why it starts at 400078 and not in other any location? Is there any logic here? A virtual address can start at 0? Regards. El 29.09.2016 09:25, arshad hussain escribió:
On 28-Sep-2016, at 10:36 am, Madhu K <madhu.sk89@gmail.com> wrote:
Hi All,
The support comes right through from the architecture.
Linear address: Also virtual address. This is Address CPU can address. This is 0 - 4GB under 32bit architecture. Physical address: This are actual memory installed in your system. Linear address have to be converted to physical address eventually. MMU translate linear address with the help of paging to physical address.
This is to understand the Virtual address space.Basically who generates the virtual addresses CPU or GNU compiler?
A program image generated by compiler & linker uses Virtual Address . During execution of the program CPU + MMU translates or maps each virtual address to physical address.
Net-net this is architecture dependent and would highly recommend reading Intel's Architecture Manual for your reference.
Thanks Madhu _______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
Please refer to following links, I hope this will help in understanding of linker generated address and virtual process address space: http://www.linuxjournal.com/article/6463?page=0,0 http://www.tenouk.com/ModuleW.html Regards. Piyush On Fri, Sep 30, 2016 at 10:39 PM, <roman@mailoo.org> wrote:
Hi,
I compile main.s and it generates main.o. With objdump I can see:
0000000000000000 <_start>: 0: b8 01 00 00 00 mov $0x1,%eax 5: bb 00 00 00 00 mov $0x0,%ebx a: cd 80 int $0x80
After link main.o it generates main. With objdump I now can see:
0000000000400078 <_start>: 400078: b8 01 00 00 00 mov $0x1,%eax 40007d: bb 00 00 00 00 mov $0x0,%ebx 400082: cd 80 int $0x80
So, linker generates virtual address, doesn't it? But why it starts at 400078 and not in other any location? Is there any logic here? A virtual address can start at 0?
Regards.
El 29.09.2016 09:25, arshad hussain escribió:
On 28-Sep-2016, at 10:36 am, Madhu K <madhu.sk89@gmail.com> wrote:
Hi All,
The support comes right through from the architecture.
Linear address: Also virtual address. This is Address CPU can address. This is 0 - 4GB under 32bit architecture. Physical address: This are actual memory installed in your system. Linear address have to be converted to physical address eventually. MMU translate linear address with the help of paging to physical address.
This is to understand the Virtual address space.Basically who generates the virtual addresses CPU or GNU compiler?
A program image generated by compiler & linker uses Virtual Address . During execution of the program CPU + MMU translates or maps each virtual address to physical address.
Net-net this is architecture dependent and would highly recommend reading Intel's Architecture Manual for your reference.
Thanks Madhu _______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
participants (12)
-
Alexander Kapshuk -
arshad hussain -
Arshad Hussain -
Arun Sudhilal -
Augusto Mecking Caringi -
Gadre Nayan -
Greg KH -
Madhu K -
piyush moghe -
Prabhunath G -
roman@mailoo.org -
Román Martínez