linux内核
文章平均质量分 67
内核安全
securitysun
分享个人历年来工作中整理的笔记
展开
-
linux chrdev字符设备驱动程序示例
下面代码是一个linux内核模块,用于实现一个简单的字符设备驱动程序示例。示例代码实现了一个简单的字符设备驱动程序,可以读取和写入内核缓冲区中的数据。原创 2023-10-12 09:20:51 · 167 阅读 · 0 评论 -
linux ioctl驱动作用及程序示例
linux操作系统的目标之一是向用户掩盖系统硬件设备的特殊性。驱动程序调用步骤:应用程序、库、内核、驱动、硬件。linux嵌入式系统设备,例如:触摸屏、按键、 IIC总线、 LCD等是字符设备,他们特点是按字节流进行先后顺序读写操作设备的。ioctl是一种系统调用,用于在用户空间和内核空间之间传递控制命令。在Linux驱动程序中,ioctl通常用于实现设备驱动程序的控制接口。原创 2023-10-08 09:43:13 · 382 阅读 · 0 评论 -
fasync driver demo
Linux系统中的fasync用于设备驱动程序与用户空间之间的异步通信。它允许设备驱动程序通知用户空间的进程,当设备状态发生变化时,通过发送SIGIO信号来告知进程。具体来说,设备驱动程序可以调用fasync_helper()函数来注册一个或多个进程,当设备状态发生变化时,内核会自动发送SIGIO信号给这些进程。而用户空间进程可以通过调用fcntl()函数,并设置F_SETOWN标志来接收SIGIO信号。一旦接收到SIGIO信号,进程就可以执行相应的处理操作,如读取设备数据或进行其他操作。原创 2023-07-26 18:48:16 · 287 阅读 · 0 评论 -
linux系统用户态与内核态接口
简介用户空间与内核空间的交互方式如下,下面逐一详细说明。procfsnetlink文件io读写ioctldebugfssysfsprocfs:在Linux系统中,procfs是一种伪文件系统,它提供了一种以文件的形式访问内核数据结构和系统信息的接口。用户空间可以通过读取和写入/proc目录下的文件来与内核进行交互。netlink:Netlink是Linux内核中一种用于进程间通信的机制,它允许用户空间的进程与内核空间的进程进行双向通信。原创 2023-07-26 18:19:57 · 553 阅读 · 0 评论 -
udp tcp web tftp 单播 广播通信时序图
面向连接Web 服务器UDPTFTP单播广播原创 2022-01-17 09:58:04 · 600 阅读 · 0 评论 -
vivi bootloader启动过程分析
从嵌入式软件开发的层次划分来看,BootLoader位于开发的最顶层,其工作的顺利与否直接影响到系统其它层次(kernel、root、应用程序)的正常工作因此在嵌入式系统的固态存储设备上会设有相应的分区来存储、管理它们一个嵌入式Linux系统从软件的角度看通常可以分为四个层次:......原创 2022-02-22 09:35:08 · 195 阅读 · 0 评论 -
ROM、SDRAM、RAM、DRAM、SRAM、FLASH的区别
ROM和RAM指的都是半导体存储器,ROM是Read Only Memory的缩写,RAM是Random Access Memory的缩写。ROM在系统停止供电的时候仍然可以保持数据,而RAM通常都是在掉电之后就丢失数据,典型的RAM就是计算机的内存。RAM有两大类,一种称为静态RAM(Static RAM/SRAM),SRAM速度非常快,是目前读写最快的存储设备了,但是它也非常昂贵,所以只在要求很苛刻的地方使用,譬如CPU的一级缓冲,二级缓冲。另一种称为动态RAM(Dynamic RAM/DRA....原创 2022-01-15 15:12:22 · 1116 阅读 · 0 评论 -
Linux系统调用列表
以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数。这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完全也是很罕见的。按照惯例,这个列表以man pages第2节,即系统调用节为蓝本。按照笔者的理解,对其作了大致的分类,同时也作了一些小小的修改,删去了几个仅供内核使用,不允许用户调用的系统调用,对个别本人稍觉不妥的地方作了一些小的修改,并对所有列出的系统调用附上简要注释。其中有一些函数的作用完全原创 2022-01-15 14:21:56 · 649 阅读 · 0 评论 -
linux系统suid提权
SUID提权0x01什么是SUID SUID (Set UID)是Linux中的一种特殊权限,其功能为用户运行某个程序时,如果该程序有SUID权限,那么程序运行为进程时,进程的属主不是发起者,而是程序文件所属的属主。但是SUID权限的设置只针对二进制可执行文件,对于非可执行文件设置SUID没有任何意义. 在执行过程中,调用者会暂时获得该文件的所有者权限,且该权限只在程序执行的过程中有效. 通俗的来讲,假设我们现在有一个可执行文件ls,其属主为root,当我们通过非root用户登录时,如果原创 2021-05-19 11:19:41 · 5567 阅读 · 4 评论 -
linux内核中断返回调度标志是如何设置的
系统调用是常见一种类型的异常,也是应用代码从用户空间主动进入内核空间的唯一方式。运行在用户空间的进程会被动陷入到内核空间,进行中断处理程序的处理。中断处理程序处理完后返回到用户空间,在返回至用户空间之前,判断是否要进行进程调度。如果需要则再进行一次进程调度。futex_wake_op与fork一样最终执行check_preempt_curr函数。该函数做的就是给当前线程设置一个需要调度的标志,在下一次中断返回时进行一次调度。...原创 2022-06-07 19:53:07 · 1141 阅读 · 5 评论 -
ARM linux内核移植
Linux操作系统的内核代码主要是由具有跨平台特性的C语言编写的。并采用GNU软件体系,这使得它具有良好的可移植性。同时它也是一个开源操作系统,用户可以免费下载,并根据实际需要修改内核配置,提高系统的运行效能。linux内核移植概述嵌入式操作系统与计算机的硬件体系机构,特别是与处理器及外部设备密切相关。在一种处理器的开发板上运行的嵌入式操作系统往往不能在另一种处理器的开发板上运行。即使两个开发板处理器相同,如果外部设备不同,两个开发板也可能不能运行同一个嵌入式系统,这时就需要.原创 2022-05-07 12:20:51 · 1015 阅读 · 0 评论 -
linux proc文件系统驱动demo
linux proc文件系统驱动demo原创 2022-05-04 13:08:48 · 308 阅读 · 0 评论 -
linux系统网卡驱动编码实例
通过register_netdev注册网络设备。实现了网络中断。模拟网络硬件传输数据包。检查ip数据包。记录传输的数据包状态。手动释放sk_buffer。处理数据包传输超时情况。网络驱动接收网络数据包并将数据包放入TCP/IP上层,编写网络驱动接收数据包必须分配sk_buff结构来存储数据,sk_buff将在上层释放。原创 2022-05-03 10:49:31 · 555 阅读 · 0 评论 -
嵌入式linux文件系统简介
文件系统存储介质是Flash芯片,常用的嵌入式文件系统类型有Cramfs、JFF、Yaffs、网络文件系统等。制作嵌入式根文件系统一般使用开源的Busybox工具,Busybox在设计上充分考虑了硬件资源受限的特殊工作环境。使用JFFS2文件系统,需要把MTD编译到内核中,MTD提供MTD-CHAR和MTD-BLOCK这两个模块用于对Flash的访问。原创 2022-05-03 08:57:32 · 1426 阅读 · 0 评论 -
ARM9 2410系列开发板U-boot移植
ARM9 2410系列开发板U-boot移植U-boot的stage1代码通常放在start.s文件中,它用汇编语言写成,其主要功能如下:定义入口。一个可执行的Image必须有一个入口的,并且只能有一个全局入口,通常这个入口放在ROM(Flash)的0x0地址。设置异常向量。本地硬件设备初始化(设置CPU模式/关闭看门狗计时器/屏蔽中断等)。初始化内存控制器。如果从固态存储介质中启动,则复制bootloader的第二阶段到RAM。设置堆栈,跳转到stage2入口点。自此stage1执行原创 2022-05-02 20:27:48 · 711 阅读 · 0 评论 -
linux kernel内核版本升级
linux kernel内核版本升级http://vault.centos.org/7.5.1804/isos/x86_64/CentOS-7-x86_64-Minimal-1810.iso此处使用的是1804的版本[root@localhost ~]# uname -r3.10.0-862.el7.x86_64原创 2022-04-30 23:36:55 · 1752 阅读 · 0 评论 -
linux进程exit系统调用
用户态的进程退出时,通过exit系统调用进入到内核,cpu产生系统调用中断,处理该中断时查表sys_call_table找到系统调用号找到sys_exit,sys_exit找到do_exit函数执行。用户态exit()-->内核态中断处理el0_sync--->内核态el0_svc查找sys_call_table得到sys_execve函数地址执行--->内核态sys_exit--->内核态do_exit。原创 2022-04-28 22:53:24 · 949 阅读 · 0 评论 -
linux内核futex快速用户空间互斥体简介
futex是一种用户态和内核态混合的同步机制。通过在用户态检查,没有竞争就不陷入内核执行系统调用了。访问futex变量通知进程有竞争发生,则执行系统调用去完成相应的操作。进程、线程可以利用futex来进行同步。futex同步操作都应该从用户空间开始,创建一个futex整形同步变量。原创 2022-04-28 22:27:23 · 2059 阅读 · 0 评论 -
linux IDLE 0号进程分析
linux操作系统中第一个进程是0号进程是为道,主要任务是不断进行进程调度。内核在启动过程中第一个cpu进入start_kernel逻辑,这个逻辑是内核初始化入口。用用户态所有进程的祖先都是1号进程。init进程还给其它cpu创建IDLE进程。在rest_init方法中第一个cpu的IDLE进程调用kernel_thread创建了1号进程。原创 2022-04-28 12:32:59 · 940 阅读 · 0 评论 -
linux系统调用yield和pause进程让出cpu
每个进程对应一个 task_struct 数据结构,这个数据结构包含了进程的所有的信息。yield、pause让出cpu。运行在用户态的进程,想实现一些更底层的操作,可以通过syscall进入到内核态。yield系统调用就会使当前进程让出cpu,进行syscall系统调用。原创 2022-04-27 23:39:23 · 2119 阅读 · 0 评论 -
linux内核结构体说明
由于Linux的内核用c来编写,所以我们也按照这种结构化的思想来分析代码,但我还是希望从OO的角度来阐述这些细节。这个结构体的名字有驱动开发人员决定,比如说,鼠标可能有一个叫做mouse_dev的struct,键盘可能由一个keyboard_dev的struct(dev for device,我们做的只是设备驱动)。而这次我们来分析一下Linux内核源码中的一个usb-skeleton(就是usb驱动的骨架咯),自然,他定义的设备结构体就叫做usb-skel:struct usb_skel{...原创 2022-03-21 14:41:21 · 366 阅读 · 0 评论 -
linux kernel配置调试方法
Kernel 配置调试技巧安装新内核,记住 grub 的序号。 修改 grub.conf 把默认内核改为一个正常可用的内核,而不是新安装的内核 新内核的 kernel 启动行中,加入 panic=5,以使新内核启动失败后自动重启 使 grub 在下次重启后进入新内核,即,使新内核仅在下次重启作为默认内核。一旦发生再次重启,就会按照进入 grub.conf 指定的默认内核。 以 root 权限运行 grub 命令,进入 grub 命令行 在原创 2022-03-19 18:26:50 · 2534 阅读 · 0 评论 -
kdump无法生成vmcore文件 解决方法
kdump无法生成vmcore文件 解决方法1. 背景 kernel升级到4.9.18高版本后,开启kdump无法生成vmcore文件2. 原因 高版本kernel与kexec-tools里面的工具链不兼容3. CentOS7解决方法 升级kexec-tools rpm包中的命令/usr/sbin/kexec, /usr/sbin/vmcore-dmesg, /usr/sbin/makedumpfile a. ...原创 2022-03-10 19:49:58 · 2248 阅读 · 0 评论 -
linux本地权限提升漏洞CVE-2022-0847
The Dirty Pipe Vulnerability — The Dirty Pipe Vulnerability documentationMax Kellermann <max.kellermann@ionos.com>AbstractThis is the story of CVE-2022-0847, a vulnerability in the Linux kernel since 5.8 which allows overwriting data in arbit.转载 2022-03-10 19:40:53 · 787 阅读 · 0 评论 -
linux内核编译安装步骤
内核源码安装redhat维护的内核源码rpm包下载地址:Index of /rpm 包中的源码提取方式:zh/HowTos/I_need_the_Kernel_Source - CentOS Wiki解压源码包,copy /boot/config.xx.xx 文件,到解压目前原创 2022-03-10 14:14:37 · 1299 阅读 · 0 评论 -
内核模块代码覆盖率测试
对内核模块进行代码覆盖率测试时,所需要使用到的工具有:gcov-kernelgcov-kernel enables code coverage measurements for the Linux kernel and kernel modules. It is based on GCC’s gcov tool. gcov-kernel is available as a set of patches for Linux kernels 2.6.4 to 2.6.30. Starti...原创 2022-03-10 14:10:33 · 1963 阅读 · 0 评论 -
tcp kernel参数调优
tcp kernel参数调优原创 2022-03-10 13:55:13 · 436 阅读 · 0 评论 -
linux系统网络驱动简介
网络设备驱动是linux内核中三大类设备 驱动之一,它用来完成高层网络协议的底 层数据传输及设备控制 � 网络设备与其他两种设备的区别: �网络接口不存在于Linux的文件系统中,及 /dev下没有设备文件,用户通过套接口 socket函数使用网络 �网络除了响应来自内核的请求外,还需要处 理外界的异步数据 �除了数据处理,网络设备还要完成地址设置、 配置网络参数及流量统计等管理任务提到网卡不得不提一下网络分层模型,在 互联网发展过程中出现过两...原创 2022-01-21 10:13:54 · 3219 阅读 · 0 评论 -
Linux内核功能模块图
Linux内核是linux操作系统的核心部分,它实现了操作系统的五大功能模块:进程管理内存管理文件系统设备控制网络Linux内核的功能模块如下图:原创 2022-01-15 14:23:41 · 560 阅读 · 0 评论 -
linux系统网络驱动实战
/*************************************************************** *Project Name: virtual_netcard_driver *File Name: virt_net.c *Description: **************************************************************/#include <linux/module.h&..原创 2022-01-05 13:35:09 · 318 阅读 · 0 评论 -
linux系统块设备驱动实战
/*************************************************************** *Project Name: ramdisk driver *File Name: ramdisk_driver.c *Description: do not use the request queue of system **********************************************************.原创 2022-01-04 23:30:16 · 499 阅读 · 0 评论 -
linux系统块设备驱动简介
块设备 数据传输以块为单位,而字符以字节为单位 块设备对数据请求有缓冲区,因此可以调整 响应请求的顺序 牵涉到内核组件,主要与内核文件系统打交 道,有些晦涩,但我们不必了解这些,把重 心放在具体的块设备驱动上 常见的块设备 硬盘、光盘、SD卡、U盘。。。块设备基本概念 扇区(Sectors): 块设备硬件对数据管理的基本单位。通常,1个扇 区的大小为512byte。 块(Blocks): 由Linux制定对内核或文件系统等数据处理的基原创 2022-01-21 10:25:18 · 1237 阅读 · 0 评论 -
fastsocket对nginx节点cps处理能力的提升
前言针对网络传输性能对内核进行优化。fastsocket是针对单机性能优化,提升单机的cps。我们将把fastsocket的优化性能移植到内核中,提升其单机的cps性能。提升现在单机nginx的服务性能,预计cps的性能提升一倍,提升生产环境的传输性能。内核对nginx的性能瓶颈性能损耗主要在内核的三把锁accpet的全局队列的sk_lock锁new_inode中的全局inode_lock锁sock_alloc_file中的dcache_lock锁...原创 2022-01-04 10:52:22 · 357 阅读 · 0 评论 -
Linux操作系统中系统调用接口
进程控制 fork 创建一个新进程 clone 按指定条件创建子进程 execve 运行可执行文件 exit 终止进程 _exit 立即终止当前进程 getdtablesize 进程所能打开的最大文件数 getpgid 获取指定进程组标识号 setpgid 设置指定进程组标志号 getpgrp 获取当前进程组标识号 setpgrp 设置当前进程组标志号 getpid 获取进程标识号 getppi原创 2021-08-09 11:27:50 · 439 阅读 · 0 评论 -
OSI七层模型内核函数
linux OSI七层模型OSI七层模型通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯。每层对应协议:OSI模型 协议 7.应用层 例如HTTP、SMTP、SNMP、FTP、Telnet、SIP、SSH、NFS、RTSP、XMPP、Whois、ENRP、TLS 6.表示层 例如XDR、ASN.1、NCP、TLS、ASCII 5.会话层 例如ASAP、ISO 8327 / CCITT X.225、RPC、NetBIOS、Winsock、BSD原创 2021-06-01 18:04:26 · 154 阅读 · 0 评论 -
linux内核漏洞提权过程
获取 root 权限是 Linux 漏洞利用的终极目标。跟 Windows 中的 System 用户一样,root 用户拥有对操作系统的所有管理权限。在渗透中,有时候成功利用某些漏洞只会获取一个低权限用户,所以需要使用提权技巧,提升到权限更高的 root 用户,完全控制整个系统。一般来说,获取到低权限 shell 后我们通常会做下面几件事:1. 检测操作系统的发行版本2. 查看内核版本3. 检测当前用户权限4. 列举Suid文件5. 查看已经安装的包,程序,运行的服务,过期的版本可能有漏洞原创 2021-05-25 19:51:10 · 2394 阅读 · 0 评论 -
linux内核模块机制浅析
Linux允许用户通过插入模块,实现干预内核的目的。一直以来,对linux的模块机制都不够清晰,因此本文对内核模块的加载机制进行简单地分析。模块的Hello World!我们通过创建一个简单的模块进行测试。首先是源文件main.c和Makefile。florian@florian-pc:~/module$ cat main.c#include<linux/module.h>#include<linux/init.h>static int __ini...原创 2021-03-17 16:00:53 · 336 阅读 · 0 评论 -
内核模块加载过程分析
章地址如下:ELF文件格式解析https://blog.csdn.net/zj82448191/article/details/108441447在用户空间,用insmod这样的命令来向内核空间安装一个内核模块,本章将详细讨论模块加载时的内核行为,当我们加载一个模块时,insmod会首先利用文件系统的接口将其数据读取到用户空间的一段内存中,然后通过系统调用sys_init_module,让内核去处理加载的整个过程。一、sys_init_module函数分析我们把sys_init_module转载 2021-01-28 20:34:35 · 1332 阅读 · 0 评论