网上开店的基本流程有哪些河池网站seo

news/2025/9/23 14:00:46/文章来源:
网上开店的基本流程有哪些,河池网站seo,彩票网站搭建多钱,枣阳市建设局网站目录 前言 驱动入门知识 1.APP 打开的文件在内核中如何表示 2.打开字符设备节点时#xff0c;内核中也有对应的 struct file 编写 Hello 驱动程序步骤 1.流程介绍 2.驱动代码#xff1a; 3.应用层代码#xff1a; 4.本驱动程序的 Makefile 内容#xff1a; 5.上机…目录 前言 驱动入门知识 1.APP 打开的文件在内核中如何表示 2.打开字符设备节点时内核中也有对应的 struct file 编写 Hello 驱动程序步骤 1.流程介绍 2.驱动代码 3.应用层代码 4.本驱动程序的 Makefile 内容 5.上机实验 前言 在编译驱动程序之前要先编译内核原因有三点 驱动程序要用到内核文件编译驱动时用的内核、开发板上运行到内核要一致更换板子上的内核后板子上的其他驱动也要更换 编译内核步骤看我之前写过的文章编译替换内核_设备树_驱动_IMX6ULL-CSDN博客 驱动入门知识 1.首先我们通常都是在Linux的终端上打开一个可执行文件然后可执行文件就会执行程序。那么这个可执行文件做了什么呢 2.可执行文件先是在应用层读取程序其中会有很多库函数库函数是属于内核之中。而内核又会往下调用驱动层程序。最终驱动层控制具体硬件。 其实应用程序到库是比较容易理解的比如我们刚学习C语言的时候使用了printfscanf等等这些函数。而这些函数就在库中。库可以和系统内核相连接具体怎么实现的我也不太清楚。我们写了一个驱动程序就需要告诉内核这个过程叫做注册。我们注册了驱动之后内核里面就会有这个驱动程序的信息然后上层应用就可以调用。 3.所以我们只需要知道咱们需要编写两个程序一个是驱动层的一个是应用层的最后驱动层需要注册进入内核应用层才能够使用。其他的先不要管。 4.我们在应用层调用read函数对应驱动层的read函数。write函数和write函数对应。open函数和open函数对应。close函数和release函数对应这个为什么不一样我也不清楚。 5.我们对Linux 应用程序对驱动程序的调用流程有一个简单了解之后我得知道整个程序编写流程应该怎么做。至于流程为什么是这样的我们记住即可。因为这些都是人规定的如果之后学的深了再进行深究也不迟现在我们主要是入门      1.APP 打开的文件在内核中如何表示 APP 打开文件时可以得到一个整数这个整数被称为文件句柄。对于 APP 的每一个文件句柄在内核里面都有一个“struct file”与之对应。 我们使用 open 打开文件时传入的 flags、mode 等参数会被记录在内核中对应的 struct file 结构体里(f_flags、f_mode) int open(const char *pathname, int flags, mode_t mode); 去读写文件时文件的当前偏移地址也会保存在 struct file 结构体的 f_pos 成员里。 2.打开字符设备节点时内核中也有对应的 struct file 注意这个结构体中的结构体struct file_operations *f_op这是由驱动程序提供的。 结构体 struct file_operations 的定义如下 编写 Hello 驱动程序步骤 主要为一下七个步骤 确定主设备号也可以让内核分配定义自己的 file_operations 结构体实现对应的 drv_open/drv read/drv write 等函数填入 file operations 结构体把 file_operations 结构体告诉内核: register_chrdev谁来注册驱动程序啊? 得有一个入口函数:安装驱动程序时就会去调用这个入口函数有入口函数就应该有出口函数: 卸载驱动程序时出口函数调用unregister_chrdev其他完善:提供设备信息自动创建设备节点: class_create,device_create 1.流程介绍 1我们首先需要编写一个file_operations类型的结构体这个结构体用于管理驱动程序。之后我们将驱动程序注册进入内核之后我们在应用层调用这个驱动那么就可以直接通过这个结构体来操作驱动中的openwriteread等函数。 2实现对应的 drv_open/drv_read/drv_write 等函数填入 file_operations 结构体。这样我们在应用层调用openwriteread等函数就是调用这个驱动了。 这个时候有人可能会问了有这么多个驱动我怎么知道open对应的是哪一个驱动很简单咱们在写应用层程序的时候是不是第一个参数是需要传入一个设备号。系统根据这个设备号来判断是调用的哪一个驱动。 3把 file_operations 结构体告诉内核 register_chrdev。我们写了一个驱动但是内核是不知道的。那么怎么办呢我们就去注册他内核就明白有了这个驱动然后给他分配一个设备号。之后应用层就可以根据这个设备号来调用驱动层了。 4 这个时候有人就有疑问了谁来注册这个结构体于是我们需要一个入口函数来进行注册安装驱动程序时就会去调用这个入口函数。 5有入口函数就应该有出口函数卸载驱动程序时出口函数调用unregister_chrdev。 6最后需要加入GPL协议。因为Linux是遵顼GPL协议的所以你如果需要使用Linux其他的驱动层函数就必须遵顼GPL协议强制要求开源代码。根据这个协议你可以要求所有使用Linux的厂商提供驱动层源代码同时别人也可以要求你公开你的驱动层代码这个是相互的。不过很多厂商为了规避这个协议驱动源代码很简单复杂的东西放在应用层。至于还有一个作者名字的添加随便写不写。                            2.驱动代码 hello_drv.c #include linux/module.h#include linux/fs.h #include linux/errno.h #include linux/miscdevice.h #include linux/kernel.h #include linux/major.h #include linux/mutex.h #include linux/proc_fs.h #include linux/seq_file.h #include linux/stat.h #include linux/init.h #include linux/device.h #include linux/tty.h #include linux/kmod.h #include linux/gfp.h/* 1. 确定主设备号 */ static int major 0; static char kernel_buf[1024]; static struct class *hello_class;#define MIN(a, b) (a b ? a : b)/* 3. 实现对应的open/read/write等函数填入file_operations结构体 */ static ssize_t hello_drv_read (struct file *file, char __user *buf, size_t size, loff_t *offset) {int err;printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);err copy_to_user(buf, kernel_buf, MIN(1024, size));return MIN(1024, size); }static ssize_t hello_drv_write (struct file *file, const char __user *buf, size_t size, loff_t *offset) {int err;printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);err copy_from_user(kernel_buf, buf, MIN(1024, size));return MIN(1024, size); }static int hello_drv_open (struct inode *node, struct file *file) {printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);return 0; }static int hello_drv_close (struct inode *node, struct file *file) {printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);return 0; }/* 2. 定义自己的file_operations结构体 */ static struct file_operations hello_drv {.owner THIS_MODULE,.open hello_drv_open,.read hello_drv_read,.write hello_drv_write,.release hello_drv_close, };/* 4. 把file_operations结构体告诉内核注册驱动程序 */ /* 5. 谁来注册驱动程序啊得有一个入口函数安装驱动程序时就会去调用这个入口函数 */ static int __init hello_init(void) {int err;printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);major register_chrdev(0, hello, hello_drv); /* /dev/hello */hello_class class_create(THIS_MODULE, hello_class);err PTR_ERR(hello_class);if (IS_ERR(hello_class)) {printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);unregister_chrdev(major, hello);return -1;}device_create(hello_class, NULL, MKDEV(major, 0), NULL, hello); /* /dev/hello */return 0; }/* 6. 有入口函数就应该有出口函数卸载驱动程序时就会去调用这个出口函数 */ static void __exit hello_exit(void) {printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);device_destroy(hello_class, MKDEV(major, 0));class_destroy(hello_class);unregister_chrdev(major, hello); }/* 7. 其他完善提供设备信息自动创建设备节点 */module_init(hello_init); module_exit(hello_exit);MODULE_LICENSE(GPL); 3.应用层代码 hello_drv_test.c #include sys/types.h #include sys/stat.h #include fcntl.h #include unistd.h #include stdio.h #include string.h/** ./hello_drv_test -w abc* ./hello_drv_test -r*/ int main(int argc, char **argv) {int fd;char buf[1024];int len;/* 1. 判断参数 */if (argc 2) {printf(Usage: %s -w string\n, argv[0]);printf( %s -r\n, argv[0]);return -1;}/* 2. 打开文件 */fd open(/dev/hello, O_RDWR);if (fd -1){printf(can not open file /dev/hello\n);return -1;}/* 3. 写文件或读文件 */if ((0 strcmp(argv[1], -w)) (argc 3)){len strlen(argv[2]) 1;len len 1024 ? len : 1024;write(fd, argv[2], len);}else{len read(fd, buf, 1024); buf[1023] \0;printf(APP read : %s\n, buf);}close(fd);return 0; } 怎么把.c 文件编译为驱动程序.ko 这要借助内核的顶层 Makefile先设置好交叉编译工具链编译好你的板子所用的内核然后修改 Makefile 指定内核源码路径最后即可执行 make 命令编译驱动程序和测试程序。 4.本驱动程序的 Makefile 内容 KERN_DIR /home/book/100ask_imx6ull-sdk/Linux-4.9.88all:make -C $(KERN_DIR) Mpwd modules$(CROSS_COMPILE)gcc -o hello_drv_test hello_drv_test.cclean:make -C $(KERN_DIR) Mpwd modules cleanrm -rf modules.orderrm -f hello_drv_testobj-m hello_drv.o5.上机实验 执行 make 命令编译驱动程序和测试程序 启动单板后可以通过 NFS 挂载 Ubuntu 的某个目录访问该目录中的程序。 打开内核打印echo 7 4 1 7 /proc/sys/kernel/printk 关闭内核打印echo 0       4       0      7   /proc/sys/kernel/printk insmod 就是install module的缩写载入模块 insmod hello_drv.ko装载驱动 ls /dev/hello -l // 驱动程序会生成设备节点 驱动程序会生成设备节点 lsmod 确认驱动已经安装 我们知道驱动已经安装好了那么我们需要知道这个驱动的设备号 cat /proc/devices查看当前已经被使用掉的设备号 驱动名字与我们在驱动层使用register_chrdev函数的第二个参数有关 ./hello_drv_test // 查看测试程序的用法 ./hello_drv_test -w zglnb // 往驱动程序中写入字符串 ./hello_drv_test -r // 从驱动程序中读出字符串

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/912765.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

主机开通成功网站建设中怎么把网站上传到域名

前言 数据结构_空间复杂度_时间复杂度讲解_常见复杂度对比 本文介绍数据结构中的时间复杂度和空间复杂度 ***文章末尾,博主进行了概要总结,可以直接看总结部分*** 博主博客链接:https://blog.csdn.net/m0_74014525 点点关注,后期…

PyTorch和cude版本不兼容导致无法检测到GPU

具体问题如下: 环境:windows 11 + conda pytorch 已经安装,但 cude 不可用,可用gpu数量为0 使用whisper时提示错误信息: ... ... AssertionError: Torch not compiled with CUDA enabled原因: gpu驱动程序支持py…

MySQL练习题 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

做网站是数据库应该放在哪里域名怎么制作网站

— ◆ 小 乔 锦 囊 ◆ —近期,小乔收到玩家宝宝们的提问:在客服专区中进行角色或仓库密码的清除时,会收到登录验证失败的提示,应该怎么办?辛苦玩家宝宝们的热心反馈!该问题目前已在紧急修复中。同时&#x…

网站优化案例分析淮北网络推广

什么是人工智能客户体验? 人工智能客户体验是指使用人工智能技术(如机器学习、聊天机器人和对话式用户体验)使每个接触点尽可能高效且无障碍的实践。本质上,客服代表得到了一个虚拟助手帮助他们完成重复性任务。这意味着对于有简…

网站备案地址高层网络架构

现在市场上代记账公司也不算少,做过这行的都知道,最初呢行业竞争不强,都是靠地推、老客户转介绍,或者长期以往的蹲守各个地区的工商注册服务中心,找那些才注册企业的老板或者创业者。但是,随着市场经济的发…

做网页引用别的网站的视频设计有什么网站推荐

Android社交类APP动态详情代码实现通用模板 Android平台上一些比较流行的社交类APP比如微信、陌陌等,都有动态详情页,在该页面,用户发表的动态详情,好友可以发起评论、点赞等等。这种设计在微信和陌陌上大…

陕西网络开发公司网站wordpress添加上一篇下一页

【Unity】对象池技术 1.简介 对象池(Object Pooling)技术是一种用于优化游戏性能和内存管理的技术。 对象池可以用于各种需要频繁实例化和销毁游戏对象的场景,例如子弹、敌人、玩家等。其主要目标是减少频繁的内存分配和垃圾回收的次数&…

如何在分类信息网站做推广上传wordpress后

在系统运行中输入: sqlplus /nolog 在命令窗口分别执行: conn /as sysdbaalter user scott identified by tiger;alter user scott account unlock; 这样就把“scott”用户密码修改为“tiger”了,用户可根据自己需求,重置密码。

做外贸的几个网站东软网站建设方案

目录 1. 背景... 3 2. 泊车模块架构图... 4 3. 泊车规划模块信号... 5 3.1 输入信号... 5 3.2 输出信号... 5 4. 模块预处理... 6 4.1 坐标系转换... 6 4.2 车库及轨迹处理策略... 7 5. 泊车规划模块算法设计... 8 5.1 泊入规划模块... 8 5.1.1 泊入…

基于jsp网站开发开题报告江苏宿迁租房网

年后跳槽须知自己签订的合同中是否存在竞业协议,谨防协议造成经济损失 🐓 什么是竞业协议 竞业协议时用于保护自己的权益,在员工离职时决定是否启动的一种协议,避免一些掌握公司机密的一些重要岗位人才流入竞争对手的公司&#xf…

嵌入式系统arm高级系统调试技能-24./proc/slabinfo 记录解读与内存异常分析

嵌入式系统arm高级系统调试技能-24./proc/slabinfo 记录解读与内存异常分析pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-famil…

2025无人机在低空物流中的应用实践

一、爆发背景:政策东风与需求共振2025年被业界称为“低空物流元年”。政策层面,国家持续开放低空空域试点,推动基础设施标准化建设;市场层面,电商时效竞争、偏远地区配送痛点、应急物流需求激增,共同催生无人机物…

外贸先做网站还是开公司杭州电子商务网站建设公司

HKEY_CURRENT_USER\Software\Microsoft\Microsoft SQL Server\80\Tools\SQLEW\Registered Servers X\SQL Server 组 删除你那个注册名 转载于:https://www.cnblogs.com/DonePuzzle/archive/2008/04/01/1163731.html

怎样才能建设一歌网站无锡制作网站

目录 一、数字孪生技术的兴起与定义 二、数字孪生技术在智慧城市构建中的应用 1、城市规划与管理 2、智慧交通 3、智慧能源 4、智慧环保 三、数字孪生技术助力智慧城市构建的挑战与对策 四、结语 随着科技的飞速发展,未来城市正在经历一场前所未有的变革。数…

快速搭建网站demo视频直播怎么赚钱的

GPS北斗卫星时空信号安全防护装置(授时)介绍 GPS北斗卫星时空信号安全防护装置(授时)介绍 当前,我国电力系统普遍采用北斗卫星或者GPS卫星授时来实现时间同步,但不加防护的授时装置存在卫星信号被干扰或欺…

法库综合网站建设方案网站开发广告怎么写

给定一个数字字符串 S&#xff0c;比如 S “123456579”&#xff0c;我们可以将它分成斐波那契式的序列 [123, 456, 579]。 形式上&#xff0c;斐波那契式序列是一个非负整数列表 F&#xff0c;且满足&#xff1a; 0 < F[i] < 2^31 - 1&#xff0c;&#xff08;也就是…

旅行社网站建设规划书论文做h5页面的网站

Keepalived 一.VRRP 协议介绍 1.1 VRRP Intro 一个问题 在计算机网络中&#xff0c;交换机的一个功能是充当 LAN 网络上的主机到 WAN 的网关。 在规模比较大的 LAN 中&#xff0c;可能需要两个或多个交换机来充当网关&#xff0c;其中的主机 使用动态路由协议(如 RIP 或 OSP…

南阳网站推广优秀学习网站

QT 工程引入 QtXml QT 版本 6.6.1 Visual Studio 版本 Microsoft Visual Studio Community 2022 (64 位) - Current 版本 17.7.5 打开 Visual Studio 项目工程选择 工具栏 - 扩展 - QT VS Tools -Qt Project Settings 勾选 xml 后点击确定 点击应用即可 注意&#xff1a;配置环…

可以转app的网站怎么做的天津市北辰区建设与管理局网站

小编典典碰巧的是不久前我写了一个BigFraction类&#xff0c;用于解决Euler项目问题。它保留了BigInteger分子和分母&#xff0c;因此它将永远不会溢出。但是&#xff0c;对于许多你永远不会溢出的操作来说&#xff0c;这会有点慢。无论如何&#xff0c;请根据需要使用它。我一…