LinuxGod

LinuxGod.net
Linux大神网——精选每一篇高品质的技术干货
  1. 首页
  2. 开源快讯
  3. 正文

【每日一题】Linux内核源码/kernel/pid.c

2022年12月4日 131点热度

linux论坛_嵌入linux u盘升级_嵌入式linux论坛

本文为看雪论坛优秀文章

看雪论坛作者ID:abcz316

Linux它是一款开源的内核系统。本人也非常喜欢嵌入式Linux系统,特别是它的内核源码,书写的风格,都非常讨我心欢。

这个驱动是之前业余的时候写的用于嵌入式开发版,点亮LED灯时候留下的,现在代码里已删除ioremap。不过对于新手来说,至少还是有学习价值的。

嵌入linux u盘升级_嵌入式linux论坛_linux论坛

源码仅供交流学习之用,不得用于非法用途。

同时为了避免不法分子将此驱动用在非法的用途,我后面也将附上侦测建议。如果您是游戏厂商,那么可以尝试听取我的侦测建议。

下面我将带大家分析这个驱动,看看驱动是怎么写出来的。

打开进程接口

在Linux内核里,不区分进程与线程。统一按照线程来看待。那么每个线程都有一个对应的pid_t、pid、task_struct。

他们之间的关系是这样的:

pid_t struct pid

nr为进程pid数值

#include  pid_t pid_vnr(struct pid *pid){    return pid_nr_ns(pid, current->nsproxy->pid_ns);}EXPORT_SYMBOL_GPL(pid_vnr); struct pid *find_pid_ns(int nr, struct pid_namespace *ns);EXPORT_SYMBOL_GPL(find_pid_ns); struct pid *find_vpid(int nr){    return find_pid_ns(nr, current->nsproxy->pid_ns);}EXPORT_SYMBOL_GPL(find_vpid); struct pid *find_get_pid(int nr){    struct pid *pid;     rcu_read_lock();    pid = get_pid(find_vpid(nr));    rcu_read_unlock();     return pid;}EXPORT_SYMBOL_GPL(find_get_pid); void put_pid(struct pid *pid);EXPORT_SYMBOL_GPL(put_pid);  struct pid * –> struct task_struct *  #include  struct pid *get_task_pid(sturct task_struct *task, enum pid_type);EXPORT_SYMBOL_GPL(get_task_pid); struct task_struct *pid_task(struct pid *pid, enum pid_type);EXPORT_SYMBOL(pid_task); struct task_struct *get_pid_task(struct pid *pid, enum pid_type){    struct task_struct *result;    rcu_read_lock();    result = pid_task(pid, type);    if (result)        get_task_struct(result);    rcu_read_unlock();    return result;}EXPORT_SYMBOL(get_pid_task); #include #define get_task_struct(tsk) do { atomic_inc(&(tsk)->usage); } while (0)static inline void put_task_struct(struct task_struct *t){    if (atomic_dec_and_test(&t->usage))        __put_task_struct(t);} void __put_task_struct(struct task_struct *t);EXPORT_SYMBOL_GPL(__put_task_struct);

看完以上的逻辑。大家是不是柳暗花明又一村嵌入式linux论坛,心里开朗了许多,他们之间是可以相互转换的。

linux论坛_嵌入式linux论坛_嵌入linux u盘升级

通过进程pid_t可以拿到pid,通过pid可以拿到task_struct。又可以反过来通过task_struct拿到进程pid。

关闭进程接口

驱动源码是使用put_pid将进程pid*的使用次数减去1。

在Linux内核源码/kernel/pid.c下可以看到:

void put_pid(struct pid *pid){    struct pid_namespace *ns;     if (!pid)        return;     ns = pid->numbers[pid->level].ns;    if ((atomic_read(&pid->count) == 1) ||         atomic_dec_and_test(&pid->count)) {        kmem_cache_free(ns->pid_cachep, pid);        put_pid_ns(ns);    }}EXPORT_SYMBOL_GPL(put_pid);

读、写进程内存接口

首先根据pid*用get_pid_task取出task_struct。再用get_task_mm取出mm_struct结构。因为这个结构包含了进程的内存信息。首先检查内存是否可读if (vma->vm_flags & VM_READ)。

如果可读。那么开始计算物理内存地址位置。由于Linux内核默认开启MMU机制,所以只能以页为单位计算物理内存地址。计算物理内存地址的方法有很多。

如pagemap、pgd pud pmd pte、get_user_pages驱动里演示pagemap。

其他方法可自行参考Linux内核源码/fs/proc/task_mmu.c。

知道了物理内存地址后,读、写物理内存地址linux模拟,Linux内核也有演示:drivers/char/mem.c。写的非常详细。最后还要注意MMU机制的离散内存,即buffer不连续问题。

获取进程内存块列表

这个接口没什么技术含量,都是照抄Linux内核源码的代码,fsproctask_mmu.c。

核心思想是通过task_struct取出mm_struct,接下来在mm_struct中遍历取出vma。

struct mm_struct {    struct vm_area_struct * mmap;        /* list of VMAs */    struct rb_root mm_rb;    struct vm_area_struct * mmap_cache;    /* last find_vma result */#ifdef CONFIG_MMU    unsigned long (*get_unmapped_area) (struct file *filp,                unsigned long addr, unsigned long len,                unsigned long pgoff, unsigned long flags);    void (*unmap_area) (struct mm_struct *mm, unsigned long addr);#endif    unsigned long mmap_base;        /* base of mmap area */    unsigned long mmap_legacy_base;         /* base of mmap area in bottom-up allocations */    unsigned long task_size;        /* size of task vm space */    unsigned long cached_hole_size;     /* if non-zero, the largest hole below free_area_cache */    unsigned long free_area_cache;        /* first hole of size cached_hole_size or larger */    unsigned long highest_vm_end;        /* highest vma end address */    pgd_t * pgd;    atomic_t mm_users;            /* How many users with user space? */    atomic_t mm_count;            /* How many references to "struct mm_struct" (users count as 1) */    int map_count;                /* number of VMAs */     spinlock_t page_table_lock;        /* Protects page tables and some counters */    struct rw_semaphore mmap_sem;     struct list_head mmlist;        /* List of maybe swapped mm's.    These are globally strung                         * together off init_mm.mmlist, and are protected                         * by mmlist_lock                         */      unsigned long hiwater_rss;    /* High-watermark of RSS usage */    unsigned long hiwater_vm;    /* High-water virtual memory usage */     unsigned long total_vm;        /* Total pages mapped */    unsigned long locked_vm;    /* Pages that have PG_mlocked set */    unsigned long pinned_vm;    /* Refcount permanently increased */    unsigned long shared_vm;    /* Shared pages (files) */    unsigned long exec_vm;        /* VM_EXEC & ~VM_WRITE */    unsigned long stack_vm;        /* VM_GROWSUP/DOWN */    unsigned long def_flags;    unsigned long nr_ptes;        /* Page table pages */    unsigned long start_code, end_code, start_data, end_data;    unsigned long start_brk, brk, start_stack;    unsigned long arg_start, arg_end, env_start, env_end;     unsigned long saved_auxv[AT_VECTOR_SIZE]; /* for /proc/PID/auxv */

获取进程命令行

mm_struct结构体里面有个arg_start变量嵌入式linux论坛,储存的地址值即进程命令行

为了避免不法分子将此驱动用在非法的用途, 在此给出侦测建议:

1. 检查是否有/dev/rwProcMem33此文件。

2. 检查SELinux是否被关闭。从安卓5.0启用SELinux后,APP想要与驱动进行通讯,必须得关闭SELinux,如果发现SELinux是关闭状态,并且是高版本的安卓系统,那么此安卓使用者必有问题。

检测SELinux的方法很多,如open打开某个文件、ioctl等等,如果SELinux是打开状态,那么这些都会直接返回EACCES (Permission denied),提示拒绝访问。

另外,在高版本的安卓系统中,如安卓10linux系统下载,如果SELinux是打开的状态,那么lsmod查看驱动列表,也会直接返回Permission denied拒绝访问,如果lsmod能直接显示驱动列表,那么此使用者的SELinux也是有问题的,有可能被关闭了的。

最后开源地址(含demo)

Github链接:

总结

首先,编译此源码需要一定的技巧,再者,手机在出厂时本身已设置多重障碍用来阻止第三方驱动的加载(即使你拥有root权限也无法加载),此源码仅供交流学习Linux系统使用。

- End -

嵌入式linux论坛_linux论坛_嵌入linux u盘升级

看雪ID:abcz316

*这里由看雪论坛 abcz316 原创,转载请注明来自看雪社区。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: android linux系统 pid 源码 物理内存
最后更新:2022年12月4日

Linux大神网

每日更新,欢迎收藏♥ 不积跬步无以至千里,加油,共勉。

点赞
< 上一篇
下一篇 >

Linux大神网

每日更新,欢迎收藏♥
不积跬步无以至千里,加油,共勉。

最新 热点 随机
最新 热点 随机
Linux默认的最大文件描述符数量是1024 关于LinuxQt安装教程及配置的回答及解决办法的 MySQL8.0的f配置文件是管理MySQL服务器的重要文件 局域网聊天软件简单介绍TOP1内网通传书 ARM嵌入式Linux系统开发详解.rar 一说unix/linux中对于文件操作的这几个函数 如何利用linux来开发属于自己的嵌入式Linux操作系统 腦/網絡>操作系統/系統-alternate-i386.iso(EXT)这几个版本有什么区别 精通unixshell脚本编程之文件描述符数ulimitulimit-n ubuntu离线安装软件 鸿蒙OS环境搭建过程中遇到的问题及解决方案 写入数据覆盖的分析与执行 解读Rainbond集群的安装和运维的原理,便于用户搭建Rainbond Linux基础知识:文件描述符、文件指针、索引节点 如何解决Linux下的无线网卡驱动的问题? linux 文件描述符 (师)-unused-fdKernel:2.6.14CPUarchitecture Linux系统下如何搭建SVN服务器,详细说明各配置项的功能 修改软件源文件、UI界面设置换源操作|Ubuntu Ubuntu14.04.2为例进行说明,其它Ubuntu版本与此类似 Linux图形界面用户和Windows用户来说获取系统硬件信息都不算问题 Ubuntu下换内核的过程及详细分析内核操作分析
ubuntu离线安装软件 鸿蒙OS环境搭建过程中遇到的问题及解决方案精通unixshell脚本编程之文件描述符数ulimitulimit-n腦/網絡>操作系統/系統-alternate-i386.iso(EXT)这几个版本有什么区别如何利用linux来开发属于自己的嵌入式Linux操作系统一说unix/linux中对于文件操作的这几个函数ARM嵌入式Linux系统开发详解.rar局域网聊天软件简单介绍TOP1内网通传书MySQL8.0的f配置文件是管理MySQL服务器的重要文件关于LinuxQt安装教程及配置的回答及解决办法的Linux默认的最大文件描述符数量是1024C语言教程-Qt.12安装教程05-27Linux有7个运行级别(关机,停机模式、DellG3)(Linux基础知识)文件压缩、打包命令解析的Linux操作系统怎样执行?LinuxDNS服务器,如何安装、配置和维护它?AMD2950x+技嘉x399免驱USB网卡,我的无线网卡linux解压gz文件命令 蓝易云香港五网CN2网络压缩比率的测试环境Linux系统中用于管理和控制系统服务的强大工具介绍围绕API创建封装器的开源项目正变得越来越流行主频93.75MHz的MIPS64NECVR4300处理器在N64上运行
Linux定时器的使用内核定时器是内核用来控制在未来某个时间点 Linux游戏起源于最受欢迎的游戏平台:SteamOS介绍 unix系统和linux系统 深入剖析Unix和Linux系统:全面解读技术细节 豆瓣高评分书籍,快来看看你都读过哪几本? Linux系统中如何卸载自带的OpenJDK?教程来了 轻松掌握Ubuntu软件安装:查看已安装软件 如何在Linux的命令行中使用speedtest-cli来测试宽带连接速度 详解Linux安装JDK步骤,轻松配置开发环境 谷歌更新Linux内核构建的公共内核库:添加对kokoro作业的支持 系统消耗掉了29M的内存是被谁消耗掉的? TeXLive和MiKTeX两大主要发行版的镜像配置方法 共享一个页表和一块物理内存的区别与联系导航 新手重装win7系统步骤和教程,你知道怎么操作吗 Linux发行版的学习方法与学习中应该注意的一些事 再传到linux2.配置数据库的环境和路径3.登陆数据库修改 本篇通过LinuxOS文件操作系统函数实现copy底层实现命令 0渗透操作0x02绕过disable_functions插件(组图) 第三方源安装显卡驱动安装后不能使用卸载 【Linux基础知识】ubuntu下可执行文件的基本知识点总结 Ubuntu自带的显卡驱动Nouveau会与N卡冲突导致卡机黑屏
标签聚合
操作 文件目录 sudo linux服务器 命令 软件 文件 命令模式 linux系统 虚拟机
书籍
课程
技术群
技术干货大合集↓
  • 2023年6月 / 26篇
  • 2023年5月 / 93篇
  • 2023年4月 / 90篇
  • 2023年3月 / 129篇
  • 2023年2月 / 84篇
  • 2023年1月 / 161篇
  • 2022年12月 / 187篇
  • 2022年11月 / 76篇
友情链接:

Linux书籍 | Linux命令 | Linux系统 | RHCE红帽认证 | Linux软件 | Linux教程 | CentOS系统 | Linux内核 | Linux服务器 | Linux大神 | IT资源

COPYRIGHT © 2023 linuxgod.net ALL RIGHTS RESERVED.