升级ubuntu kernel后,vmware虚拟机启动不了了,报出“get_user_pages"找不到的错误,原来是在新kernel中,该函数不存在了 ,而vmware中还用的是该函数,因此按如下方式替换便可:
1)vmmon.tar
把vmmon-only/linux/hostif.c文件里的“get_user_pages”全都替换成“get_user_pages_fast"
cd /usr/lib/vmware/modules/source
tar xf vmmon.tar
cd vmmon-only/linux/
vim hostif.c
:%s/get_user_pages/get_user_pages_fast/g
:wq
cd ../..
重新打包vmmon.tar
tar cvf vmmon.tar vmmon-only
2)vmnet.tar
把/vmnet-only/userif.c文件里的“get_user_pages”全都替换成“get_user_pages_fast"
cd /usr/lib/vmware/modules/source
tar xf vmnet.tar
cd vmnet-only
vim userif.c
:%s/get_user_pages/get_user_pages_fast/g
:wq
cd ../..
重新打包vmnet.tar
tar cvf vmnet.tar vmnet-only
用以下命令安装:
user/bin/vmware-modconfig --icon='vmware-workstation' -appname='VMware'
vmware-modconfig --console --install-all
卸载:
sudo vmware-installer --uninstall-product vmware-workstation
sudo vmware-installer --uninstall-product vmware-player
/*
*-----------------------------------------------------------------------------
*
* HostIFGetUserPages --
*
* Lock the pages of an user-level address space in memory.
* If ppages is NULL, pages are only marked as dirty.
*
* Results:
* Zero on success, non-zero on failure.
*
* Side effects:
* None
*
*-----------------------------------------------------------------------------
*/
static int
HostIFGetUserPages(void *uvAddr, // IN
struct page **ppages, // OUT
unsigned int numPages) // IN
{
int retval;
retval = get_user_pages_fast((unsigned long)uvAddr, numPages, 0, ppages);
return retval != numPages;
}
/*
*-----------------------------------------------------------------------------
*
* UserifLockPage --
*
* Lock in core the physical page associated to a valid virtual
* address.
*
* Results:
* The page structure on success
* NULL on failure: memory pressure. Retry later
*
* Side effects:
* Loads page into memory
*
*-----------------------------------------------------------------------------
*/
static INLINE struct page *
UserifLockPage(VA addr) // IN
{
struct page *page = NULL;
int retval;
retval = get_user_pages_fast(addr, 1, FOLL_WRITE, &page);
if (retval != 1) {
return NULL;
}
return page;
}
retval = get_user_pages_fast((unsigned long)uvAddr, numPages, 0, ppages);
retval = get_user_pages_fast(addr, 1, FOLL_WRITE, &page);