本文最先发布在: https://www.itcoder.tech/posts/modprobe-command-in-linux/
EXPORT_SYMBOL只出现在2.6内核中,在2.4内核默认的非static 函数和变量都会自动导入到kernel 空间的, 都不用EXPORT_SYMBOL() 做标记的。 2.6就必须用EXPORT_SYMBOL() 来导出来(因为2.6默认不到处所有的符号)。
OpenCAS 内核模块加载 内核模块基本研发步骤介绍 模块加载函数,当通过insmod或者modprobe命令加载内核模块,模块加载函数会自动在内核中执行模块初始化函数 模块卸载函数,当rmmod命令卸载内核模块时候,会在内核执行模块的销毁函数 模块许可申明,许可证是用来描述内核模块的许可权限 模块的参数,模块参数是模块被加载时候可以传递参数,它对应的模块的全局变量 模块到处符号,内核模块可以导出的符号(symbol,对应的变量或者函数),导出后其他的内核模块可以使用本模块的函数或者变量 模块作者申请 内
本章介绍所有的关于模块和内核编程的关键概念,通过一个 hello world 模块来认识驱动加载的流程及相关细节。
源码的下载可以从网站:https://mirrors.edge.kernel.org/pub/linux/kernel/
Linux 内核运行在单独的内核地址空间,是一种单内核的理念 (有时称之为宏内核 Macrokernel 或 Monolithickernel ),所有事情都运行在内核态,直接调用函数,无需消息传递,避免了IPC机制带来的额外开销,还避免了内核空间到用户空间的上下文切换,因而性能优异,同时在设计上又汲取了微内核(Microkernelkernel) 的精华:模块化设计、抢占式内核、支持内核线程以及动态装载内核模块的能力,从而在灵活性上又得以拓展
免责声明:本文介绍的安全知识方法以及代码仅用于渗透测试及安全教学使用,禁止任何非法用途,后果自负 前言:作者最近在学习有关linux rootkit的原理与防范,在搜索资料中发现,在freebuf上,对rootkit进行介绍的文章并不是很多。在此我斗胆献丑,总结了下我最近的学习收获,打算发表一系列关于linux rootkit的文章在freebuf上,希望能够帮助到大家。 对于这个系列文章,我的规划如下:这一系列文章的重点集中在介绍linux rootkit中最讨论最多也是最受欢迎的一种:loadable
我们在linux中安装驱动,有时会遇到受限或冲突,通常解决方式都是要修改blacklist.conf, 那么如何认识和深入了解它呢?下面就解读下 一、blacklist黑名单 对内核模块来说,黑名单是指禁止某个模块装入的机制
静态加载, 把驱动模块编进内核, 在内核启动时加载 动态加载, 把驱动模块编为ko, 在内核启动后,需要用时加载
衔接地址 http://www.vmware.com/products/workstation/workstation-evaluation ,下载Linux版本的VMware。我下载是:VMware-Workstation-Full-12.0.0-2985596.x86_64.bundle。
最近在搞IoT的时候,因为没有设备,模拟跑固件经常会缺/dev/xxx,所以我就开始想,我能不能自己写一个驱动,让固件能跑起来?因此,又给自己挖了一个很大坑,不管最后能不能达到我的初衷,能学到怎么开发Linux驱动,也算是有很大的收获了。
ERROR: Unable to find the kernel source tree for the currently running kernel. Please make sure you have installed the kernel source files for your kernel and that they are properly configured; on Red Hat Linux systems, for example, be sure you have the 'kernel-source' or 'kernel-devel' RPM installed. If you know the correct kernel source files are installed, you may specify the kernel source path with the '--kernel-source-path' command line option.
这个模块定义了2个函数,一个是模块加载时调用的函数(hello_init);还有一个是卸载模块时调用的函数(hello_exit)。module_init 和 module_exit 使用特定的内核宏表明这两个函数的职责。另外,MODULE_LICENSE 告知内核,该模块使用的许可证。
很早之前就有网友建议写一篇关于Linux驱动的文章。之所以拖到现在才写,原因之一是我之前没有在工作中遇到需要自己手动去写驱动的需求,主要是现在Linux内核驱动的支持已经比较完善了,另外一个原因是自己水平实在有限,不敢写驱动这个话题,Linux驱动里涉及到的东西太多了,很多年前专门买过驱动相关的书籍,厚厚的,看的云里雾里。借此机会,在这里给大家做个非常非常入门级的介绍,希望对大家有所帮助。
make的语法是Make -C 内核路径 M=模块路径 modules,该语句会执行内核模块的编译!
/proc/kallsyms会显示内核中所有的符号,但是这些符号不是都能被其他模块引用的(绝大多数都不能),能被导出的是符号的类型是大写的那些(例如T,U)。
模块是驱动开发的必经之路,这也是我们在前边要构建内核源码树的目的所在。因为模块属于kernel编程了,和用户空间的c语言变成不同。他要依附于内核源码树的存在而存在,下面就开始我们的第一个模块的编写吧。
模块在加载时,会调用module_alloc()来申请一块内存来存放模块的内容,需要的大小如下:
Linux给应用程序提供了丰富的api,但是有时候我们需要跟硬件交互,访问一些特权级信息,所以可以使用编写内核模块这种方式。 另外Linux是宏内核结构,效率非常高,没有微内核那样各个模块之间的通讯损耗,但是又不能方便的对内核进行改动,可扩展性和可维护性比较差,内核模块提供了一种动态加载代码的方式,弥补了宏内核的不足。
Android 从 5.0 开始使用新的相机 API Camera2 来代替之前的旧版本,从而支持更多的特性。
嵌入式Linux操作系统具有:开放源码、所需容量小(最小的安装大约需要2MB)、不需著作权费用、成熟与稳定(经历这些年的发展与使用)、良好的支持等特点。因此被广泛应用于移动电话、个人数码等产品中。嵌入式Linux开发主要包括:底层驱动、操作系统内核、应用开发三大类。需要掌握系统移植(Uboot、Linux Kernel的移植和裁剪、根文件系统的构建)、Linux驱动及内核开发(字符设备驱动、块设备驱动、网络设备驱动)应用开发由于博主能力有限所了解的也不多。
《Linux入侵检测》系列文章目录: 1️⃣企业安全建设之HIDS-设计篇 2️⃣入侵检测技术建设及其在场景下的运用 3️⃣ATT&CK矩阵linux系统实践/命令监控 4️⃣Linux入侵检测之文件监控 5️⃣Linux入侵检测之syscall监控 6️⃣linux入侵检测之应急响应 0x01:Syscall简介 内核提供用户空间程序与内核空间进行交互的一套标准接口,这些接口让用户态程序能受限访问硬件设备,比如申请系统资源,操作设备读写,创建新进程等。用户空间发生请求,内核空间负责执行,这些接口便是用户空
内核模块是Linux操作系统中一个比较独特的机制。通过这一章学习,希望能够理解Linux提出内核模块这个机制的意义;理解并掌握Linux实现内核模块机制的基本技术路线;运用Linux提供的工具和命令,掌握操作内核模块的方法。
我们测试驱动加载是否正常工作,一般都会写应用程序去测试,这样驱动程序中需要实现 open、read 函数和 write 函数,然后写一个应用程序通过 open 打开节点,获取 fb 文件描述符,进而对文件进行读写操作。
之前的几篇文章(从i.MX6ULL嵌入式Linux开发1-uboot移植初探起),介绍了嵌入式了Linux的系统移植(uboot、内核与根文件系统)以及使用MfgTool工具将系统烧写到板子的EMMC中。
框架如何去加载所写的模块这是最核心的问题之一,好在Asp.Net Core MVC为模块化提供了一个部件管理类
几乎每个Linux驱动都有个module_init(与module_exit的定义在Init.h (/include/linux) 中)。没错,驱动的加载就靠它。为什么需要这样一个宏?原因是按照一般的编程想法,各部分的初始化函数会在一个固定的函数里调用比如:
从上文可以得出,start_kernel 函数最后调用的是 rest_init 函数,其实 rest_init 函数不光产生了最重要的 kernel_init (PID=1)和 kthreadd (PID=2)内核进程。
上一篇分享的:从单片机工程师的角度看嵌入式Linux中有简单提到Linux的三大类驱动:
在上一篇 《Jetson 中的 zram 技术详解》中已经介绍了相关 Zram 的技术部分以及如何在 Jetson 设备上使用 Zram,本篇文章将着重介绍下 Linux 内核中关于 Zram 的源码部分。
拿到一块YC2440(s3c2440)的开发板,经过几天的学习,我对arm-linux系统开发步骤有了一些认识。就以开发这个开发板为例,arm-linux开发工作大概分4个部分
开发过单片机的小伙伴可以看一下我之前的一篇文章从单片机开发到linux内核驱动,以浅显易懂的方式带你敲开Linux驱动开发的大门。
在windows下安装的python是带tab键自动补齐的而Linux自带的python版本过久,从新安装后没有tab键补齐功能,而且在交互模式下不小心打错了很麻烦。
在上一篇文章中Linux驱动实践:你知道【字符设备驱动程序】的两种写法吗?我们说过:字符设备的驱动程序,有两套不同的API函数,并且在文中详细演示了利用旧的API函数来编写驱动程序。
本文介绍了如何通过Linux内核定时器实现LED灯的闪烁,从硬件的配置、驱动程序以及示例代码方面进行了详细的阐述。通过申请GPIO、配置GPIO、编写驱动程序以及添加设备到内核和加载设备,最终实现了LED灯的闪烁。
__init__宏:被修饰的函数会被链接器链接放入.init.text段中(本来默认情况下函数是被放入.text段中)。对内核而言是一种暗示,表示该函数仅在初始化期间使用,内核启动时统一会加载.init.text段中的这些模块安装函数,加载完后就会把这个段给释放掉以节省内存。 __exit__宏:被修饰的函数仅用于模块卸载,链接器会将其放入特殊的ELF段。如果模块被直接内嵌到内核中,或内核的配置不允许卸载模块,则被修饰的函数将被简单的丢弃。 prink函数:模块在被加载到内核后,它能调用的函数仅仅是由内核导出的那些函数。KERN_INFO是printk的打印级别,其实只是一个字符串(如<1>)。操作系统的命令行中也会有一个打印级别的设置(值为0-7),当前操作系统中执行printk的时候会去对比printk中的打印级别和操作系统命令行中设置的打印级别,小于命令行设置级别的信息会被打印出来,大于的会被拦截。 module_init宏:该宏声明的函数会在模块被装载到内核中调用。 module_exit宏:该宏声明的函数会在模块被卸载时调用。 MODULE_LICENSE宏:指定该代码所使用的许可证协议。 MODULE_AUTHOR:描述模块作者。
3。1 module编程 module可以说是 Linux 的一大革新。有了 module 之后,写 device driver 不再是一项恶梦,修改 kernel 也不再是一件痛苦的事了。因为你不需要每次要测试 driver 就重新 compile kernel 一次。那简直是会累死人。Module 可以允许我们动态的改变 kernel,加载 device driver,而且它也能缩短我们driver development 的时间。在这篇文章里,我将要跟各位介绍一下 module 的原理,以及如何写一个 module。
在上一篇文章如何方便快速的整编Android 9.0系统源码? )中,我们对系统源码进行了编译,这篇文章我们接着来学习如何将系统源码导入到编辑器中,以便于查看和调试源码。关于查看源码,可以使用Android Studio、Eclipse、Sublime、Source Insight等软件,这里我推荐使用Source Insight,但是有的同学可能不是很习惯,而且Source Insight是Windows平台的软件,Mac平台用不了,那么使用Android Studio是一个不错的选择,而且使用Android Studio还可以调试源码。这篇文章就来介绍Source Insight和Android Studio如何导入源码。
devfs(设备文件系统)是由Linux2.4内核引入的,它的出现主要使得设备驱动程序能够自主管理自己的设备文件。具体来说,devfs具有如下优点:
Linux kernel在自身初始化完成之后,需要能够找到并运行第一个用户程序(这个程序通常叫做“init”程序)。用户程序存在于文件系统之中,因此,内核必须找到并挂载一个文件系统才可以成功完成系统的引导过程。
如果我们想注入一个Rootkit到内核,同时不想被侦测到,那么我们需要做的是精妙的隐藏,并保持低调静悄悄,这个话题我已经谈过了,诸如进程摘链,TCP链接摘链潜伏等等,详情参见:https://blog.csdn.net/dog250/article/details/105371830
最近需要开发一些内核模块,进行探究linux内核的一些特征,现在把一些遇到的比较好的文章和知识点,进行简要记录和备忘;
参考文档https://blog.csdn.net/weixin_43582101/article/details/108012579
我们就继续以此为基础,用保姆级的粒度一步一步操作,来讨论一下字符设备驱动程序的编写方法。
安装Apache Apache是一个基金会的名字,httpd才是我们要安装的软件包,早期它的名字就叫apache Apache官网www.apache.org wget http://mirrors.cnnic.cn/apache/httpd/httpd-2.4.29.tar.gz wget http://mirrors.cnnic.cn/apache/apr/apr-1.6.3.tar.gz wget http://mirrors.cnnic.cn/apache/apr/apr-util-1.6.1.ta
本文不一定适合比较老版本的Linux,如果只关心使用,请直接看“总结”,本文主要针对CentOS,其它Linux发行版本类似,但细节可能有出入,比如重启服务可能不是用systemctl,而是service等。
解决每一类问题都需要消耗大量的时间,特别是重新编译内核这种事情。于是,每一个Linux内核程序员或多或少都会掌握一些Hack技巧,以节省时间提高工作效率。
领取专属 10元无门槛券
手把手带您无忧上云