内核地址空间大冒险:系统调用
liebian365 2024-11-21 17:36 23 浏览 0 评论
开启冒险之旅
我是一个线程,出生在这个Linux帝国,今天我的任务是去执行一段人类用C语言编写的代码。
一阵忙活过后,一个fopen函数调用的指令出现在我面前,跟随指令指向的方向,我来到了libc.so的地盘,进入了一个名为open的房间,房间里的桌上放了一张纸,上面写了一个编号和几句指令。
根据指令,我需要把编号放到eax寄存器,把open函数的参数放到ebx、ecx、edx三个寄存器中。
忙完上面的操作,我环顾四周,发现这房间里还有一道门,门上写着sysenter。
我小心翼翼的走了进去,突然,眼前闪过一道白光,紧接着光线消失,四周变得幽暗起来。但我能感觉到我在移动着,片刻之后,开始出现了亮光。
神秘的长者
“欢迎来到内核地址空间!”,一位白胡子老头向我走了过来。
“敢问长者是谁”,我有点紧张。
“年轻人别怕,你是第一次来这里吧,难怪看着眼生。这里是帝国的内核空间,帝国核心都在这里,你们这些应用程序线程平时是很少这里的,我就是专门在这里接待从应用层下来的线程们,为你们指路的”,老头一边说,一遍捋了捋胡须。
“多谢老先生,劳烦您带下路”,说完我俩就一起向前走。
很快,我们来到一面巨大的墙壁面前,墙壁上面有很多格子,每个格子上面都写了一个编号。我注意到墙的最上面还有一块招牌,上面写着:sys_call_table。
“年轻人,这是系统调用表,来,把你的编号给我”,老头转过身来。
我想起来这里之前,名为open的房间里纸上的那个编号,记得我把它放到eax寄存器里去了。
我从eax寄存器取出之前放置的编号,交给了老头。
“哦,是个2号,是要去sys_open啊”,说完,老头打开了墙上2号格子的抽屉,拿出了一个纸条交给我。
我一看,上面写着:
sys_open: 0x7ffe10002030
“老先生,看来你对这里很熟嘛,还没看都知道我是要去sys_open”。
“那当然,从帝国诞生的第一天起,我就在这里工作了,帝国的三百多个系统调用我早就背的滚瓜烂熟了,刚来的时候我也和你差不多年轻,现在都满头白发咯,岁月不饶人啊!”,老头又捋了捋胡须。
系统调用
“系统调用?什么意思?”,我第一次听到这几个字。
“你现在来到我们这里办事,这就叫系统调用啊!”。
“还是不太明白,还请老先生赐教”。
“好吧,年轻人好学,老朽就给你说道说道。在天地混沌初开的时候,比特宇宙早期孕育的一些帝国文明,他们所有的程序都是和帝国自身的核心代码在一个地方执行。但这样的后果是程序之间经常发生混乱冲突,还经常伤害帝国本身的程序。”。
“到后来,一些新出现的帝国文明,像咱们的Linux帝国,还有Windows帝国等等,为了安全考虑,一方面把普通应用程序和帝国自身程序分开,普通应用程序执行的地方叫用户态地址空间,而帝国核心程序运行的地方叫内核地址空间,这叫权限分离。另一方面把多个普通应用程序之间也分开,防止他们的冲突混乱,把这叫进程隔离。”老头喝了口水继续说道。
“老先生您说了这么多,这跟系统调用又有什么关系呢?”
“别着急啊,听我继续说给你听。应用程序和帝国核心分开后,应用程序就没法直接访问磁盘、内存、网络等等设备了。那他们需要访问这些设备怎么办呢?为了让这些应用程序还能工作,帝国安排专门的部门来统一管理这些工作,把所有的功能分门别类开辟了300多个窗口来为你们提供服务,你前面拿到的sys_open函数就是其中一个。还设立一个特殊通道,类似于虫洞,连接用户空间和内核空间。而你们这些应用程序想要来办事,就带着办事窗口的编号,从这个虫洞过来,而我就在这头接待你们,指引你们去具体的窗口办理业务,整个过程呢就叫做系统调用啦!终于讲完了,可累死老夫了”。
"虫洞?是不是就是那个sysenter指令,通过它进入的?",我恍然大悟。
“对,没错!”。
“原来如此,那为何不直接把sys_open函数的地址写在我来之前的open房间,还要弄一个编号来查,这不更省事吗?”
“唉,此言差矣,这些个函数的地址都是机密,怎么能随便透露给你们上面的应用程序呢。而且,为了安全,这些地址会随着帝国每次启动变化的,不是一个固定的地址,所以还是要用编号来查哦!”
“感谢老先生,今日获益良多,时辰不早,我该去做我的正事了,再会”!
“年轻人再见,一会儿我们还会见面的,你还得从这里回去呢”,老头说完就又去接待其他人去了。
线程内核堆栈
按照纸条上面的地址,我来到了sys_open函数的地方,开始执行这里的代码,完成我要办理的事情。
看到第一条push操作堆栈指令,我一下就慌了,我之前都是在用户空间工作,第一次来这里,没有堆栈可怎么办呐!
就在这时,旁边走过来一个大叔。
“你是第一次来这里吧!”,大叔一下看穿了我的萌新属性。
“大叔你好,我确实是第一次来,这里没有堆栈,我怎么push啊”,我向大叔求救。
“怎么没有啊,你仔细看看你的堆栈指针esp指向的地方呢?”
顺着esp指向的地方望去,果然有一个堆栈,不过和我来之前在用户空间的堆栈不太一样,这个小了许多。
“大叔,这个堆栈是哪来的啊?”,我又向大叔请教。
“这个叫线程的内核堆栈,每个应用程序的线程都有两个堆栈,一个在用户空间,一个在内核空间。这个呢就是你在内核空间的堆栈啦,专门供你在内核空间来办事的时候使用的,因为用得少,加上内核空间的资源宝贵,所以比你之前那个小了很多”,大叔解答了我的疑惑。
“哦,原来如此啊,多谢大叔。对了大叔,你也是从那个sysenter虫洞穿越过来的吗?”
“我是从虫洞过来的,不过不是sysenter哦,而是···哦我还有事要忙,就此别过吧”,说完匆忙离去。
我大吃一惊!难道还有别的虫洞?
未完待续·······
出处:https://www.cnblogs.com/xuanyuan/p/12154954.html
相关推荐
- go语言也可以做gui,go-fltk让你做出c++级别的桌面应用
-
大家都知道go语言生态并没有什么好的gui开发框架,“能用”的一个手就能数的清,好用的就更是少之又少。今天为大家推荐一个go的gui库go-fltk。它是通过cgo调用了c++的fltk库,性能非常高...
- 旧电脑的首选系统:TinyCore!体积小+精简+速度极快,你敢安装吗
-
这几天老毛桃整理了几个微型Linux发行版,准备分享给大家。要知道可供我们日常使用的Linux发行版有很多,但其中的一些发行版经常会被大家忽视。其实这些微型Linux发行版是一种非常强大的创新:在一台...
- codeblocks和VS2019下的fltk使用中文
-
在fltk中用中文有点问题。英文是这样。中文就成这个样子了。我查了查资料,说用UTF-8编码就行了。edit->Fileencoding->UTF-8然后保存文件。看下下边的编码指示确...
- FLTK(Fast Light Toolkit)一个轻量级的跨平台Python GUI库
-
FLTK(FastLightToolkit)是一个轻量级的跨平台GUI库,特别适用于开发需要快速、高效且简单界面的应用程序。本文将介绍Python中的FLTK库,包括其特性、应用场景以及如何通过代...
- 中科院开源 RISC-V 处理器“香山”流片,已成功运行 Linux
-
IT之家1月29日消息,去年6月份,中科院大学教授、中科院计算所研究员包云岗,发布了开源高性能RISC-V处理器核心——香山。近日,包云岗在社交平台晒出图片,香山芯片已流片,回片后...
- Linux 5.13内核有望合并对苹果M1处理器支持的初步代码
-
预计Linux5.13将初步支持苹果SiliconM1处理器,不过完整的支持工作可能还需要几年时间才能完全完成。虽然Linux已经可以在苹果SiliconM1上运行,但这需要通过一系列的补丁才能...
- Ubuntu系统下COM口测试教程(ubuntu port)
-
1、在待测试的板上下载minicom,下载minicom有两种方法:方法一:在Ubuntu软件中心里面搜索下载方法二:按“Ctrl+Alt+T”打开终端,打开终端后输入“sudosu”回车;在下...
- 湖北嵌入式软件工程师培训怎么选,让自己脱颖而出
-
很多年轻人毕业即失业、面试总是不如意、薪酬不满意、在家躺平。“就业难”该如何应对,参加培训是否能改变自己的职业走向,在湖北,有哪些嵌入式软件工程师培训怎么选值得推荐?粤嵌科技在嵌入式培训领域有十几年经...
- 新阁上位机开发---10年工程师的Modbus总结
-
前言我算了一下,今年是我跟Modbus相识的第10年,从最开始的简单应用到协议了解,从协议开发到协议讲解,这个陪伴了10年的协议,它一直没变,变的只是我对它的理解和认识。我一直认为Modbus协议的存...
- 创建你的第一个可运行的嵌入式Linux系统-5
-
@ZHangZMo在MicrochipBuildroot中配置QT5选择Graphic配置文件增加QT5的配置修改根文件系统支持QT5修改output/target/etc/profile配置文件...
- 如何在Linux下给zigbee CC2530实现上位机
-
0、前言网友提问如下:粉丝提问项目框架汇总下这个网友的问题,其实就是实现一个网关程序,内容分为几块:下位机,通过串口与上位机相连;下位机要能够接收上位机下发的命令,并解析这些命令;下位机能够根据这些命...
- Python实现串口助手 - 03串口功能实现
-
串口调试助手是最核心的当然是串口数据收发与显示的功能,pzh-py-com借助的是pySerial库实现串口收发功能,今天痞子衡为大家介绍pySerial是如何在pzh-py-com发挥功能的。一、...
- 为什么选择UART(串口)作为调试接口,而不是I2C、SPI等其他接口
-
UART(通用异步收发传输器)通常被选作调试接口有以下几个原因:简单性:协议简单:UART的协议非常简单,只需设置波特率、数据位、停止位和校验位就可以进行通信。相比之下,I2C和SPI需要处理更多的通...
- 同一个类,不同代码,Qt 串口类QSerialPort 与各种外设通讯处理
-
串口通讯在各种外设通讯中是常见接口,因为各种嵌入式CPU中串口标配,工业控制中如果不够还通过各种串口芯片进行扩展。比如spi接口的W25Q128FV.对于软件而言,因为驱动接口固定,软件也相对好写,因...
- 嵌入式linux为什么可以通过PC上的串口去执行命令?
-
1、uboot(负责初始化基本硬bai件,如串口,网卡,usb口等,然du后引导系统zhi运行)2、linux系统(真正的操作系统)3、你的应用程序(基于操作系统的软件应用)当你开发板上电时,u...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- go语言也可以做gui,go-fltk让你做出c++级别的桌面应用
- 旧电脑的首选系统:TinyCore!体积小+精简+速度极快,你敢安装吗
- codeblocks和VS2019下的fltk使用中文
- FLTK(Fast Light Toolkit)一个轻量级的跨平台Python GUI库
- 中科院开源 RISC-V 处理器“香山”流片,已成功运行 Linux
- Linux 5.13内核有望合并对苹果M1处理器支持的初步代码
- Ubuntu系统下COM口测试教程(ubuntu port)
- 湖北嵌入式软件工程师培训怎么选,让自己脱颖而出
- 新阁上位机开发---10年工程师的Modbus总结
- 创建你的第一个可运行的嵌入式Linux系统-5
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)