Saturday, April 29, 2006

kmem V.S. mmap

在 NCTUns kernel 利用了 memory mapping 的技巧,讓 kernel space 和 user space 的 simulator engine 共用資訊可以溝通與快速存取,但是從上個版本 2.6.11 的 kernel 和現在 porting 的目標 2.6.16.1 卻有了變化....

porting 完之後,發現原來 engine 的 code


in polling.cc

#define OFFSET 0xc0000000
#define PTR_POS(Val) ((unsigned long)(Val))

if((fd = open("/dev/kmem", O_RDWR)) < 0) {
    ...
    ...
}
...
...
tun_addr = search_kvm("tunif_qlen");
if(tun_addr == 0){
    printf("nctuns: search tunif_qlen in kernel image error!!\n");
    exit(-1);
}
offset = PTR_POS(tun_addr-OFFSET) - (PTR_POS(tun_addr-OFFSET) & ~4095);
tunifqlen = (u_int32_t *)mmap(0, PTR_POS(offset) + sizeof(u_int32_t) * MAX_NODES, PROT_READ, MAP_PRIVATE, fd, PTR_POS(tun_addr-OFFSET) & ~4095);

if (tunifqlen == MAP_FAILED) {
    perror("mmap(tunIFqlen)");
    exit(0);
}

無法運作,但在 2.6.11 卻是正常的....try 到後來,試著把 OFFSET 的 0xC0000000 拿掉,設成 0x0 意外的就解決問題了,看來 2.6.16 對於 /dev/kmem 的 memory address 作法有別於以往..

HEMiDEMi Technorati Del.icio.us MyShare個人書籤 Yahoo

1 Comments:

Andy Tzeng said...

12/02 port 到 2.6.19 的 kernel 發現,這個版本又要 shift 0xC0000000 了...

kernel 真是搞不懂你呀...