我正在尝试编译一个内核模块,并在使用 kthread_create() 创建的 4 个线程上应用竞争条件。但是,当我运行 时sudo-make
,它进入了错误的目录,并且没有编译我想要编译的文件,该文件名为 race_module.c,位于名为“Lab4”的文件夹中。它进入的目录是:
make -C /lib/modules/5.4.179CS630Team6/build M= modules
make[1]: Entering directory '/home/parallels/Downloads/linux-5.4.179'
CALL scripts/checksyscalls.sh
CALL scripts/atomic/check-atomics.sh
CHK include/generated/compile.h
CHK kernel/kheaders_data.tar.xz
Building modules, stage 2.
MODPOST 5983 modules
make[1]: Leaving directory '/home/parallels/Downloads/linux-5.4.179'
我的 makefile 如下所示:
obj-m += race_module.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
我如何才能让它执行我的 race_module.c 文件?欢迎提出任何建议
答案1
我不确定为什么需要运行来构建内核模块;通常的工作流程是以非特权用户身份sudo make
运行,然后使用或以 root 身份将构建的模块插入内核。make
modprobe
insmod
默认情况下,Ubuntu 的 sudo 配置会执行env_reset
,其中似乎包含PWD
变量。因此给出
$ cat Makefile
all:
@echo "PWD is \"$(PWD)\""
然后
$ make
PWD is "/home/steeldriver/dir"
但
$ sudo make
PWD is ""
您可以要求 sudo 保留变量:
$ sudo --preserve-env=PWD make
PWD is "/home/steeldriver/dir"
然而恕我直言,最好修改 Makefile 以使用命令pwd
代替变量扩展$PWD
:
$ cat Makefile
all:
@echo "PWD is \"$(shell pwd)\""
$ sudo make
PWD is "/home/steeldriver/dir"
就你的情况而言:
obj-m += race_module.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) clean