展开

关键词

Linux内核源码分析 - 系统调用

本文以x86_64平台为例,分析linux下的系统调用是如何被执行的。 假设目标系统调用是write,其对应的内核源码为: // fs/read_write.c SYSCALL_DEFINE3(write, unsigned int, fd, const char __user size_t, count) { return ksys_write(fd, buf, count); } 这里主要看下SYSCALL_DEFINE3这个宏定义: // include/linux 到这里,我们基本可以猜测,肯定有个地方是根据系统调用的编号,到数组sys_call_table中找到对应方法,然后调用。 Runs on 64-bit Linux only. # To assemble and run: # # gcc -c hello.s && ld hello.o && .

1.7K22

Linux内核如何替换内核函数并调用原始函数

所以说,本文特指HOOK内核函数的做法。毕竟内核重新编译,重启设备代价非常大。 下面是一个代码,我稍后会针对这个代码,说几个细节方面的东西: #include <linux/kernel.h> #include <linux/kprobes.h> #include <linux/cpu.h , const struct nf_hook_state *state) { printk("hook stub conntrack\n"); return 0; } // 这是我们的hook函数,当内核调用 在本例中,显然n是5,符合如今Linux内核函数第一条指令几乎都是callq xxx的惯例。 阅码场"是专业的Linux及系统软件技术交流社区,企业和Linux人才的连接枢纽。

76520
  • 广告
    关闭

    腾讯云校园大使火热招募中!

    开学季邀新,赢腾讯内推实习机会

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux内核源码分析 - 系统调用 . 续

    上一篇文章 Linux内核源码分析 - 系统调用 中分析了linux下的系统调用在kernel space层是如何实现的,现在我们来分析下user space层的实现。 上篇结尾讲到我们可以使用syscall机器指令来调用系统调用,那如何指定系统调用的编号及参数,以及如何获取返回值呢? 详细介绍可以参考这篇文章: http://man7.org/linux/man-pages/man2/syscall.2.html 简而言之就是通过一定的约定来实现指定系统调用编号和传递参数及返回值。 Runs on 64-bit Linux only. # To assemble and run: # # gcc -c hello.s && ld hello.o && . 我们再来看下对应的glibc的代码: // sysdeps/unix/sysv/linux/write.c /* Write NBYTES of BUF to FD.

    42240

    Linux 内核0.11 系统调用详解(下)

    ,从一个系统内核系统函数创建的小实验来学习系统内核具体做了些什么。 等等,linux 0.11内核源码的编写与编译,需要在虚拟机模拟x86环境的情况下进行,这在我的Windows下用Bochs编译运行Linux-0.11有详细阐述,不再赘述。 #### int 0x80 --linux 系统调用入口点(调用中断int 0x80,eax 中是调用号)。 目录:/linux/include/unist.h(修改) // 以下是内核实现的系统调用符号常数,用于作为系统调用函数表中的索引值。 重新编译下Linux内核

    1.1K30

    Linux 内核0.11 系统调用详解(上)

    https://blog.csdn.net/u014688145/article/details/50608829 备注:本文通过三个问题,引出Linux 内核0.11的系统调用。 由图可以看出,从操作系统的角度来看,一台计算机主要分为两级:用户级以及内核级,系统调用主要作用就是连接用户级和内核级的“插座”。 对底层的操作,如果不通过系统调用限制,会发生用户应用程序修改系统内核等误操作,造成操作系统运行瞬间奔溃,考虑到系统的稳定性、安全性等问题,我们需要向上提供接口,限制应用层连入内核的权限。 因此,自然而然的一个想法就是,通过对与内核模块代码段,数据段和对用户区的代码数据段做区分来阻止用户直接访问内核模块。Linux内核通过建立段级保护机制来完成上述区分核心与用户态区域的功能。 系统调用,基本结束了,剩下的即是内核代码的编写。在下一节中,我们将在实际的操作系统编写两段内核代码函数,让用户程序能调用系统函数。尽请期待!o(∩_∩)o

    67231

    Linux动态为内核添加新的系统调用

    本文的主题依然不是劫持系统调用,而是添加系统调用,并且是动态添加系统调用,即在不重新编译内核的前提下添加系统调用,毕竟如果可以重新编译内核的话,那实在是没有意思。 我的问题是: Linux系统中如何获取以及修改当前进程的名字?? // 注意:不能调用kmalloc,vmalloc分配,因为在x86_64平台它们的地址无法被内核rel32跳转过来! text被copy到了新的页面,因此最好不要调用内核函数。 // 这是因为内核函数之间的互调使用的是rel32调用,这就需要校准偏移,太麻烦。// 记住:作为例子,不调用printk,也不调用memcpy/memset...如果想秀花活儿,自己去校准吧。

    49730

    Linux内核设备驱动之系统调用笔记整理

    linux中,系统调用是用户空间访问内核的唯一手段,除异常和中断外,他们是内核唯一的合法入口。系统调用的数量很少,在i386上只有大概300个左右。 应用程序–>C库–>内核的系统调用 从程序员的角度来看,系统调用无关紧要,他们只需要跟API打交道就可以了; 从内核的角度来看,内核只跟系统调用打交道,库函数及应用程序怎么使用系统调用不是内核所关心的。 include/asm/unistd.h中 (6)要实现系统调用需注意哪些方面 给linux添加一个系统调用不难,但怎么设计和实现一个系统调用是难题所在。 linux不提倡采用多用途的系统调用(根据不同的参数提供不同的功能)。 通常,系统调用靠c库支持,glibc不可能支持我们自己的系统调用,此时,需要借助linux本身提供的一组宏来对系统调用直接进行访问。

    54031

    Linux内核之旅张凯捷——系统调用分析(2)

    并且在linux-4.20内核,glibc-2.23版本环境下编写了用户态系统调用程序并对程序运行追踪分析。 3.3.2 linux4.20内核sysenter系统调用linux4.20内核中,对IA32_SYSENTER_EIP寄存器中传入的是entry_SYSENTER_32函数。 4.2 syscall系统调用初始化 基于linux-4.20内核源码进行分析: syscall系统调用初始化在内核启动执行路径中:start_kernel() -> trap_init() -> ,以及对linux-2.6.39和linux-4.20内核源码中支持快速系统调用相关部分进行分析,了解了进行系统调用的执行过程和内核对快速系统调用的相关操作。 下篇将基于Linux-5.0-rc2内核,添加系统调用,完成一个”系统调用日志收集系统“,并对系统调用分析进行总结。 ----

    63820

    Linux内核之旅张凯捷——系统调用分析(1)

    2 《Linux操作系统原理与应用》解释: 陈莉君老师的《Linux操作系统原理与应用(第二版)》对Linux系统调用解释为: 系统调用的实质就是函数调用,只是调用的函数是系统函数,处于内核态而已 用户在调用系统调用时会向内核传递一个系统调用号,然后系统调用处理程序通过此号从系统调用表中找到相应地内核函数执行(系统调用服务例程),最后返回。 3 总结 操作系统内核提供了许多服务,服务在物理表现上为内核空间的函数,系统调用即为在用户空间对这些内核提供服务的请求,即在用户空间程序“调用内核空间的函数完成相应地服务。 // 系统调用实现分析 int / iret 0 1 早些时候,通过int 80来进行系统调用调用一个系统调用示意图: 图2-1 int80系统调用示意图 下面基于linux-2.6.39内核进行分析 2.1 vsyscalls vsyscalls的工作原理即为:Linux内核将第一个页面映射到用户空间,该页面包含一些变量和一些系统调用的实现,被映射到用户空间的系统调用即可以在用户空间执行,不需要进行上下文切换

    62930

    CUDA编程.内核调用

    首先我说一下什么叫内核,这里的内核很狭义就是ANSI C关键字+CUDA扩展关键字编写的设备代码~ 它是主机代码(Host Coda)通过内核调用的方式来启动的。 再简单点就是,内核调用的含义是我们从主机代码启动设备代码。通常来说,内核调用会生成大量的(Block)和线程(Thread)来在GPU上并行的处理数据。 内核代码和普通的代码没有什么差异,只不过是由多个线程并行执行。 语法是以__global__开始,然后是<<<xxx>>>,这个语法来配置内核参数,一个是表示希望执行的快数,二是每个快具有的线程数数。 是指向设备显存的指针 指向设备显存中的位置,内核将在那里存储相加的结果 作为程序员需要知道的是,作为参数传递给内核的指针应该仅指向设备显存,指向主机会程序崩溃。

    22520

    Linux内核设计与实现(进程管理、进程调度、系统调用)

    6、写时拷贝COW image.png 7、线程和进程的区别不大 image.png 8、孤儿进程,父进程先关掉,再设置一个父进程,如果没有,设置init image.png 9、2.6内核后进程调度算法 image.png image.png 13、与调度相关的系统调用 image.png 14、系统调用在用户空间进程和硬件设备之间添加了一个中间层 image.png 15、中断 image.png

    8310

    LINUX内核

    一、Linux内核2.6特点: 1.新的调度器 2.内核抢占 3.改进线程模型 4.虚拟内存 5.文件系统 6.音频:音频体系结构ALSA.支持USB音频和MIDI设备,并支持全双工重放功能。 二、LINUX内核的组成 1.LINUX内核源代码目录结构 1)arch:包含和硬件体系结构相关的代码,每种平台占一个相应的目录。如i386,arm,powerpc,mips等。 4)Documentation:内核各部分通用解释和注释。 模块 16)sound:ALSA,OSS音频中设备的核心代码和常用设备驱动 17)usr:实现了用于打包和压缩的CPIO等 2.LINUX内核组成部分 2.1 LINUX主要用进程调度,虚拟文件系统, 3.Linux内核空间与用户空间 Linux只能通过系统调用和硬件中断来完成用户空间到内核空间的控制转移

    60030

    Linux 内核 vs Windows 内核

    ,也就是硬件通信能力; 提供系统调用,如果应用程序要运行更高权限运行的服务,那么就需要有系统调用,它是用户程序与操作系统之间的接口。 因此,当程序使用用户空间时,我们常说该程序在用户态执行,而当程序使内核空间时,程序则在内核态执行。 应用程序如果需要进入内核空间,就需要通过「系统调用」,下面来看看系统调用的过程: ? 内核程序执行在内核态,用户程序执行在用户态。当应用程序使用系统调用时,会产生一个中断。发生中断后, CPU 会中断当前在执行的用户程序,转而跳转到中断处理程序,也就是开始执行内核程序。 完成第一版 Linux 后,Linux Torvalds 就在网络上发布了 Linux 内核的源代码,每个人都可以免费下载和使用。 微内核内核功能少,可移植性高,相比宏内核有一点不好的地方在于,由于驱动程序不在内核中,而且驱动程序一般会频繁调用底层能力的,于是驱动和硬件设备交互就需要频繁切换到内核态,这样会带来性能损耗。

    42930

    Linux内核分析》之触发一个系统调用实验总结

    前言 系统调用列表中可用的很多,可惜对用代码进行系统调用不太清楚,只好从网上窃取了一份,地址在最后放上。此处以fork()为例。 首先将ebx清零,使用eax传递系统调用号,此处设为2,之后fork()函数(其系统调用对应的api)运行,期间触发int 0x80的中断完成由用户态进入内核态的转变过程,在执行完系统调用后,其系统调用的返回值使用 int 0x80的中断向量对应着system_call()内核代码的入口,中间执行到对应的system_fork()中断服务程序,之后ret_from_sys_call,过程中可能发生进程调度,若没发生则返回到用户态继续进行其他的 总结 系统通过中断的方式完成用户态到内核态的转换过程,同时调用系统函数实现系统功能。 windCoder原创作品转载请注明出处 参考资料 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验代码参考地址:

    40730

    Linux内核学习(一)之Linux内核源码目录

    : ——linux版本号由3组数字组成: 第一组数字:表示目前发布的内核主版本。 这个文件就是linux内核特有的内核编译体系需要用到的文件 MAINTAINERS:这个文件主要是介绍了维护人员列表以及如何提交内核更改 Makefile:这个是linux内核的总makefile,整个内核工程用这个 init:init是初始化的意思,这个目录下的代码就是linux内核启动时初始化内核的代码。 ipc:ipc就是inter process commuication,进程间通信,里面都是linux支持的IPC的代码实现 kernel:kernel就是内核,就是linux内核,所以这个文件夹下放的就是内核本身需要的一些代码文件 scripts:脚本,这个目录下全部是脚本文件,这些脚本文件不是linux内核工作时使用的,而是用来辅助对linux内核进行配置编译生产的。

    67040

    Linux 内核参数

    和centos的实现是不一样的,如linux内核3.10版本的初始接收窗口定义为10mss,但centos 3.10内核中的初始窗口大小定义为TCP_INIT_CWND * 2,即20*MSS大小。 orphan socket为调用内核tcp_close(struct sock *sk, long timeout)函数产生的。 在高版本的Linux中,默认为1 tcp_reordering:通知内核在一条TCP中需要重组的报文数目,此时不考虑报文丢失。如果大于该值,会认为有报文丢失,TCP栈会自动切换到慢启动。 socket可以使用TCP_CORK 参数来取消或允许该特性 参考: Linux之TCPIP内核参数优化 TCP protocol Tuning TCP - sysctl.conf 聊一聊重传次数 TCP open系统调用打开文件(path_openat内核函数) 打开一个目录(dentry_open函数) 共享内存attach (do_shmat函数) socket套接字(sock_alloc_file

    2.4K21

    Linux 内核死锁

    所以内核中设计了内核死锁检测机制,一旦发现死锁进程,就重启OS,快刀斩乱麻解决问题。

    96350

    linux内核编译

    linux内核下载: https://mirrors.edge.kernel.org/pub/linux/kernel/ https://elixir.bootlin.com/linux/v4.14.34 /source http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/ 查看系统位数: getconf LONG_BIT ? 查看内核版本: cat /proc/version ? uname -a ? 下载内核4.4.38.tar.gz ? 树莓派使用 wget https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.4.38.tar.gz 下载到 /home/pi 路径下 解压 tar -zxvf linux-4.4.38.tar.gz ?

    71610

    Linux内核书籍

    Linux设备驱动》   --  也就是我们所说的LDD3了; 适合一定基础的人阅读,深入学习Linux不可或缺的知识; 《UNIX环境高级编程》 这本书并不是面对linux内核的书,但是我是从最基础看这本书逐步入门的 ; 《Linux内核完全剖析》 本书对早期Linux内核(v0.12)全部代码文件进行了详细、全面的注释和说明,旨在帮助读者用较短的时间对Linux的工作机理获得全面而深刻的理解,为进一步学习和研究Linux 虽然选择的版本较低,但该内核已能够正常编译运行,并且其中已包括了Linux工作原理的精髓。 《Linux那些事》 由复旦一群大神所写,团队为fudan_adc,主要写了我是xxx系列,本人比较喜欢对USB 部分的描述,不得不说大神就是大神。 《Linux设备驱动开发详解》 由华清远见出身的大神所写,宋宝华大神所写,华清远见出来的技术杠杠的。 《深入理解计算机操作系统》 当然啦,不得不说大学学过的操作系统啊!!!!

    1.3K60

    Linux内核概述

    文章目录 Linux内核简介 操作系统与内核简介 Linux内核与传统Unix内核的比较 Linux内核版本 在什么地方找源码 内核没有内存保护机制 同步和并发 Linux内核简介 本专栏,用于记录我对 当硬件设备想和系统通信的时候,它首先要发出个异步的中断信号去打断内核正在执行的工作。中断通常对应着个中断 号,内核通过这个中断号查找相应的中断服务程序,并调用这个程序响应和处理中断。 内核注意到这个中断对应的中断号,调用相应的中断服务程序。该服务程序处理键盘数据然后通知键盘控制器可以继续输人数据了。 Linux内核与传统Unix内核的比较 当Linus和其他内核开发者设计Linux内核时,他们并没有完全彻底地与Unix诀别。 以下是对Linux 内核与Unix各种变体的内核特点所作的分析比较: ●Linux支持动态加载内核模块。尽管Linux内核也是整体式结构,可是允许在需要的时候动态地卸除和加载部分内核代码。

    53520

    相关产品

    • TencentOS Server

      TencentOS Server

      腾讯服务器操作系统(TencentOS Server,TS)是腾讯云推出的Linux操作系统,它旨在为云上运行的应用程序提供稳定、安全和高性能的执行环境。它可以运行在腾讯云CVM全规格实例上,包括黑石2.0服务器。

    相关资讯

    热门标签

    活动推荐

    扫码关注腾讯云开发者

    领取腾讯云代金券