国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
深入淺出Linux設備驅(qū)動之字符設備驅(qū)動程序
設備"gobalvar"的驅(qū)動程序的這些函數(shù)應分別命名為gobalvar_open、gobalvar_release、gobalvar_read、gobalvar_write、gobalvar_ioctl,因此設備"gobalvar"的基本入口點結(jié)構(gòu)變量gobalvar_fops 賦值如下:

struct file_operations gobalvar_fops = {
 read: gobalvar_read,
 write: gobalvar_write,
};

  上述代碼中對gobalvar_fops的初始化方法并不是標準C所支持的,屬于GNU擴展語法。

  完整的globalvar.c文件源代碼如下:

#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
MODULE_LICENSE("GPL");

#define MAJOR_NUM 254 //主設備號

static ssize_t globalvar_read(struct file *, char *, size_t, loff_t*);
static ssize_t globalvar_write(struct file *, const char *, size_t, loff_t*);

//初始化字符設備驅(qū)動的file_operations結(jié)構(gòu)體
struct file_operations globalvar_fops =
{
 read: globalvar_read, write: globalvar_write,
};
static int global_var = 0; //"globalvar"設備的全局變量

static int __init globalvar_init(void)
{
 int ret;

 //注冊設備驅(qū)動
 ret = register_chrdev(MAJOR_NUM, "globalvar", &globalvar_fops);
 if (ret)
 {
  printk("globalvar register failure");
 }
 else
 {
  printk("globalvar register success");
 }
 return ret;
}

static void __exit globalvar_exit(void)
{
 int ret;

 //注銷設備驅(qū)動
 ret = unregister_chrdev(MAJOR_NUM, "globalvar");
 if (ret)
 {
  printk("globalvar unregister failure");
 }
 else
 {
  printk("globalvar unregister success");
 }
}

static ssize_t globalvar_read(struct file *filp, char *buf, size_t len, loff_t *off)
{
 //將global_var從內(nèi)核空間復制到用戶空間
 if (copy_to_user(buf, &global_var, sizeof(int)))
 {
  return - EFAULT;
 }
 return sizeof(int);
}

static ssize_t globalvar_write(struct file *filp, const char *buf, size_t len, loff_t *off)
{
 //將用戶空間的數(shù)據(jù)復制到內(nèi)核空間的global_var
 if (copy_from_user(&global_var, buf, sizeof(int)))
 {
  return - EFAULT;
 }
 return sizeof(int);
}

module_init(globalvar_init);
module_exit(globalvar_exit);

  運行:

gcc -D__KERNEL__ -DMODULE -DLINUX -I /usr/local/src/linux2.4/include -c -o globalvar.o globalvar.c

  編譯代碼,運行:

inmod globalvar.o

  加載globalvar模塊,再運行:

cat /proc/devices

  發(fā)現(xiàn)其中多出了"254 globalvar"一行,如下圖:


  接著我們可以運行:

mknod /dev/globalvar c 254 0

  創(chuàng)建設備節(jié)點,用戶進程通過/dev/globalvar這個路徑就可以訪問到這個全局變量虛擬設備了。我們寫一個用戶態(tài)的程序globalvartest.c來驗證上述設備:

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
main()
{
 int fd, num;
 //打開"/dev/globalvar"
 fd = open("/dev/globalvar", O_RDWR, S_IRUSR | S_IWUSR);
 if (fd != -1 )
 {
  //初次讀globalvar
  read(fd, &num, sizeof(int));
  printf("The globalvar is %d\n", num);

  //寫globalvar
  printf("Please input the num written to globalvar\n");
  scanf("%d", &num);
  write(fd, &num, sizeof(int));

  //再次讀globalvar
  read(fd, &num, sizeof(int));
  printf("The globalvar is %d\n", num);

  //關(guān)閉"/dev/globalvar"
  close(fd);
 }
 else
 {
  printf("Device open failure\n");
 }
}

  編譯上述文件:

gcc -o globalvartest.o globalvartest.c

  運行

./globalvartest.o

  可以發(fā)現(xiàn)"globalvar"設備可以正確的讀寫。
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
字符驅(qū)動學習
4.Linux設備驅(qū)動編程之阻塞與非阻塞
linux內(nèi)核中,對于字符設備/塊設備/總線/設備/驅(qū)動等概念,如何正確理解?
在S3C6410開發(fā)板上的LED驅(qū)動程序
linux驅(qū)動開發(fā)第1講:帶你編寫一個最簡單的字符設備驅(qū)動
詳解C語言二級指針三種內(nèi)存模型
更多類似文章 >>
生活服務
分享 收藏 導長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服