linux驱动开发要知道的那些知识(三)------container_of,定时器 及系统调用

2024-05-15 21:24:00

container_of

定义:

/**

* container_of - cast a member of a structure out to the containing structure

* @ptr:the pointer to the member.

* @type:the type of the container struct this is embedded in.

* @member:the name of the member within the struct.

*

*/

#define container_of(ptr, type, member) ({\

const typeof(((type *)0)->member) * __mptr = (ptr);\

(type *)((char *)__mptr - offsetof(type, member)); })

#endif

第一步:

Const typeof (((type *)0->member) * __mptr=(ptr)

Struct list_head *__mptr=ptr

第二步:

(type *)(char *)__mptr -offsetof(type,menber)

0x***-offset

第三步:offsetof(type,member)

((TYPE *)0)->MEMBER

&(TYPE *)0)->MENBER

(TYPE *)0 这是一个强制类型转换,把0地址强制类型转换成一个指针,这个指针指向一个TYPE类型的结构体变量。 (实际上这个结构体变量可能不存在,但是只要我不去解引用这个指针就不会出错)。

((TYPE *)0)->MEMBER (TYPE *)0是一个TYPE类型结构体变量的指针,通过指针指针来访问这个结构体变量的member元素

&((TYPE *)0)->MEMBER  等效于&(((TYPE *)0)->MEMBER),意义就是得到member元素的地址。但是因为整个结构体变量的首地址是0,

内核定时器

时钟中断

HZ:常数决定了时钟发生的频率

Tick:发生时间中断的时间间隔tick=1/HZ

Jiffies:核心变数,

struct timer_list

{

unsigned long expires;超时时间

void *function)(unsigned long0)处理函数

unsigned long data;内核调用超时处理函数时传递给它的参数

}

静态初始化

TIMER_INITALIZER(_function,_expires,_data)

DEFINE_TIME(_name,_function,_expires,_data);

_name 待定义的内核定时器变量名称

Void init_timer(struct timer_list *timer);

修改定时器

wKiom1g6MEviN7l2AACB4QttqMw102.png-wh_50

init_timer(time)初始化定时器,传地址

#define BARK_TIMER  5

#deifne BARK_DATA  100

Xxx.expires = jiffies+HZ*BARK_TIMER;//BARK_TIMER=5五秒

Xxx.function=xxxxxx

Xxxx.data=BARK_DATA;

Add_timer(&xxxxx

del_timer()

2系统调用

ANSI C fopen(标准c的库函数)

UNIX C  open (系统调用)

用户态的程序一般情况是不能访问内核态的资源,只有通过中断或者系统调用才能从用户态进入内核态

2.6.35366个内核系统调用为应用程序服务。

系统调用的原理:

应用程序首先使用适当的值填充寄存器,然后调用一个特殊的指令,跳转到内核某个固定的位置,内核根据应用程序所填充的固定值来找到相应的函数执行。

适当的值:arch/arm/asm/unistd.h

调用特殊指令 arm->SWI(软中断)

X86  0x80

固定位置:在arm体系中,应用程序跳转到entry-conmmon ->vector_swi ->会用到sys_call_table(calls.S)

用户空间编程 fd=openaa.txt...

5->寄存器

SWI

____________________

vector_swi

sys_call_table[5]

sys_open

SYSCALL_DEFINR3  拼接

1)添加新的内核函数

vim arch/arm/kernel/sys_arm.c

Asmlinkage int sys_add(int x,int y)

{

printk(entry sys_add!\n);

Return x+y;

}

2)更新头文件 arch/arm/include/asm/unistd.h

#define __NR_add    (__NR_SYSCALL_BASE+366)

3)更新系统调用表(calls.S

CALL(sys_add)

最后make下即可

转载于:https://blog.51cto.com/songmao/1876960

linux驱动开发要知道的那些知识(三)------container_of,定时器 及系统调用相关推荐

  1. linux驱动私有数据,linux驱动开发之字符设备--私有数据和container_of

    前言 驱动开发中通常为设备定义一个设备相关的设备结构体,其包含该设备的cdev .私有数据.信号量.irq等这些信息. 驱动开发中通常将文件的私有数据private_data指向设备结构体,在read ...

  2. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之Pinctrl子系统和GPIO子系统的使用

    文章目录 前言 1.Pinctrl子系统 1.1.为什么有Pinctrl子系统 1.2.重要的概念 1.3.代码中怎么引用pinctrl 2.GPIO子系统 2.1.为什么有GPIO子系统 2.2.在 ...

  3. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之按键驱动框架

    文章目录 前言 1.APP怎么读取按键值 1.1.查询方式 1.2.休眠-唤醒方式 1.3.poll方式 1.3.异步通知方式 1.5. 驱动程序提供能力,不提供策略 2.按键驱动程序框架--查询方式 ...

  4. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之LED模板驱动程序的改造:设备树

    文章目录 前言 1.驱动的三种编写方法 2.怎么使用设备树写驱动程序 2.1.设备树节点要与platform_driver能匹配 2.2.修改platform_driver的源码 3.实验和调试技巧 ...

  5. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之设备树模型

    文章目录 前言 1.设备树的作用 2.设备树的语法 2.1.设备树的逻辑图和dts文件.dtb文件 2.1.1.1Devicetree格式 1DTS文件的格式 node的格式 properties的格 ...

  6. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之总线设备驱动模型

    文章目录 前言 1.驱动编写的三种方法 1.1.传统写法 1.2.总线驱动模型 1.3.设备树驱动模型 2.Linux实现分离:Bus/Dev/Drv模型 2.1.Bus/Dev/Drv模型 2.2. ...

  7. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之驱动设计的思想:面向对象/分层/分离

    文章目录 前言 1.分离设计 驱动程序分析---程序分层 通用驱动程序---面向对象 个性化驱动程序---分离 APP 程序分析 前言 韦东山嵌入式Linux驱动开发基础知识学习笔记 文章中大多内容来 ...

  8. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之LED驱动框架--面向对象、分层设计思想

    文章目录 前言 1.LED驱动程序框架 1.1.对于LED驱动,我们想要什么样的接口? 1.2.LED驱动要怎么写,才能支持多个板子?分层写 1.3.程序分析 驱动程序 应用程序 Makefile 1 ...

  9. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之第一个驱动

    文章目录 前言 1.Hello驱动 1.1.APP打开的文件在内核中如何表示? 1.2.打开字符设备节点时,内核中也有对应的struct file 1.3.如何编写驱动程序? 1.4.驱动程序代码 1 ...

最新文章

  1. 015 Android之可执行文件dex
  2. 20162316刘诚昊 《程序设计与数据结构》 第三周学习总结
  3. 阿里《Java开发手册》中的 1 个bug!
  4. 物联网模式下的多活数据中心架构认识与实践
  5. c++ for循环 流程图_python 零基础必知--条件控制与循环语句
  6. linux下编译安装ACE-6.5.1
  7. python爬虫什么意思-Python爬虫是什么意思有啥用 python爬虫原理实例介绍
  8. 【IP 地址 和 端口 _简介】
  9. 电容电感充电曲线仿真图
  10. uCOSIII 实时操作系统(一) - 简介
  11. Proguard打包混淆报错:can't find superclass or interface
  12. nginx三种负载均衡的方式
  13. 免费网站建设应该要掌握哪些?
  14. dreamware html中加入flv,Dreamweaver插入FLV文件技巧
  15. 安全牛我们今天的网络安全问题源自1648年,其实我觉得其实早在资治通鉴上的中国法家们已经表示同样想法
  16. Vue 获取当前地理位置信息
  17. 软件工程师资格认证,你合格吗?
  18. 遇到不支持的 Oracle 数据类型 USERDEFINED。
  19. [I.MX6UL] U-Boot移植(六) 网络驱动修改 LAN8720A(对比原子和NXP官方测试板的网络芯片LAN8720A , KSZ8081 (也是飞凌)唯独复位引脚不同595芯片也涉及改动)
  20. 计算机里的游戏安装包怎么删除,游戏怎么清缓存?电脑中LOL更新留下的缓存垃圾删除的教程...

热门文章

  1. 一个比 Spring Boot 快 44 倍的 Java 框架
  2. Java 如何实现二维码?
  3. SpringBoot第十五篇:Springboot整合RabbitMQ
  4. SpringBoot第二十二篇: 创建含有多module的springboot工程
  5. 组合特征(四)linearsvm-tfidf(word)+lr-tfidf(article)
  6. 计算机视觉中的自注意力
  7. 魔改Attention大集合
  8. CNN如何用于NLP任务?一文简述文本分类任务的7个模型
  9. 推荐一位我的好朋友,8年码农,前鹅厂工程师!
  10. 曾捡破烂为生,穷到没饭吃,现在身家395亿,给员工发3亿年终奖!