![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux 驱动开发
文章平均质量分 56
Configure-Handler
这个作者很懒,什么都没留下…
展开
-
Linux 内核获取函数size
还是要骚操作获取,在内核中没有看到直接获取函数。,从计算的结果来看,加上偏移与调用栈打印的函数。对目标文件进行反汇编,从汇编代码中计算。是函数在代码中的偏移量。表示函数的总大小(以字节为单位)。,因此也可以直接调用该函数获取函数。,免去上述复杂的字符串解析过程。表示函数内部代码的偏移量,为动态打印进程调用栈信息。获取到的字符串信息示例为。,这种方式需要从数组。原创 2024-03-01 09:04:33 · 750 阅读 · 0 评论 -
查找文件所在磁盘扇区
它提供了与 ext 文件系统相关的功能,如查看和修改文件系统的超级块、组描述符、索引节点等。可以看到,文件所属的块设备为 /dev/sdb,挂载点是/media/curtis/58506ab8-491f-4d42-a643-1fe7576d742f。提示信息已经可以很明显的看出挂在失败的原因,文件系统超级块存在问题,根本原因是U盘没有正确的格式化。表述的是逻辑扇区号,所以需要获取文件系统的块大小,如上所示,文件系统的块大小为4k。代表的是文件所在的逻辑扇区号,有可能是连续,也有可能不连续。原创 2023-06-29 07:53:11 · 1106 阅读 · 0 评论 -
内核延迟执行-sleep-dealy
内核延迟原创 2023-03-18 09:51:42 · 492 阅读 · 0 评论 -
内核中的高精度定时器
内核启动hrtimer使用原创 2023-03-18 08:39:16 · 863 阅读 · 0 评论 -
Linux一个Makefile编译多个内核驱动
驱动编译原创 2023-02-24 08:29:04 · 1154 阅读 · 0 评论 -
Linux用户态进程虚拟地址转物理页帧
虚拟地址,物理页帧原创 2023-02-24 08:28:25 · 179 阅读 · 0 评论 -
procfs 命令行参数解析
procfs参数解析原创 2023-02-19 14:14:03 · 192 阅读 · 0 评论 -
内核IS_ERR、PTR_ERR、ERR_PTR宏
IS_ERR用法原创 2023-02-18 18:06:53 · 299 阅读 · 0 评论 -
procfs
procfs原创 2023-02-17 09:42:13 · 384 阅读 · 0 评论 -
Linux 内核获取一定范围内的随机数
linux 内核获取一定范围内的随机数原创 2023-02-16 10:10:10 · 1195 阅读 · 0 评论 -
内核中的RCU锁
RCU锁原创 2022-11-26 21:04:28 · 1276 阅读 · 0 评论 -
内核中的信号量
内核信号量原创 2022-11-26 10:32:27 · 418 阅读 · 0 评论 -
linux 内核工作延迟机制-softirq-tasklet
tasklet原创 2022-11-18 08:19:11 · 467 阅读 · 0 评论 -
内核中自旋锁spinlock的使用
内核自旋锁原创 2022-11-13 16:02:02 · 529 阅读 · 0 评论 -
内核中的互斥锁的使用
内核互斥锁原创 2022-11-13 11:23:51 · 638 阅读 · 0 评论 -
linux 内核等待队列
等待队列原创 2022-11-12 16:03:23 · 723 阅读 · 0 评论 -
内核中的container_of
container_of原创 2022-11-12 13:23:10 · 83 阅读 · 0 评论 -
内核驱动获取所有进程的cmdline
内核驱动获取所有进程的cmdline一、用户态获取进程的cmdline# 查看/proc/pid/cmdline文件即可$cat /proc/pid/cmdline二、内核态获取进程cmdlinefor_each_process用于遍历Linux所有进程#define for_each_process(p) \ for (p = &init_task ; (p = next_task(p)) != &init_task ; )get_cmdlineroo原创 2022-03-04 08:26:14 · 3656 阅读 · 0 评论 -
Linux Netlink的使用方法
Linux Netlink的使用方法一、Netlink用户态构建过程1、创建一个基于自定义端口NETLINK_TEST的socket。#define NETLINK_TEST 99skfd = socket(AF_NETLINK, SOCK_RAW, NETLINK_TEST); //Create a socket using user defined protocol NETLINK_TEST.if (skfd == -1) { perror("create socket error\n")原创 2021-12-29 08:12:24 · 4399 阅读 · 2 评论 -
内核常用调试函数
内核常用调试函数一、print_hex_dump()该函数用来在内核打印二进制数据,还是非常好用的,不需要在驱动自己去实现。/** * print_hex_dump - print a text hex dump to syslog for a binary blob of data * @level: kernel log level (e.g. KERN_DEBUG) * @prefix_str: string to prefix each line with; * caller sup原创 2021-12-25 15:23:13 · 4355 阅读 · 2 评论 -
Linux 内核读写文件
Linux 内核读写文件需要调试的驱动程中读写文件数据,比如说当驱动需要记录的日志比较多的情况下,可以将printk()函数打印的信息都写到文件做后续分析。在kernel中操作文件没有标准库可用,需要利用kernel的一些函数,这些函数主要有: filp_open() filp_close(), kernel_read(),kernel_write()这些函数在linux/fs.h和asm/uaccess.h头文件中声明。下面介绍主要步骤:一、打开文件filp_open()在kernel中可以打开文件原创 2021-12-21 08:14:15 · 13306 阅读 · 5 评论 -
Linux内核定标准定时器
Linux驱动定时器的使用一、结构体定义在Linux kernel-5.11中内核对定时器的定义:#include/linux/timer.hstruct timer_list { /* * All fields that change during normal runtime grouped to the * same cacheline */ struct hlist_node entry; //定时器的链表 unsigned long expires; //以节拍为单位的原创 2021-10-09 16:28:40 · 6190 阅读 · 0 评论 -
Linux内核未导出符号使用方法
Linux内核未导出符号使用方法一、背景在写内核驱动程序的过程中,往往可以看到一些内核并没有被导出,而刚好在做开发的过程中需要用到,这个时候就要想办法使用内核未导出函数,但是处于linux内核代码段的函数,这里简单分享下怎么处理这些函数。二、实例分析涉及函数kallsyms_lookup_name()//内核函数原型,为导出函数,用于找到输入函数名所对应的函数入口地址#include <linux/kallsyms.h>/* Lookup the address for this原创 2021-08-19 16:08:44 · 7011 阅读 · 1 评论 -
Linux 驱动根据struct file获取全路径和文件名
vfs层获取文件全路径原创 2021-08-19 15:39:55 · 9683 阅读 · 0 评论 -
Linux内核驱动读进程vm_area
Linux内核驱动读进程vm_area一、进程地址空间组织形式每个程序编译链接后形成的的二进制映像文件有一个代码段Text和数据段BSS和Data,进程运行时必须有独占的堆(Heap)和(Stack)栈空间。链接器和库函数都有自己的代码段(Text)和数据段(BSS和Data)。进程要映射的文件被映射到内存映射区(Memory Mapping Region)。Linux把进程的用户空间划分为若干个区间,便于管理,这些区间成为虚拟内存区域(简称vma)。一个进程的用户地址空间主要由m原创 2021-06-17 10:18:36 · 364 阅读 · 0 评论 -
Linux 驱动读取当前内核中代码段数据
直接上代码,思路就是得到代码段的起始地址和结束地址,然后先将数据存在一个buffer中,最后写入文件。kallsym.c#include <linux/init.h>#include <linux/module.h>#include <linux/kallsyms.h>static char *path = NULL;module_param(path, charp, S_IRUGO);static int __write_to_file(char *b原创 2021-04-15 15:53:38 · 4883 阅读 · 0 评论 -
Linux misc机制创建设备
misc device被称为杂项设备,Linux内核把一些不符合预先确定的字符设备划分为杂项设备,这类设备的主设备号是10,Linux内核使用struct miscdevice数据结构描述这类设备struct miscdevice所对应的结构体和包含路径:Linux 内核提供了注册杂项设备的两个接口函数,驱动程序采用misc_register()函数来注册。它会自动创建设备节点,不需要使用mknod创建文件节点,因此使用misc机制来创建字符设备驱动是比较方便;函数的声明在:drivers/cha原创 2020-12-28 20:00:12 · 444 阅读 · 0 评论 -
通过dmesg crash信息调试驱动代码
最近在给一个驱动程序添加一个功能 --> 通过给定的进程名找到对应进程的pid号,但是遇到了crash的情况,我们一起找找问题出在哪里!首先给到dmesg中的crash信息:[ 4534.975026] BUG: unable to handle kernel NULL pointer dereference at 0000000000000430[ 4534.976059] IP: [<ffffffffc0747e78>] bts_write+0x1b8/0x830 [bts][原创 2020-11-12 19:53:32 · 3033 阅读 · 0 评论 -
find_get_pid()
内核代码中函数定义的格式:extern struct pid *find_get_pid(int nr);struct pid *find_get_pid(pid_t nr){ struct pid *pid; rcu_read_lock(); pid = get_pid(find_vpid(nr)); rcu_read_unlock(); return pid;}EXPORT_SYMBOL_GPL(find_get_pid);struct pid{ atomic_t原创 2020-11-11 15:03:37 · 1472 阅读 · 0 评论 -
Linux create_workque()例程
test.c#include <linux/module.h>#include <linux/init.h>#include <linux/string.h>#include <linux/list.h>#include <linux/sysfs.h>#include <linux/ctype.h>#include <linux/workqueue.h>#include <linux/delay.h&原创 2020-10-14 14:51:49 · 1925 阅读 · 0 评论 -
Linux驱动make命令没有生成ko文件
在学习驱动程序的过程中,做的最多的一件事情就是从文章中直接把代码copy回去,直接就Makefile了,但是也会遇到标题类似的问题:curtis@curtis-virtual-machine:~/Desktop/test$ lsMakefile test.ccurtis@curtis-virtual-machine:~/Desktop/test$ vim Makefile curtis@curtis-virtual-machine:~/Desktop/test$ makemake -C /lib原创 2020-09-28 15:28:20 · 6561 阅读 · 2 评论 -
抓取sys_call_table 地址 x86_64
在网上看到很多文章是通过驱动内联汇编拿到idt地址,但是在x86_64上确跑不起来,还宕机,来一起唠唠。先说说网上同行说自己使用以下代码去解析sys_call_table 地址lkm.c//lkm.c#include <linux/init.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/errno.h>#include <linux/types.h&原创 2020-09-18 15:51:27 · 2035 阅读 · 1 评论 -
linux ubuntu 内核升级
初始和目标系统版本如下所示3.13.0-32-generic ---> 4.2.0-42-generic在网上也找了很多办法来升级,相对来说都比较慢,这里提供最快的升级方法:也就是直接在ubuntu官网下载对应的deb安装包就可以,安装方法也比较简单linux-headers-4.2.0-42_4.2.0-42.49_14.04.1_all.deblinux-headers-4.2.0-42-generic_4.2.0-42.49_14.04.1_amd64.deblinux-imag原创 2020-09-18 10:40:39 · 1586 阅读 · 0 评论 -
Linux 抓取sys_call_table地址
本文主要介绍三种方法抓取sys_call_table的地址方法一:以sys_close为参考,遍历内存方法二:直接抓/proc/kallsyms方法三:调用函数kallsyms_lookup_name(“sys_call_table”)#include <linux/module.h>#include <linux/fs.h>#include <linux/syscalls.h>#include <linux/kallsyms.h>MODULE原创 2020-09-10 15:43:31 · 1964 阅读 · 1 评论 -
Linux 驱动例程
这是一个较为完整的Linux驱动的例程编译环境:curtis@curtis-virtual-machine:~/Desktop/tdriver$ uname -r5.4.0-42-genericcurtis@curtis-virtual-machine:~/Desktop/tdriver$ cat /etc/os-release NAME="Ubuntu"VERSION="18.04.4 LTS (Bionic Beaver)"ID=ubuntuID_LIKE=debianPRETTY_N原创 2020-09-07 16:44:37 · 1523 阅读 · 0 评论