源**
除錯環境:
ubuntu14.04
核心版本:3.13.0-32
scull.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
"scull.h"
int scull_major = scull_major;
int scull_minor = 0;
module_param(scull_major, int, s_irugo);
module_param(scull_minor, int, s_irugo);
struct scull_dev *scull_device;
intscull_trim
(struct scull_dev *dev)
dev->data = null;
dev->size = 0;
}return0;}
intscull_open
(struct inode *inode, struct file *filp)
scull_trim(dev);
up(&dev->sem);
}return0;}
intscull_release
(struct inode *inode, struct file *filp)
ssize_t scull_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
if (*f_pos >= dev->size)
if (*f_pos + count > dev->size)
if (!dev->data)
if (copy_to_user(buf, dev->data + *f_pos, count))
*f_pos += count;
retval = count;
out:
up(&dev->sem);
return retval;
}ssize_t scull_write(struct file *filp, const
char __user *buf, size_t count, loff_t *f_pos)
if (!dev->data)
memset(dev->data, 0, scull_buffer_size);
}if (count > scull_buffer_size - dev->size)
if (copy_from_user(dev->data + dev->size, buf, count))
dev->size += count;
retval = count;
out:
up(&dev->sem);
return retval;
}loff_t scull_llseek(struct file *filp, loff_t off, int whence)
if (newpos < 0)
filp->f_pos = newpos;
return newpos;
}struct file_operations scull_fops = ;
void
scull_cleanup_module
(void)
unregister_chrdev_region(devno, 1);
}static
void
scull_setup_cdev
(struct scull_dev *dev)
}static
int __init scull_init_module
(void)
else
if (result < 0)
scull_device = kmalloc(sizeof(struct scull_dev), gfp_kernel);
if (!scull_device)
memset(scull_device, 0, sizeof(struct scull_dev));
//源**中使用init_mutex(&scull_device->sem)函式,此函式被新核心版本廢除
//故使用sema_init(&scull_device->sem,1)代替,達到相同效果
sema_init(&scull_device->sem,1);
scull_setup_cdev(scull_device);
return
0; fail:
scull_cleanup_module();
return result;
}module_init(scull_init_module);
module_exit(scull_cleanup_module);
module_license("gpl");
scull.h
#ifndef _scull_h
#define _scull_h
#define scull_major 0
#define scull_buffer_size page_size
struct scull_dev ;
#endif
makefile
obj-m += scull.o
current_path:=$(shell pwd)
linux_kernel:=$(shell uname -r)
linux_kernel_path:=/lib/modules/$(linux_kernel)/build
all:
make -c $(linux_kernel_path) m=$(current_path) modules
clean:
make -c $(linux_kernel_path) m=$(current_path) clean
編譯源**
測試向裝置驅動程式scull中寫入「hello,linux」,並從裝置驅動程式中讀出來。(如圖)
sudo su //獲取系統超級許可權
echo hello,linux > scull //向字元裝置驅動程式中寫入字串「hello,linux」
cat scull //讀出寫入的字元
本次實驗是我第一次深入地了解linux系統,確實學到了很多東西。以前雖然也在用linux,知道一些ubuntu下的基本命令,但是那時只是將linux當做windows的代替品來用,只知道一味地使用linux下的應用程式軟體做開發,而不是真正地使用linux。
本次實驗在做原始碼編譯和裝置驅動程式編寫的同時,了解到了一些linux作業系統的底層知識,更加體會到了linux和window在一些方面地差異。
在接下來使用linux系統的時候我會不斷地深入了解該系統,學習真正使用linux作業系統。
scull驅動學習!
linux裝置裝置驅動程式 第三版 學習筆記之一 scull裝置的使用 by 吳垠 date 2007 07 05 email lazy.fox.wu gmail.com homepage 1.寫在前面 a.在進行下面的工作之前請先閱讀我 的文章 在 linux 2.6核心下編譯可以載入的核心模組 ...
Scull字元裝置驅動模組的記憶體使用分析
先看一下每個scull dev的資料結構的定義 struct scull qset struct scull dev 每個scull裝置都有乙個資料指標,每個指標都指向下乙個scull qset資料結構。每個記憶體區成為乙個量子quantum,這個指標陣列即它的長度成為量子集qset,這個兩個值可以...
linux 字元驅動驅動
由於沒有經過完整測試 中可能會有不足之出,如有發現還請斧正 這是乙個學文件,所有 僅供學習使用,請勿在生產環境中使用 字元驅動是linux驅動學習的第一站,該 完成了乙個最簡單的字元驅動以及乙個最小化打測試 應用測試 僅做了open的測試 int main int argc,char argv pr...