Linux 驅動之為應用程式實現呼叫(未完)

2021-08-28 00:26:24 字數 2883 閱讀 3731

何為裝置檔案?裝置檔案的關鍵資訊是:裝置號 = 主裝置號 + 次裝置號,使用ls -l去檢視裝置檔案,就可以得到這個裝置檔案對應的主次裝置號。

使用mknod建立裝置檔案:mknod /dev/*** c 主裝置號 次裝置號?

還是原來的應用?

open、write、read、close等?

實驗現象**和驗證?

在驅動中新增?

在應用中新增?

測試?應用和驅動之間的資料交換?

copy_from_user,用來將資料從使用者空間複製到核心空間?

copy_to_user?

注意?複製是和mmap的對映相對應去區分的

完成write和read函式?

copy_from_user函式的返回值定義,和常規有點不同。返回值如果成功複製則返回0,如果 不成功複製則返回尚未成功複製剩下的位元組數。

讀寫回環測試?

makefile

# ubuntu的核心原始碼樹,如果要編譯在ubuntu中安裝的模組就開啟這2個

# kern_ver = $(shell uname -r)

# kern_dir = /lib/modules/$(kern_ver)/build

# 開發板的linux核心的原始碼樹目錄

kern_dir = /root/qt/kernel

obj-m += module_test.o

all:

make -c $(kern_dir) m=`pwd` modules

cp:cp *.ko /root/removal/rootfs/root/driver_test

.phony: clean

clean:

make -c $(kern_dir) m=`pwd` modules clean

#include #include #include #include // 剛才mknod建立的裝置檔名

#define file "/dev/test_chrdev"

char buf[100];

int main(void)

printf("open %s success..\n", file);

// 讀寫檔案

write(fd, "helloworld", 10);

read(fd, buf, 100);

printf("讀出來的內容是:%s.\n", buf);

// 關閉檔案

close(fd);

return 0;

}

modue_test.c

// 為了module_init,module_exit相關的,加入下面標頭檔案

#include // 為了__init,__exit相關的,加入下面標頭檔案

#include #include #include #define mymajor 250

#define myname "test_chrdev"

int mymajor;

// 核心空間的buf

char kbuf[100];

static int test_chrdev_open(struct inode *inode, struct file *file)

static int test_chrdev_release(struct inode *inode, struct file *file)

ssize_t test_chrdev_read(struct file *file, char __user *ubuf, size_t count, loff_t *ppos)

printk(kern_info "copy_to_user success..\n");

return 0;

}// 寫函式的本質就是將應用層傳遞過來的資料先複製到核心中,然後將之以正確的方式寫入硬體完成操作。

static ssize_t test_chrdev_write(struct file *file, const char __user *ubuf,

size_t count, loff_t *ppos)

printk(kern_info "copy_from_user success..\n");

// 真正的驅動中,資料從應用層複製到驅動中後,我們就要根據這個資料

// 去寫硬體完成硬體的操作。所以這下面就應該是操作硬體的**

return 0;

}// 自定義乙個file_operations結構體變數,並且去填充

static const struct file_operations test_fops = ;

// 模組安裝函式

static int __init chrdev_init(void)

printk(kern_info "register_chrdev success... mymajor = %d.\n", mymajor);

return 0;

}// 模組解除安裝函式

static void __exit chrdev_exit(void)

module_init(chrdev_init);

module_exit(chrdev_exit);

// module_***這種巨集作用是用來新增模組描述資訊

// 描述模組的許可證

module_license("gpl");

// 描述模組的作者

module_author("aston");

// 描述模組的介紹資訊

module_description("module test");

// 描述模組的別名資訊

module_alias("alias ***");

關於linux驅動 應用 程式標頭檔案使用

驅動程式 include 是在linux 2.6.29 include linux下面尋找原始檔。include 是在linux 2.6.29 arch arm include asm下面尋找原始檔。include 是在linux 2.6.29 arch arm mach s3c2410 inclu...

驅動原理 應用程式訪問驅動程式

以read為例 read是乙個系統呼叫,系統呼叫之前在應用程式當中 或者叫使用者空間當中 read的實現 在核心中,read是如何找到核心的實現 呢?filename read mem.c include include include include intmain 這個應用程式就是開啟字元裝置檔...

應用程式 核心 驅動的關係

應用程式與庫函式 核心 驅動之間的關係 應用程式 庫 核心 驅動程式的關係 應用程式呼叫應用程式函式庫完成功能 應用程式以檔案形式訪問各種資源 應用程式函式庫 部分函式直接完成功能 部分函式通過系統呼叫。由核心完成核心處理系統呼叫。呼叫裝置驅動程式,裝置驅動直接與硬體通訊。它們之間的關係如下圖所示 ...