Linux实践 | 如何打补丁 和 使用proc

3人阅读 评论(0) 收藏 举报
分类:

作业:
1.通过模块传参,传入进程名隐藏相应进程
2.将tasklist.c与修改后的tasklist.c生成补丁

1.创建显示系统进程信息的proc模块

前置内容:
创建显示系统进程信息的proc模块
模块传参

1 编写tasklist.c

2 安装模块(参数传递 就是在这里传参的

sudo insmod tasklist.ko hide_task_name=systemd

3 查看模块

lsmod

这里写图片描述
4 卸载模块

sudo rmmod tasklist.ko

tasklist.c代码如下:

//-------------------------------------------------------------------
//  tasklist.c: 本内核文件创建一个proc伪文件,'/proc/tasklist'
//  通过如下命令可以显示系统中所有进程的部分信息
//  注意:Makefile文件必须正确放置在当前目录下。
//  编译命令: make 
//  内核模块添加:$sudo insmod tasklist.ko
//  添加内核模块后读取并信息tasklist内核信息: $ cat /proc/tasklist
//  内核模块删除:$sudo rmmod tasklist
//  NOTE: Written and tested with Linux kernel version 4.15.6 
//  strace函数可用于追踪系统调用,命令格式如下所示:
//  $ strace cat /proc/tasklist
//-------------------------------------------------------------------

#include <linux/module.h>   // for init_module() 
#include <linux/proc_fs.h>  // for create_proc_info_entry() 
#include <linux/sched/task.h>   // for init_task
#include <linux/seq_file.h> // for sequence files
#include <linux/slab.h>       // for kzalloc, kfree  
#include <linux/sched/signal.h>   //for next_task
char modname[] = "tasklist";
struct task_struct  *task;
int  taskcounts=0;          // 'global' so value will be retained

static char *hide_task_name;
module_param(hide_task_name, charp, 0);


static void * my_seq_start(struct seq_file *m, loff_t *pos)
{
   ///printk(KERN_INFO"Invoke start\n");   //可以输出调试信息
   if ( *pos == 0 )  // 表示遍历开始
   {
       task = &init_task;   //遍历开始的记录地址
       return &task;   //返回一个非零值表示开始遍历
  }
  else //遍历过程中
  { 
    if (task == &init_task )    //重新回到初始地址,退出
        return NULL;
    return (void*)pos   ;//否则返回一个非零值
  }  
}
static int my_seq_show(struct seq_file *m, void *v)
{//获取进程的相关信息
  //printk(KERN_INFO"Invoke show\n");
  //输出进程序号              
  seq_printf( m,  "#%-3d\t %d\t %ld\t %s",taskcounts++, task->pid,task->state,task->comm );  
  //输出进程pid?
  //输出进程state?
  //输出进程名称(comm)?
  seq_puts( m, "\n" );                    
  return 0; 
}

static void * my_seq_next(struct seq_file *m, void *v, loff_t *pos)
{
  //printk(KERN_INFO"Invoke next\n");  
 task=next_task(task);
 if (!(strcmp(task->comm ,hide_task_name)))
    task=next_task(task);
 (*pos)++;   
  //task指向下一个进程?
  return NULL;

}
static void my_seq_stop(struct seq_file *m, void *v)
{
    //printk(KERN_INFO"Invoke stop\n");     
    // do nothing        
}

static struct seq_operations my_seq_fops = {//序列文件记录操作函数集合
        .start  = my_seq_start,
        .next   = my_seq_next,
        .stop   = my_seq_stop,
        .show   = my_seq_show
};

static int my_open(struct inode *inode, struct file *file)  
{  
    return seq_open(file, &my_seq_fops); //打开序列文件并关联my_seq_fops
}  


static const struct file_operations my_proc =   
{  //proc文件操作函数集合
    .owner      = THIS_MODULE,  
    .open       = my_open,
    .read       = seq_read,     
    .llseek     = seq_lseek,
    .release    = seq_release       
}; 

int __init my_init( void )
{
    struct proc_dir_entry* my_proc_entry;
    printk( "<1>\nInstalling \'%s\' module\n", modname );
    my_proc_entry = proc_create(modname, 0x644, NULL, &my_proc);//生成proc文件
    if (NULL == my_proc_entry)
    {
        return -ENOMEM;
    }
    return  0;  //SUCCESS
}

void __exit my_exit( void )
{
    remove_proc_entry( modname, NULL );//删除proc文件
    printk( "<1>Removing \'%s\' module\n", modname );   
}

module_init(my_init);
module_exit(my_exit);
MODULE_LICENSE("GPL"); 

2.将tasklist.c与修改后的tasklist.c生成补丁

tasklist.c 原始文件

tasklist_o.c 修改好的文件

1、 生成补丁

diff -uN tasklist.c tasklist_o.c > x.patch

这里写图片描述
2、 给tasklist.c 打上补丁

patch tasklist.c < x.patch

这里写图片描述
x.patch

—源文件
+++变化后的文件
@@ -21,6 +21,10 @@变化位置
+添加内容
-删除内容

由于历史原因,diff有三种格式:
* 正常格式(normal diff)
* 上下文格式(context diff)
* 合并格式(unified diff)<——本文中看到的这种

--- tasklist.c  2018-04-15 07:17:38.997622096 -0700
+++ tasklist_o.c        2018-04-15 07:18:25.763577015 -0700
@@ -21,6 +21,10 @@
 struct task_struct  *task;
 int  taskcounts=0;                     // 'global' so value will be retained

+static char *hide_task_name;
+module_param(hide_task_name, charp, 0);
+
+
 static void * my_seq_start(struct seq_file *m, loff_t *pos)
 {
    ///printk(KERN_INFO"Invoke start\n");   //可以输出调试信息
@@ -40,7 +44,7 @@
 {//获取进程的相关信息
   //printk(KERN_INFO"Invoke show\n");
   //输出进程序号
-  seq_printf( m,  "#%-3d\t ", taskcounts++ );  
+  seq_printf( m,  "#%-3d\t %d\t %ld\t %s",taskcounts++, task->pid,task->state,task->comm );  
   //输出进程pid?
   //输出进程state?
   //输出进程名称(comm)?
@@ -51,7 +55,10 @@
 static void * my_seq_next(struct seq_file *m, void *v, loff_t *pos)
 {
   //printk(KERN_INFO"Invoke next\n");
-  (*pos)++;   
+ task=next_task(task);
+ if (!(strcmp(task->comm ,hide_task_name)))
+       task=next_task(task);
+ (*pos)++;   
   //task指向下一个进程?
   return NULL;

这里写图片描述

查看评论

Linux下patch打补丁命令

此命令用于为特定软件包打补丁,他使用diff命令对源文件进行操作。 基本命令语法: patch [-R] {-p(n)} [--dry-run] p:为path的缩写。 n:指将patch文件中的p...
  • MAOTIANWANG
  • MAOTIANWANG
  • 2013-09-05 09:28:16
  • 17850

Oracle数据库如何打补丁

1.数据库打补丁 2.回退
  • dbLjy2015
  • dbLjy2015
  • 2016-09-03 21:29:13
  • 389

Linux下使用diff和patch制作及打补丁(已经实践可行!)

在做开发的过程中难免需要给内核及下载的一些源码打补丁,所以我们先学习下Linux下使用如如何使用diff制作补丁以及如何使用patch打补丁。 通过diff命令比较出新旧版本之间的差异,并以pa...
  • tao_627
  • tao_627
  • 2016-10-26 22:37:25
  • 2994

Linux打补丁的一些问题

类unix操作系统有一个很有趣的特性就是源代码级的补丁包。在windows上我们打补丁都是运行一个可执行的程序,然后就可以把补丁打完了,这对于最终用户是非常方便的,但是对我们这些求知欲比较强的Linu...
  • youyoufengxinzi
  • youyoufengxinzi
  • 2007-02-28 11:14:00
  • 5406

怎样为Linux内核打补丁

在Linux内核邮件列表中一个经常被问到的问题就是怎样为Linux内核打一个补丁,或者更具体一点说,存在这么多的主干/分支,一个补丁到底要打在哪个版本的基础内核上。希望这篇文档能够为你解释明白这一点。...
  • vrix
  • vrix
  • 2009-08-27 09:06:00
  • 2356

使用 proc 文件系统来访问 Linux 内核的内容

  • 2011年09月28日 00:21
  • 177KB
  • 下载

Linux下打补丁

把改好的u-boot-2010.09复制到文件夹patch,将u-boot-2010.09重命名为u-boot-2010.09-fl2440 进入u-boot-2010.09-fl2440,先make...
  • lumqi
  • lumqi
  • 2017-04-18 09:16:06
  • 370

linux proc目录和常用操作

------------------------------------------------/proc-----------------------------------------------...
  • shenhuxi_yu
  • shenhuxi_yu
  • 2016-11-30 17:04:32
  • 1919

linux内核补丁安装和编译安装

一、简介        内核,是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。Linux作为一个自由软件,在广大爱好者的支持下,内核版本不断...
  • taiyang1987912
  • taiyang1987912
  • 2015-01-15 23:37:35
  • 5983

Linux下给内核或源码制作和打补丁操作命令--diff、patch

前言 在做开发的过程中难免需要给内核及下载的一些源码打补丁或者说是升级,所以我们学习在Linux下使用diff制作补丁以及如何使用patch打补丁显得尤为重要。 diff与patch命令介绍 1、 d...
  • xiewenhao12
  • xiewenhao12
  • 2016-11-28 13:36:45
  • 1299
    个人资料
    持之以恒
    等级:
    访问量: 1647
    积分: 470
    排名: 10万+
    文章存档
    最新评论