iw_ndis.c 的内核编译错误

iw_ndis.c 的内核编译错误

我有一台装有英特尔高清显卡的 hp pavilion dm3t,运行 ubuntu 10.10 64 位。我正在尝试根据此内容编译和安装修补的内核,
https://launchpad.net/~kamalmostafa/+archive/linux-kamal-mjgbacklight

所以我从这里下载了 tarball(链接到上面的页面): http://kernel.ubuntu.com/git?p=kamal/ubuntu-maverick.git;a=shortlog;h=refs/heads/mjg-backlight

我将其解压到一个目录,进入该目录并执行:

make defconfig

我不确定这是否是我应该做的但它成功了,所以我这样做了:

make

它似乎工作正常,直到出现以下错误:

ubuntu/ndiswrapper/iw_ndis.c:1966: error: unknown field ‘num_private’ specified in initializer
ubuntu/ndiswrapper/iw_ndis.c:1966: warning: initialization makes pointer from integer without a cast
ubuntu/ndiswrapper/iw_ndis.c:1967: error: unknown field ‘num_private_args’ specified in initializer
ubuntu/ndiswrapper/iw_ndis.c:1967: warning: excess elements in struct initializer
ubuntu/ndiswrapper/iw_ndis.c:1967: warning: (near initialization for ‘ndis_handler_def’)
ubuntu/ndiswrapper/iw_ndis.c:1970: error: unknown field ‘private’ specified in initializer
ubuntu/ndiswrapper/iw_ndis.c:1970: warning: initialization makes integer from pointer without a cast
ubuntu/ndiswrapper/iw_ndis.c:1970: error: initializer element is not computable at load time
ubuntu/ndiswrapper/iw_ndis.c:1970: error: (near initialization for ‘ndis_handler_def.num_standard’)
ubuntu/ndiswrapper/iw_ndis.c:1971: error: unknown field ‘private_args’ specified in initializer
ubuntu/ndiswrapper/iw_ndis.c:1971: warning: initialization from incompatible pointer type
make[2]: *** [ubuntu/ndiswrapper/iw_ndis.o] Error 1
make[1]: *** [ubuntu/ndiswrapper] Error 2
make: *** [ubuntu] Error 2

我如何才能成功编译并安装此内核?我是这方面的新手,希望得到任何帮助。

答案1

考虑一下你关于笔记本电脑的最后一个问题背光,您无需编译内核即可使用该补丁。您只需将 PPA 添加到系统的软件源中。

扭矩解释了如何进行他的评论

只需将 PPA 添加到您的系统中。启动终端并运行sudo apt-add-repository ppa:kamalmostafa/linux-kamal-mjgbacklight,然后sudo apt-get update最后使用运行升级sudo apt-get upgrade。正如您在上面的 PPA 链接中所读到的,您可能需要将acpi_backlight=vendor新内核添加到 grub 条目的 linux-line 中(请参阅这个答案关于如何在启动过程中向内核添加参数)。

整个过程已经在底部详细说明您链接的页面

答案2

num_private 和 num_private_args 字段仅在内核编译期间定义 CONFIG_WEXT_PRIV 时定义,因此您需要将此处的 #ifdef/#endif 行添加到 iw_ndis.c:

const struct iw_handler_def ndis_handler_def = {
    .num_standard   = sizeof(ndis_handler) / sizeof(ndis_handler[0]),
#ifdef CONFIG_WEXT_PRIV 
    .num_private    = sizeof(priv_handler) / sizeof(priv_handler[0]),
    .num_private_args = sizeof(priv_args) / sizeof(priv_args[0]),
#endif
    .standard   = (iw_handler *)ndis_handler,
#ifdef CONFIG_WEXT_PRIV 
    .private    = (iw_handler *)priv_handler,
    .private_args   = (struct iw_priv_args *)priv_args,
#endif  
    .get_wireless_stats = get_iw_stats,
};

然而,这还不是全部。您还会在编译 wrapndis.c 时遇到错误,因此您需要找到包含以下 if 语句的行(大约在 1820 行)并将其包装在 #ifdef/#endif 中。

#ifdef CONFIG_WEXT_PRIV
如果 (wnd->physical_medium == NdisPhysicalMediumWirelessLan) { net_dev->wireless_handlers = &ndis_handler_def; }#endif

应该补充一点,我正在尝试自己编译这个,并且还没有测试过 ndiswrapper,所以 YMMV。

上述关于 wrapndis 的内容是错误的,似乎我的内核配置中未设置 CONFIG_WIRELESS_EXT。如果设置了,那么我就不会收到此错误。

相关内容