1. 程式人生 > >關於linux模組程式設計

關於linux模組程式設計

剛開始看linux裝置驅動,就是大家都比較推崇的《LINUX裝置驅動程式》(第三版)。看到了第一個hellworld的示例,就在自己的系統上試了一下,然後不那麼爽。

具體程式碼如下:

  1 #include <linux/kernel.h>
  2 #include <linux/module.h>
  3 #include <linux/init.h>
  4 
  5 MODULE_LICENSE("GPL");
  6 
  7 static int hello_init(void)
  8 {
  9     printk("Hello, world\n"
); 10 return 0; 11 } 12 13 static void hello_exit(void) 14 { 15 printk("Goodbye, cruel world\n"); 16 } 17 18 module_init(hello_init); 19 module_exit(hello_exit);

於是乎就用gcc編譯之

gcc -I /lib/modules/3.13.0-46-generic/build/include/ -c hello_module.c 

但是各種報錯啊

In file included from hello_module.c:1
:0: /usr/src/linux-headers-3.13.0-46/include/linux/init.h:153:13: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘load_default_modules’ void __init load_default_modules(void); ^ /usr/src/linux-headers-3.13.0-46/include/linux/init.h:154:12: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before
‘init_rootfs’ int __init init_rootfs(void); ^ /usr/src/linux-headers-3.13.0-46/include/linux/init.h:254:13: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘parse_early_param’ void __init parse_early_param(void); ^ /usr/src/linux-headers-3.13.0-46/include/linux/init.h:255:13: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘parse_early_options’ void __init parse_early_options(char *cmdline); ^ In file included from /usr/src/linux-headers-3.13.0-46/include/linux/kernel.h:6:0, from /usr/src/linux-headers-3.13.0-46/include/linux/cache.h:4, from /usr/src/linux-headers-3.13.0-46/include/linux/time.h:4, from /usr/src/linux-headers-3.13.0-46/include/linux/stat.h:18, from /usr/src/linux-headers-3.13.0-46/include/linux/module.h:10, from hello_module.c:2: /usr/src/linux-headers-3.13.0-46/include/linux/linkage.h:7:25: fatal error: asm/linkage.h: 沒有那個檔案或目錄

在網上一頓神搜,未果。雖然很多時候都會有類似於
expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘attribute’ before XX
這樣的東西出現,但是究其原因,真是五花八門。
(以下是我個人的一些囉嗦,如覺無意義可略過該段落)

針對於後面說“缺少檔案”的問題,我到所說的目錄裡查看了一下,存在類似的檔案,只是檔名不一樣(要求的是asm/linkage.h,但是有asm-generic/linkage.h)。我甚至複製並更名了檔案目錄。但是編譯後又出現了種種新的問題。然後我意識到,我這樣隨便更改/usr/src裡的東西似乎不太好,一定是有某種其他的解決辦法,於是又改了回去。後來我又懷疑是不是系統版本問題,書中說的測試環境是linux 2.6.x(典型環境是2.6.10),而我的是linux 3.13.0。我就考慮是否有必要安裝一個2.6.10核心。下載之,make menuconfig(基本預設),make。然後又報了好多錯,網上說編譯2.6.10核心需要2.95.3版本的gcc,而linux 3.13.0的README裡也有此說明,於是又在網上找了gcc 2.95.3的原始碼,編譯之,又報了好多錯。網上說是因為編譯gcc 2.95.3的gcc的版本過高,我的是4.8.2。然後……我就有些力不從心了……

就寫了一個Makefile

  1 obj-m := hello_module.o
  2 
  3 all: 
  4     $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
  5 
  6 clean:
  7     $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

然後我就無敵了。

至於到底發生了什麼,我覺得我以後可以回答這個問題。

相關推薦

Linux 模組程式設計指南

Linux模組程式設計 1.1 模組學習什麼 1.認識什麼是模組?跟我學習的驅動有什麼關係? 2.熟悉模組的安裝,解除安裝,檢視 3.熟悉模組的基本框架 4.熟悉模組的程式設計方法 1.2 核心模組概述 Linux 核心的整體結構非常龐大,其包含的元件也非常多。我

關於linux模組程式設計

剛開始看linux裝置驅動,就是大家都比較推崇的《LINUX裝置驅動程式》(第三版)。看到了第一個hellworld的示例,就在自己的系統上試了一下,然後不那麼爽。 具體程式碼如下: 1 #include <linux/kernel.h>

Linux模組程式設計方法總結

一、編寫一個基本的核心模組1、編輯原始檔,程式碼hello.c#include <linux/init.h>#include <linux/kernel.h>#include <linux/module.h>int init_hello_m

Linux核心模組程式設計

Linux核心模組程式設計 (作者:Baron_wu 禁止轉載) 首先,建立一個核心模組並插入Linux核心中。這是實驗第一部分 首先檢視當前核心模組使用情概況:lsmod Module:模組名 Size:模組大小 Used by:這些模組在哪被使用 接下來編寫一個simple.c

linux 核心模組程式設計之LED驅動程式(六)

我使用的是tiny6410的核心板,板子如下,淘寶可以買到 為了不與板子上的任何驅動發生IO衝突,我使用CON1那一排沒用到的IO口,引腳如下   LED1 LED2 LED3 LED4

linux 核心模組程式設計之核心符號匯出(五)

/proc/kallsyms 記錄了核心中所有匯出的符號的名字與地址 我們需要編譯2個核心模組,然後其中一個核心模組去呼叫另一個核心模組中的函式 hello.c程式碼如下 #include <linux/module.h> #include <linux/in

linux 核心模組程式設計模組引數(四)

通過巨集module_param指定模組引數,模組引數用於在載入模組時傳遞給模組。 module_param(name, type, perm) name是模組引數的名字 type是這個引數的型別,常見值:bool、int、charp(字串型) perm是模組

linux 核心模組程式設計之編譯多個原始檔(三)

編譯擁有多個原始檔的核心模組的方式和編譯一個原始檔的方式差不多,我們先來看下我們需要的檔案都有哪些。 首先是main.c檔案 #include <linux/module.h> #include <linux/init.h> MODULE_LICENSE

linux 核心模組程式設計之hello word(二)

我們的目的是要編譯個hello.ko的檔案,然後安裝到核心中。 先來看下需要的程式碼,hello.c檔案如下 #include <linux/module.h> #include <linux/init.h> static int hello_init(vo

linux 核心模組程式設計之環境搭建(一)

這裡介紹些關於Tiny6410開發板核心的編譯,為後期驅動開發做前期的準備。 開發環境:64位的Ubuntu 14.01虛擬機器 目標機:友善之臂Tiny6410開發板 核心:linux-2.6.38-20110325.tar.gz 核心原始碼下載地址 htt

Linux核心模組程式設計——Hello World

一、實驗環境: 環境配置:VMware® Workstation 15 Pro、ubuntu Desktop 18.10、記憶體 2GB、處理器數量2、每個處理器核心數量1、硬碟大小30GB……還有一個就是用的咱Xidian的源(因為校內不需要流量啊,而且還很快!) 二、知識儲備

Linux核心模組程式設計系列1

1.準備工作 使用如下命令檢視自己Linux的核心版本 uname -a 結果如下: Linux VM-73-203-debian 4.9.0-6-amd64 #1 SMP Debian 4.9.88-1+deb9u1 (2018-05-07) x86_64 GNU/Lin

linux 核心模組程式設計

一個linux核心模組主要由以下幾個部分組成。 1、模組載入函式"用module_init()來指定"(必須)    當通過insmod和modprobe命令載入核心模組時,模組的載入函式會自動被核心執行,完成本模組的相關初始化工作。 linux模組載入函式一般以 __init表示宣告。典型宣告如下:: s

Linux核心模組程式設計(列出系統中所有核心執行緒的程式名、PID 號、程序狀態及程序優先順序、父程序的PID)

(1) 設計一個模組,要求列出系統中所有核心執行緒的程式名、PID 號、程序狀態及程序優先順序、父程序的PID。 1.首先,我們開始編寫模組程式碼,這是Linux核心程式設計的核心程式碼,程式碼如下: #include <linux/init.h&

Linux核心模組程式設計-proc檔案系統

什麼是proc proc檔案系統是一個偽檔案系統,它只存在記憶體當中,而不佔用外存空間。它以檔案系統的方式為訪問系統核心資料的操作提供介面。使用者和應用程式可以通過proc得到系統的資訊,並可以改變核心的某些引數。由於系統的資訊,如程序,是動態改變的,所以使用

Linux核心模組程式設計——hello,world

檔案hello.c(放在目錄/root/lnq/modules/hello下): #include<linux/kernel.h> #include<linux/module.h

linux核心程式設計--1模組的裝載和解除安裝

1.   簡介linux模組是具有獨立功能的程式,它可以被單獨編譯,但不能獨立執行。它在執行時被連結到核心作為核心的一部分在核心空間執行,這與執行在使用者空間的程序是不同的。模組通常由一組函式和資料結構組成,用來實現一種檔案系統、一個驅動程式或其他核心上層的功能。也就是說:模

Linux核心模組程式設計與核心模組LICENSE -《詳解(第3版)》預讀

Linux核心模組簡介Linux核心的整體結構已經非常龐大,而其包含的元件也非常多。我們怎樣把需要的部分都包含在核心中呢?一種方法是把所有需要的功能都編譯到Linux核心。這會導致兩個問題,一是生成的核心會很大,二是如果我們要在現有的核心中新增或刪除功能,將不得不重新編譯核心

Linux核心模組程式設計-字元裝置驅動

裝置驅動簡介 裝置被大概的分為兩類: 字元裝置和塊裝置。 字元裝置 提供連續的資料流,應用程式可以順序讀取,通常不支援隨機存取。相反,此類裝置支援按位元組/字元來讀寫資料。舉例來說,鍵盤、串列埠、調變解調器都是典型的字元裝置。 塊裝置 應用程式可以隨機

Linux核心模組程式設計-HelloWorld

HelloWorld核心 開始斷斷續續學習核心,大概半年了,多少開始對核心有點感悟了,但是對於這個龐然大物我顯得很渺小,在枯燥的核心原始碼之中似乎沒有一點點成功的喜悅,因此我選擇學習核心模組程式設計,通過編寫一些核心模組來體驗那一點點小小的成就感吧! 什麼是