From owner-freebsd-hackers@FreeBSD.ORG Mon Feb 14 09:31:14 2011 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 917A0106566B for ; Mon, 14 Feb 2011 09:31:14 +0000 (UTC) (envelope-from beezarliu@yahoo.com.cn) Received: from nm23.bullet.mail.ac4.yahoo.com (nm23.bullet.mail.ac4.yahoo.com [98.139.52.220]) by mx1.freebsd.org (Postfix) with SMTP id 0C2338FC0A for ; Mon, 14 Feb 2011 09:31:13 +0000 (UTC) Received: from [98.139.52.191] by nm23.bullet.mail.ac4.yahoo.com with NNFMP; 14 Feb 2011 09:18:53 -0000 Received: from [74.6.228.32] by tm4.bullet.mail.ac4.yahoo.com with NNFMP; 14 Feb 2011 09:18:53 -0000 Received: from [127.0.0.1] by smtp101.mail.ac4.yahoo.com with NNFMP; 14 Feb 2011 09:18:53 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com.cn; s=s1024; t=1297675133; bh=0QajpE/TxGWVCHJcnC+IihnWzKux5hBgOgr4pKyhFuM=; h=X-Yahoo-Newman-Id:Received:X-Yahoo-SMTP:X-YMail-OSG:X-Yahoo-Newman-Property:Date:From:To:Subject:Message-ID:X-mailer:Mime-Version:Content-Type; b=wydtzd1mRBRyHvW87dNbOYyrFLZD8ObMKX+mHwCWyldZrXuTbeXtSx3QN7QK73c5ylQcPPWyNrRq9A+m2a9P4JpBKVqhTDkce915Da3MkwV1JNKkbvAJvjEvWgFefTcYIB8UJNifpK3vd+JZvKfZtHz2XXDreNZ1LBHyxXu9aFA= X-Yahoo-Newman-Id: 465907.34224.bm@smtp101.mail.ac4.yahoo.com Received: from china (beezarliu@180.168.37.66 with login) by smtp101.mail.ac4.yahoo.com with SMTP; 14 Feb 2011 01:18:52 -0800 PST X-Yahoo-SMTP: YP5UPy2swBBHZGZlvbmOrntlD3fotw-- X-YMail-OSG: 4Hz870oVM1nBKdHkHQt7KybSOsAMNG9ooW_2cC6vAQQCfoi ra2rteo4ToWdz3LoMopg5icgL9Wg49aMf9d8rRwWgVWzarO81.3kaD9y4n5w JLMs3IsgU1BvBrMkR4p6qpbokURFXaO.ksuxCppmRoWhKZyOlr.W.i.vDkV6 GptcYSJf3s0NO81tOuf9YOm.Mqr41NW9pJvt1gPtnygRpM3yMNbOol_ntg_Q 8hY36Y6dYNooRztGlnT9FOUuXJVneAPV2BlPUi9xcjHPD109LFcugI_uomb_ MLU2N8CcqEZBBIWnUYQ.57P5J7Na4VIAWAZK8ZxduFRvHmrzEoMc- X-Yahoo-Newman-Property: ymail-3 Date: Mon, 14 Feb 2011 17:18:50 +0800 From: "beezarliu" To: "freebsd-hackers@freebsd.org" Message-ID: <201102141718415933573@yahoo.com.cn> X-mailer: Foxmail 6, 10, 201, 20 [cn] Mime-Version: 1.0 Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: 7bit X-Content-Filtered-By: Mailman/MimeDel 2.1.5 Subject: map share memory to kernel space X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Feb 2011 09:31:14 -0000 Hackers, I want to access a userland share memory in a kernel thread. So I tried to map the share memory to the kernel space. The basic idea is to map the shm_object into kernel_map when the share memory is created. Using the following patch, I found the vm_object in kernel_map, and the vm_object in the address space of userland process are the same. But their content in the kernel and userland address mapped are different. It's very strang since they are exactly the same vm_object. Do I miss something, please help. Thanks! Index: sys/kern/sysv_shm.c =================================================================== --- sys/kern/sysv_shm.c (revision xxxxxx) +++ sys/kern/sysv_shm.c (working copy) @@ -90,11 +90,14 @@ #include #include #include +#include #include #include #include #include static MALLOC_DEFINE(M_SHM, "shm", "SVID compatible shared memory segments"); static int shmget_allocate_segment(struct thread *td, @@ -421,6 +424,7 @@ shmseg->u.shm_atime = time_second; shmseg->u.shm_nattch++; td->td_retval[0] = attach_va; done2: mtx_unlock(&Giant); return (error); @@ -678,10 +682,61 @@ * We make sure that we have allocated a pager before we need * to. */ - shm_object = vm_pager_allocate(shm_use_phys ? OBJT_PHYS : OBJT_SWAP, - 0, size, VM_PROT_DEFAULT, 0, cred); + if (uap->key == aaaaaa) { + shm_object = vm_pager_allocate(shm_use_phys ? OBJT_PHYS : OBJT_SWAP, + 0, size, VM_PROT_DEFAULT, 0, cred); + } else { + shm_object = vm_pager_allocate(OBJT_PHYS, 0, size, + VM_PROT_DEFAULT, 0, cred); + } if (shm_object == NULL) return (ENOMEM); + + if (uap->key == aaaaaa) { + vm_offset_t addr; + vm_offset_t offset; + vm_offset_t i; + + printf("attach to kernel map.\n"); + + vm_map_lock(kernel_map); + if (vm_map_findspace(kernel_map, vm_map_min(kernel_map), + size, &addr)) { + vm_map_unlock(kernel_map); + return (0); + } + offset = addr - VM_MIN_KERNEL_ADDRESS; + vm_object_reference(shm_object); + vm_map_insert(kernel_map, shm_object, offset, addr, addr + size, + VM_PROT_ALL, VM_PROT_ALL, 0); + vm_map_unlock(kernel_map); + + VM_OBJECT_LOCK(shm_object); + for (i = 0; i < size; i += PAGE_SIZE) { + vm_page_t mem; + + mem = vm_page_grab(shm_object, OFF_TO_IDX(offset + i), + VM_ALLOC_NOBUSY | VM_ALLOC_ZERO | VM_ALLOC_RETRY); + mem->valid = VM_PAGE_BITS_ALL; + KASSERT((mem->flags & PG_UNMANAGED) != 0, + ("shm_alloc: page %p is managed", mem)); + } + VM_OBJECT_UNLOCK(shm_object); + + /* + * And finally, mark the data as non-pageable. + */ + (void) vm_map_wire(kernel_map, addr, addr + size, + VM_MAP_WIRE_USER|VM_MAP_WIRE_NOHOLES); + + vm_map_inherit(kernel_map, addr, addr + size, VM_INHERIT_SHARE); + } + VM_OBJECT_LOCK(shm_object); vm_object_clear_flag(shm_object, OBJ_ONEMAPPING); vm_object_set_flag(shm_object, OBJ_NOSPLIT); 2011-02-14 beezarliu