[SOLVED]using dkms to install driver with errors

起因

由于笔记本(ThinkPad X1C 2014)在Linux下的待机时间远不如Windows,经过简单的搜索,发现了TLP这款能耗管理神器,调教起来还比较简单,基本只要用自带的能源方案就已经够了,其他的就不多说了,因为美帝良心想的本子都有一个电源管理设置叫充放电阈值(这个还是刚查的)有利于笔记本电源的保养,在我的历代笔记本里都是电池先DIE,所以对此比较在意,就查了一下,TLP是支持[仅ThinkPad]的该项设置,在/etc/default/tlp中,需要acpi-call这个模块,对,这就是本文的主角。
按照TLP官网教程安装过程很顺利


sudo apt-get update && sudo apt-get install acpi-call-dkms
# 好,没有报错,那现在来检查一下有没有效果

sudo tlp-stat
# 结果还是inactive,显示没有安装,我想,那是不是dkms要手动安装啊?Google上没找到,然后我想到了软件自带的帮助

sudo dpkg -l | grep dkms # 确认一下有这个软件包

sudo dkms install # 猜测是这么用

#然后会提示这么用不对,使用 help 命令查询使用方式

sudo dkms help #诶!这个autoinstall好像可以

Usage: /usr/sbin/dkms [action] [options]
[action] = { add | remove | build | install | uninstall | match | autoinstall
| mkdriverdisk | mktarball | ldtarball | mkrpm | mkkmp | mkdeb | mkbmdeb | status }
[options] = [-m module] [-v module-version] [-k kernel-version] [-a arch]
[-d distro] [-c dkms.conf-location] [-q] [--force] [--all]
[--templatekernel=kernel] [--directive='cli-directive=cli-value']
[--config=kernel-.config-location] [--archive=tarball-location]
[--kernelsourcedir=source-location] [--no-prepare-kernel] [--no-initrd]
[--binaries-only] [--source-only] [-r release (SuSE)] [--verbose]
[--size] [--spec=specfile] [--media=floppy|iso|tar] [--legacy-postinst=0|1]
[--no-depmod]
[-j number]
Error! No action was specified.
sudo dkms autoinstall

问题

提示是这样的,大概意思就是说引用函数没有找到

DKMS make.log for acpi_call-1.2.0 for kernel 4.12.1-chrysalis (x8664)
Thu Jul 13 19:31:39 CEST 2017
make -C /lib/modules/4.12.1-chrysalis/build M=/var/lib/dkms/acpi_call/1.2.0/build modules
make[1]: Entering directory ‘/tmp/linux-4.12.1’
CC [M] /var/lib/dkms/acpi_call/1.2.0/build/acpi_call.o
/var/lib/dkms/acpi_call/1.2.0/build/acpi_call.c: In function ‘acpi_proc_write’:
/var/lib/dkms/acpi_call/1.2.0/build/acpi_call.c:307:9: error: implicit declaration of function ‘copy_from_user’ [-Werror=implicit-function-declaration]
if (copy_from_user( input, buff, len )) {
^~~~~~~~~~~~~~
cc1: some warnings being treated as errors
make[2]: *** [scripts/Makefile.build:309: /var/lib/dkms/acpi_call/1.2.0/build/acpi_call.o] Error 1
make[1]: *** [Makefile:1512: _module/var/lib/dkms/acpi_call/1.2.0/build] Error 2
make[1]: Leaving directory ‘/tmp/linux-4.12.1’
make: *** [Makefile:7: default] Error 2

然后在网上找了很久,对应的方法都没有解决:

  • 加上-Werror=implicit-function-declaration编译选项
  • 用define更改定义(这个不完全符合,所以没有办法尝试)
  • 可能没有引包(最开始我觉得这官方源不应该出这种错误啊,虽然也不是这个错误,但这是最接近的一个)

后来注意到有两个版本:copy_from_user这个函数在<asm/uaccess.h>另一说是在<linux/uaccess.h>,用locate命令查到源码位置后,发现是引用的是<asm/uaccess.h>,之前挖坑的时候遇到过不在标准位置这个问题,就想着这个是不是在linux/下面,于是把asm改成了linux,先手动运行了一下make,跑通了,然后


sudo dkms autoinstall

[北京大学计算机考研复试题解]skew binary

原题

在skew binary 表示中,数x的第k位的值x[k]表示x[k]*(2^(k+1)-1).每个位上的可能数字是0或1,最后面一个非零位可以使2,例如10120(skew)=1*(2^(4+1)-1)+0*(2^(3+1)-1)+1*(2^(2+1)-1)+2*(2^(1+1)-1)+0*(2^(0+1)-1).前十个skew数为0、1、2、10、11、12、20、100、101以及102.
要求:
输入包含一行或多行,每行包含一个整数n,若n=0,则输入结束,否则其为skew数,输出对应的十进制值


using namespace std;
file f;
while (char line[]=f.readline()){}
int result=0;
int bitCounter=0;
while(line>0){
    unsigned short bit=line%10;
    line/=10;
    result=bit*(2(bitCounter+1)
    bitCounter++;
}

变体

在skew binary 表示中,数x的第k位的值x[k]表示x[k]*(2^(k+1)-1).每个位上的可能数字是0或1,最后面一个非零位可以使2,例如10120(skew)=1*(2^(4+1)-1)+0*(2^(3+1)-1)+1*(2^(2+1)-1)+2*(2^(1+1)-1)+0*(2^(0+1)-1).前十个skew数为0、1、2、10、11、12、20、100、101以及102.
要求:
输入包含一行或多行,每行包含一个十进制整数n,若n=0,则输入结束,否则输出对应的skew表示

[cc lang=’C++’]
System.out.println(“Hello Github Pages”);
// prints ‘Github Pages’ to STDOUT.
[/cc]

HQL Builder

这是个啥呢

一个用于快速构建HQL(Hibernate)的工具,同时伴生有SQLBuilder
灵感来源于Yii的Query类,这么好用的东西为什么不能移植到JAVA中呢,就算是一个劣化版,写起来也要方便很多
另外还有一点私心,就是某个Android项目,不支持Hibernate,那就需要手动写SQL,我觉得这样太麻烦了,要用一种更易于理解和写的方式来实现这一过程
因为SQL本身就是结构化的,所以这是一个很方便,并且可以练习SQL的方式

不要相信Windows的更新

现在是2018年6月3日18:32:31,昨天晚上发生了重要的事,同一台机子上的Win7发生了更新,以往这不是什么大问题,但这次更新后将数据盘的Win10账户下的部分文件修复成了错误权限,需要重新获取,经此一役,在可互访的磁盘系统中,千万不要在低版本中挂载存有高版本数据的磁盘,特别是用户还不一样的时候