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...