使用GDB进行系统调用过程简析

陈铁 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

作业的难度在增加,实验楼的虚拟机不太稳定,经常用着用着就不能操作了。没有细致研究,于是就在VirtualBox下新建了虚拟机,还算顺利。下载了Ubuntu的mini.iso,结果界面全是Debian的,选择高级里的Xfce,虽然全部下载使安装过程有点长,不过安装完之后没有太多的问题,就达到了实验楼同样的效果。于是下载了最新的kernel,git clone了老师的最小linux的menuos。加上自己的系统程序。环境就打好了。

有图有真相。

系统运行起来了:

重新启动GDB,设置断点sys_getuid.

(gdb) break sys_getuid
Breakpoint 1 at 0xc1054340: file kernel/sys.c, line 857.
代码如下:

SYSCALL_DEFINE0(getuid)
{
        /* Only we change this so SMP safe */
        return from_kuid_munged(current_user_ns(), current_uid());
}
执行GDB命令finish,结果如下:

Run till exit from #0  sys_getuid () at kernel/sys.c:859
<signal handler called>
Value returned is $1 = 0
返回当前用户的ID存在变量中是0;

显示一下代码

(gdb) list
424     sysenter_do_call:
425             cmpl $(NR_syscalls), %eax
426             jae sysenter_badsys
427             call *sys_call_table(,%eax,4)
428     sysenter_after_call:
429             movl %eax,PT_EAX(%esp)
430             LOCKDEP_SYS_EXIT
431             DISABLE_INTERRUPTS(CLBR_ANY)
432             TRACE_IRQS_OFF
433             movl TI_flags(%ebp), %ecx
由于getuid命令直接调用的sys_getuid系统调用例程,所以可以直接中断到相应的函数,但是getuid-asm直接使用的中断int 0x80.所以可以使用break sysenter_do_call。

总结,通过自己利用老师的代码,套用一下,就可以在最小的linux系统下编写底层的命令,虽然无法完全分析明白运行的机制,但是粗略的可以懂得系统调用的大致过程,内核将经常使用的和硬件交互的代码封装为服务例程,并且对用户提供系统调用表,只要知道相应的编号对应什么样的系统功能,就可以通过传入编号给eax寄存器,使用系统调用的中断号int0x80就可以的到想要的结果。进一步,甚至可以将自己的特定代码保存为内核例程,编译在内核中,随时供用户调用。

时间: 2024-12-15 17:21:21

使用GDB进行系统调用过程简析的相关文章

Nutch学习笔记——抓取过程简析

Nutch学习笔记二--抓取过程简析 学习环境: ubuntu 概要: Nutch 是一个开源Java 实现的搜索引擎.它提供了我们运行自己的搜索引擎所需的全部工具.包括全文搜索和Web爬虫. 通过nutch,诞生了hadoop.tika.gora. 先安装SVN和Ant环境.(通过编译源码方式来使用nutch) apt-get install ant apt-get install subversion [email protected]:~/data/nutch$ svn co https:

Linux进程启动过程简析

朱宇轲 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 今天,我们将通过阅读linux的内核代码来对linux系统中进程的创建过程进行简单的分析. 大家都知道,linux通过进程控制块PCB来对进程进行控制和管理,它存放了进程的数据.在linux中,PCB的代码如下(当然是节选的==): struct task_struct { volatile long state;//进程状

linux文件系统写过程简析

linux写入磁盘过程经历VFS ->  页缓存(page cache) -> 具体的文件系统(ext2/3/4.XFS.ReiserFS等) -> Block IO ->设备驱动 -> SCSI指令(或者其他指令),总体来说linux文件写入磁盘过程比较复杂 1.VFS(虚拟文件系统) Linux中采用了VFS的方式屏蔽了多个文件系统的差别, 当需要不同的设备或者其他文件系统时,采用挂载mount的方式访问其他设备或者其他文件系统(这里可以把文件系统理解为具体的设备).正是

RAP开发入门-运行过程简析(三)

今天通过标准的RAP程序来简单分析下RAP的启动过程 1.新建一个标准的rap plugin-in 项目: 得到的项目结构大概如下: run confi..->..add bundle(配置好bundle 运行结果如下): 全屏控制代码: /** * Configures the initial size and appearance of a workbench window. * 配置初始大小和显示workbench的窗口样式 * -看来以后的主题应该在这里设置了 */ public cla

HDFS读写过程简析

2.1.读文件的过程 客户端(client)用FileSystem的open()函数打开文件 DistributedFileSystem用RPC调用元数据节点,得到文件的数据块信息. 对于每一个数据块,元数据节点返回保存数据块的数据节点的地址. DistributedFileSystem返回FSDataInputStream给客户端,用来读取数据. 客户端调用stream的read()函数开始读取数据. DFSInputStream连接保存此文件第一个数据块的最近的数据节点. Data从数据节点

netty4 bind启动过程简析

请看一下简单的 一个netty4服务端启动代码样例 EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)

spring加载过程简析

INFO: Initializing Spring root WebApplicationContextINFO : org.springframework.web.context.ContextLoader - Root WebApplicationContext: initialization started(开始初始化web application 环境)INFO : org.springframework.web.context.support.XmlWebApplicationCont

cocos2d-x安卓应用启动调用过程简析

调用org.cocos2dx.cpp.AppActivity AppActivity是位于proj.android/src下的开发者类(即开发者自定义的类),它继承自org.cocos2dx.lib.Cocos2dxActivity,在项目生成后它没有添加任何代码,纯粹是一个Cocos2dxActivity,也是一个Activity. AppActivity被调用是因为被配置在AndroidManifest.xml <application android:label="@string/a

Android -- MediaPlayer内部实现简析

Android -- MediaPlayer内部实现简析 在之前的博客中,已经介绍了使用MediaPlayer时要注意的内容.现在,这里就通过一个MediaPlayer代码实例,来进一步分析MediaPlayer内部是如何运作.实现的:当然这里的分析只截止到底层调用播放器之前,因为播放器这块实在是没搞懂. 我们使用的例子来源于之前MediaPlayer Playback译文中的官方实例: String url = "http://........"; // your URL here