在 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 作法有別於以往..
Home >
NCTUns kernel
> kmem V.S. mmap
Saturday, April 29, 2006
kmem V.S. mmap
Subscribe to:
Post Comments (Atom)

1 Comments:
12/02 port 到 2.6.19 的 kernel 發現,這個版本又要 shift 0xC0000000 了...
kernel 真是搞不懂你呀...
Post a Comment