因為作者寫這本書的時候,Linux Kernel 版本為 2.4 或 2.6
時至今日,Linux Kernel 版本已經增加許多,以及執行時 x86 x86_64 的不同,所以部分範例程式會 make 失敗
這裡稍微整理一下遇到的情況
首先,先確認自己使用的 kernel 版本及架構
檢查 kernel 版本
$ uname -r
5.4.0-52-generic
檢查系統架構
$ uname -m
x86_64
以下為 make 時需要修正的地方:
chap5\linklist
錯誤情形
error: implicit declaration of function ‘kfree’; did you mean ‘vfree’? [-Werror=implicit-function-declaration]
27 | kfree(entry);
| ^~~~~
| vfree
error: implicit declaration of function ‘kmalloc’; did you mean ‘vmalloc’? [-Werror=implicit-function-declaration]
57 | ptr = kmalloc(sizeof(struct sample_data), GFP_KERNEL);
| ^~~~~~~
| vmalloc
修正方式
引用 linux/slab.h
#include <linux/slab.h>
chap6/udev
錯誤情形
devone.c:71:14: error: implicit declaration of function ‘class_device_create’; did you mean ‘device_create’? [-Werror=implicit-function-declaration]
71 | class_dev = class_device_create(
| ^~~~~~~~~~~~~~~~~~~
| device_create
修正方式
class_device 改為 deviceclass_device_create 改為 device_create
原始程式碼
struct class_device *class_dev = NULL;
…
class_dev = class_device_create(
devone_class,
NULL,
devone_dev,
NULL,
"devone%d",
devone_minor);
修正後程式碼
struct device *class_dev = NULL;
…
class_dev = device_create(
devone_class,
NULL,
devone_dev,
NULL,
"devone%d",
devone_minor);
chap7\asm
錯誤情形
main.c: Assembler messages:
main.c:17: Error: invalid instruction suffix for `pushf'
main.c:18: Error: invalid instruction suffix for `pop'
main.c:19: Error: invalid instruction suffix for `pushf'
main.c:20: Error: invalid instruction suffix for `pop'
修正方式
因為個人的開發環境使用 x86_64
原本使用 pushfl 及 popl 的組合語言語法,並不存在於 x86_64,須改用 pushfq 及 popq
且同時要修改變數為 u64
原始程式碼
void do_asm2(void)
{
u32 cx, dx;
u32 flag, flag2;
asm("int $0x1a\n\t"
"pushfl\n\t"
"popl %0\n\t"
"pushfl\n\t"
"popl %3\n\t"
: "=r"(flag), "=c" (cx), "=d" (dx), "=r"(flag2)
: "a" (0x0200)
);
printk("cx %x dx %x flag %x flag2 %x\n", cx, dx, flag, flag2);
}
修正後程式碼
void do_asm2(void)
{
u64 cx, dx;
u64 flag, flag2;
asm("int $0x1a\n\t"
"pushfq\n\t"
"popq %0\n\t"
"pushfq\n\t"
"popq %3\n\t"
: "=r"(flag), "=c" (cx), "=d" (dx), "=r"(flag2)
: "a" (0x0200)
);
printk("cx %llx dx %llx flag %llx flag2 %llx\n", cx, dx, flag, flag2);
}
書本連結:
https://www.tenlong.com.tw/products/9789862011867