#include<stdio.h>
int main(int argc, const char *argv[])
{
char i[] = "0x04"
printf("i = %s\n", i)
return 0
}
即可
要想在内核中保留一个块内存,不被系统分配,而是只由自己使用,可以使用以下函数reserve_bootmem(addr,size,flag)
这个函数的三个参数,addr是你要保留的地址,size就是要保留的大小,flag是标志位,要来确定是否检查你要保留的空间是否已经被保留了,它可以设置为两个值,BOOTMEM_DEFAULT和BOOTMEM_EXCLUSIVE,前者就是总是会返回0(也就是保留成功),而后者则会检查你所要保留的空间是否已经被保留了,若已经被保留了,则它返回失败(负数)
那么这个函数一般放在哪里使用过了,我们建议放到内核init/main.c中,在页表的建立之前进行保留,比如我们下面的代码,放在main中的start_kernel函数中,我们的内核是2.6.32
asmlinkage void __init start_kernel(void)
{
……
……
trap_init()
if(reserve_bootmem(0x41000000,0x100000,BOOTMEM_EXCLUSIVE) != 0){
printk("reserve fail----\n")
}
printk("we reserve boot meme of 0x41000000 for gps---------------------------------\n")
mm_init()
……
……
}
这样就保留了一个起始地址为0x41000000,大小为1M的空间
网上有说法,X64 linux上,32位executable的text段起始地址是0x08048000,64位executable的text段起始地址是00400000。在一台机器上试验,确实如此:
但是换了一台机器,完全不是这个样子了:
可执行程序每次启动时,都被加载到随机位置上,这种现象叫PIE。PIE会使mtrace、addr2line这样的工具无效。
与linux发行版本、编译器版本都有关。例如:
gcc a.c -fpie -pie
效果如下:
gcc a.c -no-pie
效果如下:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)