嵌入式設計實驗二 模組引數及Proc檔案系統

2021-10-05 17:11:49 字數 4009 閱讀 1248

2.建立裝置檔案(裝置進入點)

3.插入核心模組(載入裝置驅動程式)

4.互動proc

五、心得體會與建議

掌握簡單字元裝置驅動程式中模組引數及proc檔案系統的編寫方法。

學習利用模組引數進行驅動程式引數傳遞,學習利用proc檔案系統進行資料讀寫。

ubuntu 12.04 核心3.2.14

寫乙個簡單的字元裝置驅動程式,要求:

gedit rwbuf.c

// 模組

#include

// 使用模組引數要的

#include

// 核心

#include

// struct file_operations

#include

// copy_to_user() & copy_from_user

#include

// 不行,用於memset和strcpy

#include

// kmalloc和kfree

#include

// 使用mutex

#include

// proc_fs定義

#include

// seq_file介面

#include

/* 內外同名 */

// 乙個int型的引數year,預設1024

static

int n =

1024

;module_param

(n,int,0

);module_parm_desc

(n,"內外同名的int型的整數,表示buffer的大小");

// mutex鎖

static

struct mutex lock;

// 鍊錶的頭結點

static

struct list_head head;

struct my_data

;// 在鍊錶上新建乙個結點

static

void

add_one

(void

)// 開始

static

void

*_seq_start

(struct seq_file *m, loff_t *pos)

// 下乙個

static

void

*_seq_next

(struct seq_file *m,

void

*p, loff_t *pos)

// 停止

static

void

_seq_stop

(struct seq_file *m,

void

*p)// 如何列印

static

int_seq_show

(struct seq_file *m,

void

*p)// seq_operations結構體函式

static

struct seq_operations _seq_ops =

;// 開啟

static

intmy_seq_open

(struct inode *inode,

struct file *file)

// 寫入新的結點資料

static ssize_t my_seq_write

(struct file *file,

const

char __user *buffer, size_t count, loff_t *ppos)

else

}// file_operations結構體函式

static

struct file_operations _seq_fops =

;// module_init()內的初始化函式。

static

int __init my_init

(void

)printk

("[my_init-error] entry failed\n");

return

-enomem;

}printk

("[my_init-success]\n");

return0;

}// module_exit()內的退出函式。

static

void __exit my_exit

(void

)printk

("bye!the module has uninstalled!\n");

}// 核心模組入口,相當於main()函式,完成模組初始化

module_init

(my_init)

;// 解除安裝時呼叫的函式入口,完成模組解除安裝

module_exit

(my_exit)

;// gpl協議證書

module_license

("gpl"

);

gedit makefile

內容:

obj-m := rwbuf.o

kerneldir := /lib/modules/$(shell uname -r)

/build

pwd :=

$(shell pwd

)modules:

$(make)

-c $(kerneldir)

m=$(pwd)

modules

clean:

rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions modules.order module.symvers

sudo make

sudo mknod /dev/rwbuf c 60 0

意思:在/dev目錄下建立乙個名為rwbuf的裝置檔案

裝置檔案的型別是c(字元型裝置)

主裝置號是60

次裝置號是0

sudo chmod 777 /dev/rwbuf

更改裝置的許可權。沒有讀寫許可權的話,就會讀出一堆無意義的亂碼。

先清理一下快取,不然一會就可能輸出一大堆多餘東西,影響到我們想要看到的輸出東西

sudo dmesg -c

插入核心模組(載入裝置驅動程式)

sudo insmod rwbuf.ko n=1000

檢視是否成功

感覺嵌入式在編譯過程**現的編譯問題還是挺多

for (int i = 0; i < narr; i++)

會報錯:

解決:要麼使用c99,要麼就注意點分開寫

int i;for (i = 0; i < narr; i++)

先解除安裝:

sudo rmmod module_name

出來是\x17之類的十六進製制結果

異常現象

就是不僅是write部分有,而且read部分也有。

經過多次嘗試,發現read部分也有的原因是因為static void add_one(void)中缺少了memset(data->str, 0, sizeof(data));,分配給新的結點的空間都是亂碼的,所以如果不清零的話,字串中就有亂碼。

linux驅動開發:沒有string.h

嵌入式課程設計總結(二)

學習內容 linux介紹 使用linux操作 命令 linux開發工具 目標 會用!夠用!vm虛擬機器 通過軟體的方法模擬pc 為什麼不使用雙系統?嵌入式開發與核心相互,會導致系統崩潰 linux發行版 發行給使用者使用的版本 redhat centos7 企業版 ununtu 16.10 18.0...

嵌入式學習筆記(二) 最簡單Linux驅動模組

linux 標頭檔案位置 無配置檔案 最小驅動 原始碼 mini linux.c include include module license dual bsd gpl module author xubaipei module init hello init module exit hello e...

嵌入式軟體設計第7次實驗報告

嵌入式軟體設計第7次實驗報告 學號 140201211 姓名 張潤澤 組別 第三組 實驗地點 d19 一 實驗目的 1.熟悉網線的製作 t568b標準直連線 2.學會使用html語言 超文字標記語言 進行網頁的設計 3.學會使用makefsdata.exe製作嵌入式二進位制網頁檔案。二 實驗內容 1...