范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

proc文件系统详解(附代码实例)

  1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。私信回复1024,即可免费获取!前言
  上一篇: 文件系统有很多,但这几个最为重要  介绍了procfs(进程文件系统的缩写),包含一个伪文件系统(启动时动态生成的文件系统),用于通过内核访问进程信息。这个文件系统通常被挂载到 /proc 目录, /proc中不仅仅放了进程相关信息,也存放着很多系统相关的信息。
  这些信息都是内核开放给用户的,/proc 就是用户与内核直接交互的一个入口。从内核的角度看,内核是通过怎么样的方式把这些信息暴露给用户呢?这篇笔记我们来学习一下: 内核创建proc节点的例子
  我们先来看一个例子(Linux-4.9.88fsproccpuinfo.c):
  这就是创建/proc下cpuinfo这个节点的相关代码,有了cpuinfo节点,我们就可以通过访问这个节点来得到cpu的一些信息:
  从以上代码中,我们可以看到,其用proc_create这个函数来创造相关节点的,这个函数是一个内联函数,存放在Linux-4.9.88includelinuxproc_fs.h下: static inline struct proc_dir_entry *proc_create(     const char *name, umode_t mode, struct proc_dir_entry *parent,     const struct file_operations *proc_fops) {     return proc_create_data(name, mode, parent, proc_fops, NULL); }
  知识点:什么是内联函数? 内联函数简单来说就是编译器将指定的函数体插入并取代每一处调用该函数的地方上下文,从而节省了每次调用函数带来的额外时间开支。
  一般用于能够快速执行的函数,因为在这种情况下函数调用的时间消耗显得更为突出。这种方法对于很小的函数也有空间上的益处,并且它也使得一些其他的优化成为可能。
  这么一看,似乎与宏有点相似?与宏有何不同?
  宏调用并不执行类型检查,甚至连正常参数也不检查,但是函数调用却要检查。
  C语言的宏使用的是文本替换,可能导致无法预料的后果,因为需要重新计算参数和操作顺序。
  在宏中的编译错误很难发现,因为它们引用的是扩展的代码,而不是程序员键入的。
  许多结构体使用宏或者使用不同的语法来表达很难理解。内联函数使用与普通函数相同的语言,可以随意的内联和不内联。
  内联代码的调试信息通常比扩展的宏代码更有用。
  以上介绍摘选自百度百科,关于内联更详细的介绍可自行查阅。
  接着上面,proc_create函数有四个参数,分别为: name:要创建的文件名。
  mode:文件的访问权限。
  parent:父文件夹的proc_dir_entry指针。
  proc_fops:改文件的操作函数。
  看到这个函数,有没有感到很熟悉?我们在学习驱动基础的时候,有用到了device_create函数来创建节点:
  device_create创建的设备节点存放于/dev目录下,而proc_create函数创建的与系统信息相关的节点存放于/proc目录下。既然它们这么相似,下面我们就模仿编写驱动的方式来编写我们关于proc的测试代码。 proc实践
  我们模仿字符设备驱动的编写方式,来编写基于proc的"驱动"。首先需要创建一个文件操作结构体hello_proc_operations,创建一些hello_proc_open、hello_proc_close、hello_proc_read、hello_proc_write填到这个操作表里: /* 微信公众号:嵌入式大杂烩 */ #include  #include  #include  #include  #include   static char kernel_buf[1024];  #define MIN(a, b) (a < b ? a : b)  static int hello_proc_open(struct inode *node, struct file *file) {     printk("%s %s line %d ", __FILE__, __FUNCTION__, __LINE__);     return 0; }  static ssize_t hello_proc_read(struct file *file, char __user *buf, size_t size, loff_t *offset) {     int err;     printk("%s %s line %d ", __FILE__, __FUNCTION__, __LINE__);     err = copy_to_user(buf, kernel_buf, MIN(1024, size));     return MIN(1024, size); }  static ssize_t hello_proc_write(struct file *file, const char __user *buf, size_t size, loff_t *offset) {     int err;     printk("%s %s line %d ", __FILE__, __FUNCTION__, __LINE__);     err = copy_from_user(kernel_buf, buf, MIN(1024, size));     return MIN(1024, size); }  static int hello_proc_close(struct inode *node, struct file *file) {     printk("%s %s line %d ", __FILE__, __FUNCTION__, __LINE__);     return 0; }  static const struct file_operations hello_proc_operations =  {     .owner   = THIS_MODULE,     .open    = hello_proc_open,     .read    = hello_proc_read,     .write   = hello_proc_write,     .release = hello_proc_close, };  static int __init hello_proc_init(void) {     proc_create("hello_proc", 0, NULL, &hello_proc_operations);     return 0; }  static void __exit hello_proc_exit(void) {     remove_proc_entry("hello_proc", NULL); }  module_init(hello_proc_init); module_exit(hello_proc_exit); MODULE_DESCRIPTION("proc test"); MODULE_LICENSE("GPL");
  最上边的那个例子中用了一个fs_initcall宏,这与module_init的底层是差不多相同的(有宏参数不一样): ① module_init -> _initcall -> device_initcall -> _define_initcall
  ② fs_initcall-> _define_initcall
  为了方便,我们直接用module_init 。
  Makefile文件: KERN_DIR = /home/book/100ask_imx6ull-sdk/Linux-4.9.88  #  -C 表示将当前的工作目录切换到指定目录中,M 表示模块源码目录, modules 表示编译模块 all:     make -C $(KERN_DIR) M=`pwd` modules   clean:     make -C $(KERN_DIR) M=`pwd` modules clean     rm -rf modules.order  # obj-m 表示将 proc_test.c 这个文件编译为 proc_test.ko 模块 obj-m   += proc_test.o
  编译:
  传到板子里测试:
  可以看到,我们已经成功地在proc中留下了一个hello_proc小脚印。可以看到,我们创建的基于/proc下的"驱动"与创建基于/dev下的真实的设备驱动的思路及套路是很相似的。这些都是属于内核的范畴,都是属于内核的东西,内核把想给我们能直接使用的东西(文件)都放于/proc、/dev等目录下,我们在应用端就可以很方便地访问这些文件开发我们的应用。 猜你喜欢:
  静态链接与动态链接(Linux)
  Linux驱动基础篇:hello驱动
  「Linux」简单认识认识ELF文件
  如何查看Linux命令工具的源码?
  Linux下应用开发基础知识大总结
  Linux总线设备驱动模型
  1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。私信回复 1024,即可免费获取!

两只耳朵听力都是60多,可以只配一只助听器两边换着戴吗?最好双面配着!好的开端!双耳听力都下降,戴两个的好处比戴一个要多。在认识到双侧助听的必要性与重要性之后,研究与实践证明,与单侧配戴助听器相比,双侧有明显的优势。只要条件允许,一定要GalaxyS22Ultra官方上手视频流出在临近三星GalaxyUnpacked2022活动开始前,官方放出了GalaxyS22和GalaxyTabS8Ultra的上手视频,下面视频为GalaxyS22系列的上手视频,展示2022年手机需求手机需求1400050002顶级摄像表现主广角人像潜长3快充4屏下指纹5至少122566小米系列7等等万岁参考条件1合理外观2高刷3直屏参考目标米12P米11UK50UMIX5米1人民冰雪冰雪科技谈氢能客车助力冬奥会实现绿色零碳出行来源人民网原创稿氢气被认为是清洁多能的能源载体,在人类可持续发展能源体系中占据着重要位置。据了解,清华大学领衔的国家重点研发计划科技冬奥重点专项氢能出行关键技术研发和应用示范科研项偷师特斯拉?沃尔沃将投资逾10亿美元导入一体铸造工艺未来或引入中国工厂财联社(北京,记者徐昊)讯,铝合金一体铸造工艺CTC电池技术高度集成化电气化的生产线这些由特斯拉率先落地于其超级工厂的创新性应用,似乎将成为智能电动时代生产制造领域的主流。2月8日比亚迪汽车品牌发布全新主张科技绿色明天红网时刻2月9日讯(记者周宇广)春节刚过,比亚迪汽车品牌就发布了全新主张科技绿色明天。全新的品牌主张体现了比亚迪在新能源的发展道路上坚守积累和不断地进化中,提升对于用户美好生活的理一起了解NFT是什么从去年开始,一股潮流便开始席卷各大名人艺术家圈,它就是风靡全球的NFT。从去年2月开始,NFT开始爆炸式增长,每周交易量远超200万美元,这也让无数创造及收藏者把握住了NFT的先机杂交水稻制种新技术体系可破解制种高成本难题来源科技日报科技日报讯(记者赵汉斌)科技日报记者2月6日从云南农业大学获悉,该校稻作研究人员近期成功构建了杂交水稻雌性不育制种新体系,为实现机械化高效制种提供了新的技术方案。国际期威马汽车威马EX5,威马W6创新技术离不开强硬件的支撑随着生活的进步,车主不断成长,停车位困难找车困难等日常问题层出不穷。威马汽车作为汽车制造的新力量之一,于今年上半年推出了威马W6车型,配备了无人自主停车系统。随着新技术的应用,为用金立M50Pro有何亮点?8500mAh大电池还不够,起售仅1199在功能机时代,似乎是得续航者得天下,很多入手新机的用户最先关注的就是续航能力,所以大电池强续航也成为了手机厂商们着重发力的点,进入智能机时代,这一定律似乎并没有被改变,更完善的手机玩摄影必须了解最近两年单反微单领域新技术与新趋势深度解析随着科技的不断发展和进步,目前各种数码器材的性能越来越强悍,不论是电脑还是手机或者是数码相机,今天我们主要说说最近两年单反微单领域新技术与新趋势,这是每一个玩摄影的或者是影像爱好者
日本车企将在2022年为主要车型配备L2自动驾驶技术来源盖世汽车占亚娥据外媒报道,包括丰田汽车和马自达汽车在内的日本主要汽车制造商将在2022年左右为其主要车型配备自动驾驶技术。随着日本汽车制造商在自动驾驶方面逐渐落后于美国和中国的结案信息此百度非彼百度,烤肉店傍名牌被判3倍惩罚性赔偿此百度非彼百度烤肉店傍名牌被判3倍惩罚性赔偿百度搜索想必大家早已耳熟能详,但百度烤肉您可能还是头回听。有人也许会好奇什么,百度开始做烤肉了?非也,百度烤肉不仅与百度公司毫无关联,甚严重Servlet。service()forservletjspthrewexceptionjava。lang1。严重Servlet。service()forservletjspthrewexceptionjava。lang。NullPointerExceptionatorg。apache电信4g套餐忽悠升级5g,取消无门电信4g套餐忽悠升级5g,说是送礼品,套餐绑定使用2年,取消还需要付违约金,而且原来4g套餐被取消不能退回,我觉得这是霸王条款,明显的坑害消费者。为什么电信公司一个带有欺骗性质的营iPhone14最新概念渲染图曝光刘海彻底抹平首次四摄2021年9月份,苹果正式发布了新一代的iPhone13系列手机,终于将沿用了好几年的刘海缩小了一些,让不少用户非常激动。而根据一些爆料显示,苹果会在今年的iPhone14当中,对魅蓝乐视360统统回归!盘点今年重回手机市场的那些老品牌今年的手机市场竞争同样激烈。不仅在于各大手机厂商都不竭余力地推出新品,本来已经退出用户视野的那些老品牌也有不少在今年回归,为智能手机市场注入了更多活力。魅蓝说起魅蓝,老用户们肯定不乐鉴码交互设计优化及NFC技术加持,助力提升消费者互动体验中国上海近日,保乐力加中国旗下乐鉴码产品流通追溯系统再次焕新升级,在优化交互设计和视觉元素的同时,也以更加完善的鉴别和互动功能进一步提升消费者体验。此外,两款由NFC(近场通信)技2021普通消费者个人手机使用感受2020年9月到现在mate30PRO,p40,小米11,iPhone12,iPhone11,OPPOfindx3,findx3PRO,小米11PRO,小米11ultra,荣耀ma你走对Linux学习之路了吗?学习Linux大概有两个月的时间了,开始学习的时候对Linux的每个版本都比较好奇。然后在接下来的一段时间内从官网下载和安装了好多不同版本的linux系统进行安装和比较,基本上都是2022可入手的3款高性价比小屏旗舰!没有iPhone,只有比它更好的在开始讲之前,小黄现在这里祝各位粉丝和机友元旦快乐!祝大家在2022年能够在机圈吃瓜吃饱,而且能够得到更多机圈小知识,变得更聪明更帅接下来进入正题,虽然我们已经迎来了2022年的第2021年,我们推荐购买的10款手机时间飞逝,转眼已经来到2021年的最后一天,在这一年里,我们经历了太多的风风雨雨,也得到了太多收获和成长。在这辞旧迎新的日子里,还是要道一句元旦快乐!最近一段时间,随着首批高通骁龙