首页
学习
活动
专区
工具
TVP
发布

Linux内核设备驱动之系统调用笔记整理

linux中,系统调用是用户空间访问内核的唯一手段,除异常和中断外,他们是内核唯一的合法入口。系统调用的数量很少,在i386上只有大概300个左右。...应用程序–>C库–>内核的系统调用 从程序员的角度来看,系统调用无关紧要,他们只需要跟API打交道就可以了; 从内核的角度来看,内核只跟系统调用打交道,库函数及应用程序怎么使用系统调用不是内核所关心的。...include/asm/unistd.h中 (6)要实现系统调用需注意哪些方面 给linux添加一个系统调用不难,但怎么设计和实现一个系统调用是难题所在。...linux不提倡采用多用途的系统调用(根据不同的参数提供不同的功能)。...通常,系统调用靠c库支持,glibc不可能支持我们自己的系统调用,此时,需要借助linux本身提供的一组宏来对系统调用直接进行访问。

1.8K31

Linux内核驱动编写

# 前言 开发过单片机的小伙伴可以看一下我之前的一篇文章从单片机开发到linux内核驱动,以浅显易懂的方式带你敲开Linux驱动开发的大门。...# 正文 用户空间的每个函数(用于使用设备或者文件的),在内核空间中都有一个对应的功能相似并且可将内核的信息向用户空间传递的函数。 下表为几种设备驱动事件和它们在内核和用户空间对应的接口函数。...* 它是file_operations结构体的成员,用于调用register_chardev。...在内核维护的设备和驱动列表中寻找你在驱动模块中注册的设备和驱动。...如果找到了,会生成相关的文件节点,并在节点内部存下相关驱动的信息,当你打开或者读写文件节点的时候,最终会调用到你注册的驱动中相关的驱动函数。

7K20
您找到你想要的搜索结果了吗?
是的
没有找到

Linux内核设备驱动Linux内核基础笔记整理

Linux内核驱动模块机制 静态加载, 把驱动模块编进内核, 在内核启动时加载 动态加载, 把驱动模块编为ko, 在内核启动后,需要用时加载 2....编写内核驱动 #include #include static int __init test_init(void) { return...test.ko 查看模块的信息 cat /proc/modules 查看当前系统的动态加载模块 相当于lsmod test 1768 0 – Live 0xbf03c000 模块名, 使用的内存大小, 调用次数...驱动模块的Makefile obj-m += test.o //源码文件为test.c modules:make -C 内核源码目录 M=驱动代码所在目录 modules modules install...:make -C 内核源码目录 M=驱动代码所在目录 modules_install INSTALL_MOD_PATH=/文件系统路径 clean:make -C 内核源码目录 M=驱动代码所在目录

1.8K51

linux内核驱动模型详解_arduino驱动安装

转载请标明出处floater的csdn blog,http://blog.csdn.net/flaoter Linux SPI驱动分为核心层,控制器驱动层和设备驱动层。...核心层是Linux的SPI核心部分,提供了核心数据结构的定义,总线、设备和驱动的注册、注销管理等,提供与上层的统一接口。...linux将I2C、SPI、USB等总线驱动隔离成控制器驱动和设备驱动,使两者相对独立。 本文以qcom的spi控制器为例,对spi控制器驱动进行解析。kernel代码版本是3.18。...linux驱动与设备是一对多的关系,在spi_master设备注册时,控制器的结构体信息会提供给spi_master作为私有数据。...worker通过创建一个内核线程,来串行执行kthread_work调用queue去排队的func。spi_init_queue实现了队列和工作线程的初始化。

11K40

Linux 内核之字符设备驱动

本篇介绍 本篇介绍下如何写字符设备的驱动程序。...支持阻塞IO的驱动demo Linux 上的设备类型可以大概分为以下几种: 字符设备:以字节为单位传输,传输率低,不支持随机访问,常见的设备有鼠标,键盘,触摸屏等 块设备: 以块位单位传输,常见的就是磁盘...先看下字符设备的结构 struct cdev { struct kobject kobj; // 用于linux设备驱动模型 struct module *owner; // 字符设备驱动所在的内核模块对象指针...再介绍下misc 设备,linux 内核将一些不符合预先确定的字符设备划分为杂项设备,使用的数据结构如下; struct miscdevice { int minor; const char...用户态对设备执行poll或select,设备驱动的poll方法就会被调用,poll会执行以下步骤: 在一个或多个等待队列中调用poll_wait, 该函数会把当前进程加到执行的等待列表中(poll_table

4.8K40

linux内核编译AX99100驱动

linux内核版本:4.14 pcie转四路串口芯片:亚信的AX99100 linux内核里是没有这块芯片的驱动的,这里自己添加驱动进去进行编译。...1.从亚信官网下载该芯片的linux驱动https://www.asix.com.tw/cs/download.php?...sub=driverdetail&PItemID=256 2.在 linux/drivers/tty/serial/的目录下新建一个99xx的目录,把解压之后的文件里除了.cache.mk、Makefile...下的Kconfig,增加 source "drivers/tty/serial/99xx/Kconfig" 7.在linux目录下,使用你自己的编译器进入menuconfig进行内核配置(make menuconfig...Device Drivers > Character devices > Serial drivers目录下,勾选以下两个刚才添加的选项,并把8250的两个选项取消选中 9.进行编译,这样就把AX99100的驱动编译进内核里了

8.1K31

谈谈Linux内核驱动的coding style

最近在向Linux内核提交一些驱动程序,在提交的过程中,发现自己的代码离Linux内核的coding style要求还是差很多。...如果去看drivers/staging下的代码,就会发现很多驱动程序都没有严格遵守内核的coding style,而且在很多驱动程序的TODO文件里,都会把"checkpatch.pl fixes"作为自己的目标之一...scripts/checkpatch.pl 这是一个检查代码是否符合内核编码规范的的脚本。顾名思义,checkpatch是用来检查patch的,默认的调用也确实如此。...在Linux内核的coding style里,switch和case要求有相同的缩进。本例的代码很少,错误也只有这一个,手动修改很方便。如果类似的缩紧错误很多怎么办?...比如,Linux内核的coding style要求,行尾不能有空格(包括Tab),去除这些空格就可以借助sed。 我自己的习惯很差,经常在代码的行尾留下一些空格。

1.7K10

Linux内核设备驱动内核的调试技术笔记整理

/****************** * 内核的调试技术 ******************/ (1)内核源代码中的一些与调试相关的配置选项 内核的配置选项中包含了一些与内核调试相关的选项,都集中在...具体的调试选项说明可参见驱动一书,或通过menuconfig的help说明查看。...有用的参数有: -t 显示调用发生的时间 -T 显式调用所花费的时间 -e 限定被跟踪的系统调用类型,如”-e execve” -f 跟踪所有子进程 -p 跟踪特定进程。...有用的参数有: -t 显示调用发生的时间 -T 显式调用所花费的时间 -f 跟踪所有子进程 -p 跟踪特定进程 -o 将输出的信息导入特定的文件 (5)查看oops消息 oops是内核告知用户有不幸发生的最常用方式...进程(0)或init进程(1),因为内核没有这两个进程没法工作 如果oops在其他进程运行时发生,内核会杀死该进程并尝试着继续运行。

2.1K41

Linux 内核0.11 系统调用详解(上)

https://blog.csdn.net/u014688145/article/details/50608829 备注:本文通过三个问题,引出Linux 内核0.11的系统调用。...由图可以看出,从操作系统的角度来看,一台计算机主要分为两级:用户级以及内核级,系统调用主要作用就是连接用户级和内核级的“插座”。...对底层的操作,如果不通过系统调用限制,会发生用户应用程序修改系统内核等误操作,造成操作系统运行瞬间奔溃,考虑到系统的稳定性、安全性等问题,我们需要向上提供接口,限制应用层连入内核的权限。...因此,自然而然的一个想法就是,通过对与内核模块代码段,数据段和对用户区的代码数据段做区分来阻止用户直接访问内核模块。Linux内核通过建立段级保护机制来完成上述区分核心与用户态区域的功能。...系统调用,基本结束了,剩下的即是内核代码的编写。在下一节中,我们将在实际的操作系统编写两段内核代码函数,让用户程序能调用系统函数。尽请期待!o(∩_∩)o

1.6K31

Linux内核设备驱动之字符设备驱动笔记整理

通常,主设备号标示设备对应的驱动程序,linux允许多个驱动共用一个主设备号; 而次设备号用于确定设备文件所指的设备。 在内核中,用dev_t类型保存设备编号。...2.4内核中采用16位设备号(8位主,8位从),而2.6采用32位,12位主,20位从。 在驱动中访问设备号应该用中定义的宏。...见和驱动书的p54 2.6内核结构的初始化: struct file_operations my_fops = { .owner = THIS_MODULE, .llseek =...release方法的调用,只有当file的计数器归零时,才会调用release,从而释放dev结构) (7)read和write read和write的工作是从用户空间拷贝数据到内核,或是将内核数据拷贝到用户空间...documentations/devices.txt可查看设备号的静态分配情况 ///内核里使用struct cdev来描述一个字符设备驱动 #include struct

4.6K20

Linux内核的LED设备驱动框架【转】

驱动框架的概念 内核驱动部分维护者针对每个种类的驱动设计一套成熟的、标准的、典型的驱动实现,并把不同厂家的同类硬件驱动中相同的部分抽出来自己实现好,再把不同部分留出接口给具体的驱动开发工程师来实现,这就叫驱动框架...因此,Linux中LED的驱动框架把所有LED设备的共性给实现了,把不同的地方留给驱动工程师去做。...内核在启动过程中,内核需要按照先后顺序去进行初始化操作。因此,内核给是给启动时要调用的所有初始化函数归类,然后每个类按照一定的次序去调用执行。...subsys_initcall宏修饰leds_init()函数,因此leds_init()函数在内核启动阶段被调用。...调用led_classdev_unregister()函数卸载LED设备驱动

2.5K10

Linux内核驱动开发的EXPORT_SYMBOL

简介 本文主要来讲讲Linux内核驱动中,EXPORT_SYMBOL()宏定义的用法。 在阅读的Linux内核驱动源码的时候,我们会发现很多的函数带有EXPORT_SYMBOL()宏定义。...EXPORT_SYMBOL()宏定义作用 EXPORT_SYMBOL宏定义定义的函数或者符号将对内核代码公开,不用修改内核代码就在其他的内核模块中直接调用,即使用EXPORT_SYMBOL可以将一个函数以符号的方式导出给其他模块使用...static int rice_func(void) { return 0; } EXPORT_SYMBOL(rice_func); 在调用该函数的另外一个模块中使用extern对之声明。...extern int rice_func(void); 先加载定义该函数的模块,然后再加载调用该函数的模块,先后顺序必须注意。...实验 编写代码 编写两个模块:rice_export.ko 和 rice_import.ko,其中: rice_export.ko:导出定义的函数 rice_import.ko:调用导出的函数 导出函数模块的代码

2.3K20

Linux内核平台总线设备驱动模型浅析

复习总线设备驱动模型,做了一点小笔记,大牛略过。 一、Linux系统的驱动框架的基础很大一部分是围绕着总线设备驱动模型展开的。...二、涉及3个重要结构体: struct bus_type:总线 struct device :设备 struct device_driver:驱动 三、结构体核心代码分析(2.6.38内核) structbus_type..., pci_dev,usb_device,i2c_device, spi_device等)都包含一个struct device结构体,当这些驱动内核注册各式各样的设备时,其实最终都会调用到: intdevice_register...structdevice_driver结构体,当这些驱动内核注册各式各样的驱动时,最终都会调用到: int driver_register(structdevice_driver *drv) {    ...; } 无论是调用driver_register()注册驱动, 还是用device_register注册设备, 内核都会调用总线的match函数来探测是否有合适device_driver的device或者是否有合适

1.9K30
领券