当前位置: 首页 > news >正文

网站建设搭建步骤买房在线咨询

网站建设搭建步骤,买房在线咨询,做娱乐网站被坑,湖南禹班建设集团网站若该文为原创文章#xff0c;转载请注明原文出处 本文章博客地址#xff1a;https://hpzwl.blog.csdn.net/article/details/134561660 红胖子网络科技博文大全#xff1a;开发技术集合#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…若该文为原创文章转载请注明原文出处 本文章博客地址https://hpzwl.blog.csdn.net/article/details/134561660 红胖子网络科技博文大全开发技术集合包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等持续更新中… Linux系统移植和驱动开发专栏 上一篇《Linux驱动开发笔记四设备驱动介绍、熟悉杂项设备驱动和ubuntu开发杂项设备Demo》 下一篇敬请期待… 前言 驱动写好后用户层使用系统函数调用操作相关驱动从而实现与系统内核的关联本篇主要就是理解清楚驱动如何让用户编程来实现与内核的交互。 杂项设备文件操作集 cd /usr/src/linux-headers-4.18.0-15 vi include/linux/fs.h搜索到vi则直接使用“/”:    struct file_operations {struct module *owner;loff_t (*llseek) (struct file *, loff_t, int);ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);ssize_t (*read_iter) (struct kiocb *, struct iov_iter *);ssize_t (*write_iter) (struct kiocb *, struct iov_iter *);int (*iterate) (struct file *, struct dir_context *);int (*iterate_shared) (struct file *, struct dir_context *);__poll_t (*poll) (struct file *, struct poll_table_struct *);long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);long (*compat_ioctl) (struct file *, unsigned int, unsigned long);int (*mmap) (struct file *, struct vm_area_struct *);unsigned long mmap_supported_flags;int (*open) (struct inode *, struct file *);int (*flush) (struct file *, fl_owner_t id);int (*release) (struct inode *, struct file *);int (*fsync) (struct file *, loff_t, loff_t, int datasync);int (*fasync) (int, struct file *, int);int (*lock) (struct file *, int, struct file_lock *);ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);int (*check_flags)(int);int (*setfl)(struct file *, unsigned long);int (*flock) (struct file *, int, struct file_lock *);ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);ssize_t (*copy_file_range)(struct file *, loff_t, struct file *,loff_t, size_t, unsigned int);int (*setlease)(struct file *, long, struct file_lock **, void **);long (*fallocate)(struct file *file, int mode, loff_t offset,loff_t len);void (*show_fdinfo)(struct seq_file *m, struct file *f); #ifndef CONFIG_MMUunsigned (*mmap_capabilities)(struct file *); #endifint (*clone_file_range)(struct file *, loff_t, struct file *, loff_t,u64);ssize_t (*dedupe_file_range)(struct file *, u64, u64, struct file *,u64); } __randomize_layout;例如read函数那么就是打开驱动使用系统read打开这个设备驱动的句柄那么就会调用read函数其他的以此类推还比较好理解。 Linux文件操作集的意义 概述 Linux一切都是文件都有对应的打开、关闭和读写等相关操作而这些操作都是使用打开文件后的句柄来表示那么函数再根据句柄的类型如打开的是杂项设备驱动就会去调用杂项设备操作文件字符集里面对应的函数来执行操作了。   在编程的时候会使用open打开一个设备节点可以是文件打开可以打开设备这时候返回得到设备节点句柄标识fd失败是-1然后使用fd去read、write等各种操作则会相当于调用这个设备驱动里面文件操作集的read、write。   下面是常用的文件操作。 open函数实现测试 int (*open) (struct inode *, struct file *); read函数实现测试 ssize_t (*read) (struct file *, char __user *, size_t, loff_t *) write函数实现测试 ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); poll/select函数本篇没写 __poll_t (*poll) (struct file *, struct poll_table_struct *); ioctl函数本篇没写 long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); close函数实现测试 int (*release) (struct inode *, struct file *); 驱动模板准备 首先复制之前的registerMiscDev的驱动改个名字为testFileOpts cd ~/work/drive cp -arf registerMiscDev testFileOpts cd testFileOpts make clean mv registerMiscDev testFileOpts.c然后修改makefile里面的obj-m模块名称改下模板准备好了 gedit Makefile 下面基于testFileOpts.c文件进行注册杂项设备修改.c文件 gedit testFileOpts.c#include linux/init.h #include linux/module.h#include linux/miscdevice.h #include linux/fs.hstruct file_operations misc_fops {.owner THIS_MODULE, };struct miscdevice misc_dev {.minor MISC_DYNAMIC_MINOR, // 这个宏是动态分配次设备号避免冲突.name register_hongPangZi_testFileOpt, // 设备节点名称.fops misc_fops, // 这个变量记住自己起的步骤二使用 };static int registerMiscDev_init(void) { int ret;// 在内核里面无法使用基础c库printf需要使用内核库printkprintk(Hello, I’m hongPangZi, registerMiscDev_init\n); ret misc_register(misc_dev);if(ret 0){printk(Failed to misc_register(misc_dev)\n); return -1;} return 0; }static void registerMiscDev_exit(void) {misc_deregister(misc_dev);printk(bye-bye!!!\n); }MODULE_LICENSE(GPL);module_init(registerMiscDev_init); module_exit(registerMiscDev_exit);杂项设备添加常用操作集open函数Demo 注意要是调用的函数没有写则不会报错也不会有其他操作反应所以并不是所有函数都是必须写的。 步骤一实现open函数 // int (*open) (struct inode *, struct file *); int misc_open(struct inode * pInode, struct file * pFile) {printk(int misc_open(struct inode * pInode, struct file * pFile));return 0; }步骤二关键赋值到文件操作集指针 步骤三编译加载驱动 先编译试试    然后加载驱动 sudo insmod tesFileOpts.ko这时候设备节点注册成功了。 步骤四在程序中调用打开设备节点open 本步骤是c语言编程使用linux系统函数打开设备节点   新建文件 vi test.c输入代码 #include stdio.h #include unistd.h #include fcntl.hint main(int argc, char **argv) {int fd;const char devPath[] /dev/register_hongPangZi_testFileOpt;fd open(devPath, O_RDWR);if(fd 0){printf(fialed to open %s\n, devPath);return -1;} else{printf(Succeed to open %s\n, devPath);}return 0; }编译 gcc test.c默认输出就是a.out下面运行一下    无法运行是因为ubuntu对设备需要管理员权限管理员权限运行    查看内核打印输出这里出现没有打印输出查看“入坑一”    至此从用户编程层如何对设备结点然后调用到内核层函数就基本清楚了。 补充其他函数Demo 补充read、write #include linux/init.h #include linux/module.h#include linux/miscdevice.h #include linux/fs.h// int (*open) (struct inode *, struct file *); int misc_open(struct inode * pInode, struct file * pFile) {printk(int misc_open(struct inode * pInode, struct file * pFile\n));return 0; }// int (*release) (struct inode *, struct file *); int misc_release(struct inode * pInde, struct file * pFile) {printk(int misc_release(struct inode * pInde, struct file * pFile\n));return 0; }// ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); ssize_t misc_read(struct file * pFile, char __user * pUser, size_t size, loff_t *pLofft) {printk(ssize_t misc_read(struct file * pFile, char __user * pUser, size_t size, loff_t *pLofft)\n);return 0; }// ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); ssize_t misc_write(struct file * pFile, const char __user * pUser, size_t size, loff_t *pLofft) {printk(ssize_t misc_write(struct file * pFile, const char __user * pUser, size_t size, loff_t *pLofft)\n);return 0; }struct file_operations misc_fops {.owner THIS_MODULE,.open misc_open,.release misc_release,.read misc_read,.write misc_write, };struct miscdevice misc_dev {.minor MISC_DYNAMIC_MINOR, // 这个宏是动态分配次设备号避免冲突.name register_hongPangZi_testFileOpt, // 设备节点名称.fops misc_fops, // 这个变量记住自己起的步骤二使用 };static int registerMiscDev_init(void) { int ret;// 在内核里面无法使用基础c库printf需要使用内核库printkprintk(Hello, I’m hongPangZi, registerMiscDev_init\n); ret misc_register(misc_dev);if(ret 0){printk(Failed to misc_register(misc_dev)\n); return -1;} return 0; }static void registerMiscDev_exit(void) {misc_deregister(misc_dev);printk(bye-bye!!!\n); }MODULE_LICENSE(GPL); module_init(registerMiscDev_init); module_exit(registerMiscDev_exit);修改test.c测试驱动源码 #include stdio.h #include unistd.h #include fcntl.hint main(int argc, char **argv) {int fd;char buf[32] {0};const char devPath[] /dev/register_hongPangZi_testFileOpt;fd open(devPath, O_RDWR);if(fd 0){printf(Failed to open %s\n, devPath);return -1;}else{printf(Succeed to open %s\n, devPath);}read(fd, buf, sizeof(buf));write(fd, buf, sizeof(buf));close(fd);printf(exit\n);fd -1;return 0; }查看输出 入坑 入坑一内核未打印open函数 问题 程序打开设别节点未打印open函数 原因 打开函数没有赋值给文件操作集。 解决 入坑二dmesg少了close的release打印 问题 测试 研究了dmesg就是没出来这个不清楚了后来问了驱动大佬提醒是可能是换行的问题后加上可以了。 解决方法 上一篇《Linux驱动开发笔记四设备驱动介绍、熟悉杂项设备驱动和ubuntu开发杂项设备Demo》 下一篇敬请期待… 本文章博客地址https://hpzwl.blog.csdn.net/article/details/134561660
http://www.zqtcl.cn/news/106426/

相关文章:

  • 新吴区住房和建设交通局网站小程序商城哪家好排行榜
  • 中小学网站建站模板长春火车站咨询电话
  • c2c网站特点公司网站建设亚运村
  • 邢台wap网站建设费用黑帽seo之搜索引擎
  • 如何用阿里云做网站刷题网站怎么做
  • 织梦制作手机网站上海猎头公司名单
  • 免费生成图片的网站wordpress 购物
  • 江西建设部网站国际新闻最新消息今天2023
  • 怎么做网站啊wordpress英文显示改中文
  • 建筑专业网站有哪些网站标题seo外包优化
  • 浙江建设厅网站施工员报名中国建设协会官网站
  • 网站建设优化是干嘛上海今天最新的新闻
  • 网站大全浏览器软文的概念
  • 盐山做网站价格莱芜征婚吧
  • 具有品牌的微网站建设网站设计培训班前台
  • 网站推广工具推荐html网站地图在线生成
  • 成都本地网站建设青岛电子商务的网站建设
  • 北京网站开发培训河南省百城建设提质工程网站
  • 郑州专业建网站南通网站建设技术支持
  • 简约网站程序网络营销方式较为单一
  • 绍兴企业自助建站123房产网
  • 科技类网站设计特点备案 网站首页地址
  • 做兼职网站网站建设培训速成
  • 开源的网站管理系统商务网站设计与建设实训
  • 东莞三合一网站制作江阴做网站的公司有
  • mvc5 网站开发之學 pdf百度搜索引擎首页
  • 手机进入网站自动识别城阳区规划建设局网站
  • 网站开发平台的公司订票网站开发公司
  • 郑州网站推广信息网架结构厂家
  • 提升网站流量的方法汕头站扩建