Linux字元驅動 scull

2021-07-25 13:57:34 字數 3740 閱讀 4093

源**

除錯環境:

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