[書]Linux Device Driver Programming 驅動程式設計

因為作者寫這本書的時候,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 改為 device
class_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