首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

详解 | Linux驱动入口函数module_init如何调用

大多的Linux驱动程序需要包含下面三个头文件: #include #include #include ...几乎每个Linux驱动都有个module_init(与module_exit的定义在Init.h (/include/linux) 中)。没错,驱动的加载就靠它。为什么需要这样一个宏?...原因是按照一般的编程想法,各部分的初始化函数会在一个固定的函数里调用比如: void init(void) { init_a(); init_b(); } 如果再加入一个初始化函数呢,...与此类似,内核中也是用到这种方法,所以我们写驱动的时候比较独立,不用我们自己添加代码在一个固定的地方来调用我们自己的初始化函数和退出函数,连接器已经为我们做好了。先来分析一下module_init。...Linux kernel中有很大一部分代码是设备驱动代码,这些驱动代码都有初始化和反初始化函数,这些代码一般都只执行一次,为了有更有效的利用内存,这些代码所占用的内存可以释放出来。

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

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

linux中,系统调用是用户空间访问内核的唯一手段,除异常和中断外,他们是内核唯一的合法入口。系统调用的数量很少,在i386上只有大概300个左右。...C库中的函数可以不调用系统调用,也可以只是简单封装一个系统调用,还可以通过调用多个系统调用来实现一个功能。...include/asm/unistd.h中 (6)要实现系统调用需注意哪些方面 给linux添加一个系统调用不难,但怎么设计和实现一个系统调用是难题所在。...linux不提倡采用多用途的系统调用(根据不同的参数提供不同的功能)。...通常,系统调用靠c库支持,glibc不可能支持我们自己的系统调用,此时,需要借助linux本身提供的一组宏来对系统调用直接进行访问。

1.8K31

Delphi调用驱动打印

前言 我们做打印小票的时候除了直接对端口发送指令的方式,还有就是调用打印机驱动打印的方式,在Delphi中想要用驱动打印的方式就可以用到TPrinter类 TPrinter类介绍 TPrinter类中封装了...可以在Printers单元中通过调用Printer函数来获得一个TPrinter 对象。为了决定如何显示窗体的打印图像,可以使用Tform组件的PrintScale属性。   ...使用Canvas对象的Brush,Font 和Pen 属性可以决定如何绘制和显示页。...---- Capabilities 指示一个打印设备驱动器的当前设置 指示一个打印设备驱动器的当前设置。...不能直接调用TPrinter方法。TPrinter方法将由Printer函数自动调用。方法为打印机分配内存,并调用继承的构造方法。然后设置正确的驱动器、设备和端口.

2.2K30

如何linux系统上移植驱动

在嵌入式linux上移植LCD(这里指彩色点阵式LCD)的驱动,通常说来,并不是很困难的事。最简单的方法,就是找到linux中,现有的LCD驱动的参数设置的代码,直接修改参数即可。...复杂点的方法,就要添加LCD驱动相关的结构体,设备描述,等。但不管怎么样,LCD的参数设置是最终肯定要面对的问题。...1075083208 如何linux系统上移植驱动以下,就把LCD的参数设置的方法说明一下。 首先,参数设置设置的是什么?其实就是LCD屏的工作频率,垂直扫描频率,撗向扫描时间等等参数。...接下来,如何设置,在linux中,这些参数将会填写到LCD驱动相关的结构体中去。(不同体系的嵌入系统中,这个结构体的名称和所在文件不尽相同) 最后,就是手册中的参数与LCD结构体中的参数的对应关系。...(这是本博文最有价值的地方,这些公式找了好久才找到) OK,这样一来,参数的计算就不成问题了,LCD的驱动也就不成问题了。

3.6K10

Linux驱动实践:如何编写【 GPIO 】设备的驱动程序?

目录 示例程序目标 编写驱动程序 编写应用程序 卸载驱动模块 在前几篇文章中,我们一块讨论了:在 Linux 系统中,编写字符设备驱动程序的基本框架,主要是从代码流程和 API 函数这两方面触发。...编写驱动程序 以下所有操作的工作目录,都是与上一篇文章相同的,即:~/tmp/linux-4.15/drivers/。...还是通过 dmesg 指令来查看驱动模块的打印信息: $ dmesg 可以看到:操作系统为这个设备分配的主设备号是 244,并且也打印了GPIO硬件的初始化函数的调用信息。...如何确认/dev/mygpio0这个GPIO的状态确实被设置为1了呢?...再来看一下 dmesg的打印信息: 可以看到:驱动程序中的 gpio_driver_exit( ) 被调用执行了。

4.8K30

linux-4.14.11 添加自定义的系统调用

, linux上的C库对所有的系统调用都作了封装, 调用系统调用,需要从用户态切换到内核态, 不同体系结构的系统陷入内核态的方法不同, C库封装了这层差异,这也是推荐直接使用C库的原因; 以x86为例...这样就很清楚了, 如果要增加一个系统调用, 我们只需要: 先给要增加的系统调用定个名字; 按linux kernel的规范定义系统调用服务例程; 要系统调用表里添加系统调用号和系统调用的对应关系; 重新编译内核...; 我们心linux kernel 4.14.11为例, 实操一下, 首先需要要相应的内核源码 ---- 声明系统调用服务例程 假设我们新添加的系统调用名字为hello 打开源码下 include/linux...打开源码下arch/x86/entry/syscalls/syscall_64.tbl, 添加调用号333(根据自己的源码,可自定义): 333 64 hello...sys_hello 编译安装新内核并使用新内核重启 可参考 linux-4.14.11 编译 测试新的系统调用 测试代码 test_syscall.c #include int

1.4K20

Linux驱动之网卡驱动剖析

Linux 网络设备驱动架构 驱动架构自上而下分为4层: 协议接口层 设备接口层 设备驱动功能层 网络设备与媒介层 协议接口层 协议接口层主要功能是给上层协议提供接收和发送的接口。...传递的数据被描述为套接字缓冲区,用struct sk_buff结构描述,该结构体定义位于include/linux/skbuff.h中,用于在Linux网络子系统中的各层之间传输数据,该结构在整个网络收发过程中贯穿始终...源码分析 笔者基于的是 S5PV210 的 DM9000 驱动,会大体上对 DM9000 的驱动源码进行分析, 分析源码位于DM9000 源码 platform 框架分析 DM9000 的驱动是基于 platform...,会调用驱动的 probe 函数 dm9000_probe,分段进行分析 struct dm9000_plat_data *pdata = pdev->dev.platform_data; struct....ndo_poll_controller = dm9000_poll_controller, #endif }; dm9000 open 过程分析 当用户执行命令ifconfig eth0 up后会调用网卡驱动

55.4K20

Linux被中断的系统如何调用详解

前言 慢系统调用,指的是可能永远无法返回,从而使进程永远阻塞的系统调用,比如无客户连接时的accept、无输入时的read都属于慢速系统调用。...在Linux中,当阻塞于某个慢系统调用的进程捕获一个信号,则该系统调用就会被中断,转而执行信号处理函数,这就是被中断的系统调用。...然而,当信号处理函数返回时,有可能发生以下的情况: 如果信号处理函数是用signal注册的,系统调用会自动重启,函数不会返回 如果信号处理函数是用sigaction注册的 默认情况下,系统调用不会自动重启...,函数将返回失败,同时errno被置为EINTR 只有中断信号的SA_RESTART标志有效时,系统调用才会自动重启 下面我们编写代码,分别验证上述几种情形,其中系统调用选择read,中断信号选择SIGALRM...由于对被中断系统调用处理方式的差异性,因此对应用程序来说,与被中断的系统调用相关的问题是: 应用程序无法保证总是知道信号处理函数的注册方式,以及是否设置了SA_RESTART标志 可移植的代码必须显式处理关键函数的出错返回

2.5K10

Linux驱动开发: USB驱动开发

四、 linux内核下USB相关的API函数与数据结构 前面介绍了USB相关一些基础概念与重要的数据结构,接下来就分析在linux内核中如何编写一个USB 驱动程序,编写与一个USB设备驱动程序的方法和其他总线驱动方式类似...但这是个外壳,只是实现设备和总线的挂接,具体的USB 设备是什么样的,如何实现的,比如一个字符设备,我们还需填写相应的文件操作接口。...(中断传输方式) 5.1 USB驱动注册框架代码 #include #include #include /*...#include /* 本程序为USB鼠标驱动程序,要安装本驱动,需要先将内核自带的USB驱动程序卸载掉 */ //定义USB的IDTAB 24ae:2002 static...探测成功后,就注册一个字符设备,创建设备节点,方便应用程序调用驱动完成设备控制。 (2). 驱动层向应用层提供了read和write接口函数,方便根据预先定义的结构体进行数据通信。

69.2K20

python调用调用Linux命令

如何调用Linux命令 下面代码演示了调用一个shell命令, 其中,命令的输出会存储到result变量中, 而命令的返回值,则存储到exitcode中,由此可见,调用shell命令还是很方便的: import...ftp.login('user','password') ftp.retrbinary('RETR readme.txt', open("readme.txt", "wb").write) ftp.quit() 调用...编译成动态库: g++ -fPIC api.cpp -o api.so -shared -I/usr/include/python2.7 -I/usr/lib/python2.7/config 在python中调用...add函数: import ctypes plib = ctypes.CDLL('/tmp/api.so') print "result: %d" %(plib.add(1,2)) 系统调用 虽然需求好像有点...“过份”,但是强大的python是可以调用诸如ioctl这类的Linux系统调用的, 以下的例子是让蜂鸣器响: import fcntl fd = open('/dev/pwm', 'r') fcntl.ioctl

5.1K20

Linux——Linux驱动之基本理论常识总结(什么是Linux驱动Linux驱动需要掌握哪些?)

说到这里,从顶层到底层正好是A到D的顺序,驱动程序就是联接操作系统和硬件之间的桥梁,驱动程序多半都是和硬件打交道的,如何让硬件更好、稳定的运行起来,这就是看驱动程序的好坏了,它对上需要提供硬件操作的相关接口...对于顶层的应用软件,无法直接调动硬件,是通过操作系统调用驱动程序提供的接口间接进行的,这样各层各司其职,对于整体系统来说也更稳定可靠,假如每个应用都能直接操作硬件,那才是最大的隐患。 ? ​...5)上层应用如何操作外部设备 这个应该说是做嵌入式的一个常规操作了,简单说下,大致思路基本都是一样的,举个很简单例子,我们要用控制器的某个 IO 口开关蜂鸣器,该如何操作:首先根据原理图确定是那个pin...,我们自己参照移植即可; 5)Linux官方:https://www.kernel.org,有Linux原始的内核代码; Linux驱动如何学习和理解,借用大神总结的话,在此记录下,我初次看时感觉很受用...对上:Linux设备驱动给上层提供调用的接口; 对中:Linux设备驱动要注册到内核中,标准说法是 挂载在总线上; 对下:直接操作硬件,如GPIO、IIC、SPI、PWM等; 以上三个,Linux内核都提供了大量的接口函数

7.9K30

LinuxLinux系统调用

Linux系统调用 前言 操作系统——管理计算机硬件与软件资源的软件,是用户和系统交互的操作接口,为它上面运行的程序提供服务。...操作系统内核——操作系统的内核,负责管理系统的进程、内存、设备驱动程序、文件和网络系统。一个内核不是一套完整的操作系统。例如LinuxLinux操作系统——基于Linux内核的操作系统。...Linux的运行空间: Linux的运行空间:内核空间+用户空间 ---- 内核空间——存放的是整个内核代码和所有内核模块,以及内核所维护的数据。 用户空间——用户程序的代码和数据。...---- 系统调用的实现 通过软件中断实现。 **软件中断:**它是通过软件指令触发的中断。Linux系统内核响应软件中断,从用户态切换到内核态,执行相应的系统调用。...\n"); } return 0; } ---- 对比 ---- 如何高效执行系统调用 系统调用的次数会影响程序的执行效率。

27.8K10

Linux SPI 驱动

接下来我们着重分析下,SPI双工通信如何进行的。 如图: 1.首先CS拉低 2.CLK开始工作。 3.第一个高电平的上升沿数据开始进行采集。 4.MO/MI的数据发出。 5.MI/MO采集数据。...代码部分均来自于linuxkernel开源代码https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/?...2)三个数据结构 a、Spi_driver image.png b、spi_transfer image.png c、spi_message image.png 3)三个使用步骤 a、注册SPI设备调用...首先我们看下这里的spidev_write,这个接口承担了和userspace的系统调用接口,由字符设备驱动 fops注册 image.png spidev_sync_write有个核心的数据结构用来支撑双工通信...,linux给了我们一个很好的平台让我们能在前辈的肩上进行各种高质量的代码学习,我们也需抓住这个机会,在做好本质工作的基础上静心努力钻研,不断前行,祝愿各位也祝愿我自己在技术的道路上越走越远。

18.2K12

Linux笔记】Linux驱动基础

Linux字符设备驱动框架 我们先看一个图: ? 当我们的应用在调用open、close、write、read等函数时,为什么就能操控硬件设备。...那是因为有驱动层在支撑着与硬件相关的操作,应用程序在调用打开、关闭、读、写等操作会触发相应的驱动层函数。 本篇笔记我们以hello驱动做分享,hello驱动属于字符设备。...我们在串口终端调用装载与卸载驱动的命令,怎么就会执行装载与卸载操作。...得有一个入口函数:安装驱动程序时,就会去调用这个入口函数 */ static int __init hello_init(void) { int err; printk("%s %s...有入口函数就应该有出口函数:卸载驱动程序时,就会去调用这个出口函数 */ static void __exit hello_exit(void) { printk("%s %

25.8K54
领券