返回列表 发帖

[站长原创] 移植内核必备知识-一些与内核地址相关的宏定义

[站长原创] 移植内核必备知识-一些与内核地址相关的宏定义

移植内核必备知识-一些与内核地址相关的宏定义

嵌入式开发联盟

www.mcuos.com

Osboy 站长原创

QQ:82475491

Mcuos.com@gmail.com



一些宏定义在内核移植的时候你必须知道,比如如何定义内核的虚拟地址的基地址,如何定义内核的物理地址的基地址?内核镜像应该存放在内存的哪个地址?从哪个地址开始boot?这些在内核中都有宏定义,而且直接关系着Va to Pa转化函数的实现。

(1)PAGE_OFFSET
内核的虚拟地址空间的起始地址。
定义在arch/arm/include/asm/memory.h
#define PAGE_OFFSET  UL(CONFIG_PAGE_OFFSET),我们在配置选项里面设置:#define CONFIG_PAGE_OFFSET 0xC0000000。所以:PAGE_OFFSET == 0xC0000000。
(2)PHYS_OFFSET
内核的物理地址空间的基地址。
定义在arch/arm/include/asm/memory.h
#ifndef PHYS_OFFSET
#define PHYS_OFFSET PLAT_PHYS_OFFSET
#endif
在arch/arm/mach-s3c64xx/mach/include/memory.h有定义:
#define PLAT_PHYS_OFFSET     UL(0x50000000)
所以:PHYS_OFFSET == 0x50000000
(3)TEXT_OFFSET
在arch/arm/Makefile中有定义:
textofs-y        := 0x00008000

TEXT_OFFSET := $(textofs-y)
所以TEXT_OFFSET == 0x00008000
(6)PAGE_SHIFT
定义在arch/arm/include/asm/page.h
#define PAGE_SHIFT  12
一个页有4k字节,1左移12bit=4k
(7)虚拟地址与物理地址之间的转化函数
定义在arch/arm/include/asm/memory.h中有:
#define __virt_to_phys(x) ((x) - PAGE_OFFSET + PHYS_OFFSET)
#define __phys_to_virt(x) ((x) - PHYS_OFFSET + PAGE_OFFSET)
(8)KERNEL_START
定义在arch/arm/kernel/head.S:
#define KERNEL_START     KERNEL_RAM_VADDR
#define KERNEL_RAM_VADDR
(PAGE_OFFSET + TEXT_OFFSET)

所以:KERNEL_START == 0xC0000000 + 0x00008000 = 0xc0008000
就是kernel的虚拟运行地址。
(9)KERNEL_END
定义在arch/arm/kernel/head.S:
#define KERNEL_END
_end

_end的说明请参考本站的那篇vmlinxu.ld.S的说明。它是实际的内核占用的内存空间大小。(10)TASK_SIZE
定义在arch/arm/include/asm/memory.h
#define TASK_SIZE
(UL(CONFIG_PAGE_OFFSET) - UL(0x01000000))

#define CONFIG_PAGE_OFFSET 0xC0000000
所以:TASK_SIZE ==
0xC0000000 - 0x01000000 = 0xC0000000 - 16M
分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友

返回列表
网页右侧QQ悬浮滚动在线客服
网页右侧QQ悬浮滚动在线客服