社区
Linux_Kernel
帖子详情
有关linux中内存管理的问题---高级,呵呵
chen_zdc
2011-01-06 04:37:24
各位大虾,有没有什么方法在linux系统中创建一块不受系统重启影响的内存啊?
也就是说,在装有linux系统的机器中开辟一块内存,这块内存中的信息不会受到linux系统
重启的影响,linux系统重启时这块块内存中的信息不会丢失。
但在linux内核代码中,要能使用这块内存,因为需要将一些内核信息发到这块内存中。
...全文
279
15
打赏
收藏
有关linux中内存管理的问题---高级,呵呵
各位大虾,有没有什么方法在linux系统中创建一块不受系统重启影响的内存啊? 也就是说,在装有linux系统的机器中开辟一块内存,这块内存中的信息不会受到linux系统 重启的影响,linux系统重启时这块块内存中的信息不会丢失。 但在linux内核代码中,要能使用这块内存,因为需要将一些内核信息发到这块内存中。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
chobit_s
2011-01-12
打赏
举报
回复
参考 kdump 和 kexec
stratosphere607
2011-01-11
打赏
举报
回复
问题的关键在于:reboot时硬件有没有特定的不受软件控制的对RAM断电或清除操作。
YTerrenceLau
2011-01-08
打赏
举报
回复
1,7楼和9楼说的可能会是问题,但我们没必要太悲观,毕竟待机模式可以工作
2,如果是嵌入式系统的话,可以直接kmalloc内存然后在内存起始写入一个唯一标示,下次boot的时候扫描内存就可以获得这一标示然后到处
3,尝试研究一下引导命令行参数,应该有配置内存大小的,命令行中保留一段高端内存,然后用11楼的方法加以运用就可以了,这样就不用更改任何内核代码了,只需要写一个驱动。
ezword
2011-01-07
打赏
举报
回复
reboot后,系统启动时,ddr控制器本身处于复位状态,怎么去刷新内存(保持数据),在ddr控制器复位时数据本身可能会随机丢失。当然如果另有独立的刷新ddr的控制器就可能没问题。
abc00000001
2011-01-07
打赏
举报
回复
你可以在内核中,在添加内存资源时,人为少添加一些内存,如:
本来你的内存是 0x0000_0000 - 0x2000_0000 共 512MB,你可以只添加 0x0000_0000 -> 0x1FF0_0000,从而保留1MB使用
或者你的内存很大,你可以不使用高端内存,这样你的高端内存就保留下来了
编写一个驱动,将该段内存ioremap到一个你可以访问的地址。然后编写相关的接口,你就可以利用了。
我说的比较符合arm, mips的实现手法,但对于x86体系,我并不清楚是否是一样可行
unbutun
2011-01-06
打赏
举报
回复
怎么不可能,只要reboot后留一块不初始化那块就行,把那块拿出来不收任何的控制,可以做到的。但是需要研究内存管理,理论上绝对没问题
ezword
2011-01-06
打赏
举报
回复
不可能,每次系统启动时,都会去设置ddr控制器,这时数据会随机丢失,使用静态ram倒可能
chen_zdc
2011-01-06
打赏
举报
回复
谢谢楼上的建议,但我们的系统使用的不是nand flash,就是正常的内存,所以不好意思啊
不能采用你的方法了!~~
steven_miao
2011-01-06
打赏
举报
回复
内存是不可能的,那玩意儿掉电信息会丢失,有一种方案供你参考,如在mach-smdk6410中有以下结构,会对nand flash 分区。你可以在最后分出一段区域。如在最后添加Save块,然后在加载内核到平台上时,会有mtdblock0,mtdblock1,mtdblock2,mtdblock3,mtdblock4,则mtdblock4对应你的最后一个块。struct mtd_partition s3c_partition_info[] = {
{
.name = "Bootloader",
.offset = 0,
.size = (512*SZ_1K),
/* .mask_flags = MTD_CAP_NANDFLASH, */
},
{
.name = "Kernel",
.offset = (512*SZ_1K),
.size = (8*SZ_1M),
/* .mask_flags = MTD_CAP_NANDFLASH, */
},
{
.name = "File System",
.offset = (8*SZ_1M + 512*SZ_1K),
.size = (128*SZ_1M),
},
{
.name = "User",
.offset = xx,
.size = xx,
},
{
.name = "Save",
.offset = xxx,
.size = xxx,
}
};
在Linux内核中读写该块就可以了。如果想知道如何操作,你参照Linux启动时如何从nandflash读出uboot的设定值的。
wickyboy
2011-01-06
打赏
举报
回复
哦,这样啊,有点高深哦,顶一下
chen_zdc
2011-01-06
打赏
举报
回复
呵呵,系统是热启动不断电的,只是reboot一下。
做这个的目的是想记录linux内核崩溃时的一些信息,因为
不想这些信息记录到硬盘上,所以就想能不能将这些信息记录到
一块不受linux热重启影响的内存中。
wickyboy
2011-01-06
打赏
举报
回复
嘿嘿,知道了,如果用nand flash来做内存的话,是可以实现的哦,因为它掉电之后内容仍然存在。
wickyboy
2011-01-06
打赏
举报
回复
你这个问题有点高深哦,难道是用高端内存?
qt-opensource-
linux
-x64-5.7.1.run.7z
qt-opensource-
linux
-x64-5.7.1.run.7z
Fakeroot Next Gen:使用伪造的根环境运行进程-开源
Fakeroot-ng使用调试接口(PTRACE)欺骗程序,使其认为它们具有root权限运行。
Linux
C
内存管理
提到C语言,我们知道C语言和其他
高级
语言的最大的区别就是C语言是要操作内存的! 内存的使用时程序设计
中
需要考虑的重要因素之一,这不仅由于系统内存是有限的(尤其在嵌入式系统
中
),而且内存分配也会直接影响到程序的效率。因此,我们要对C语言
中
的
内存管理
,有个系统的了解。 在C语言
中
,定义了4个内存区间:代码区;全局变量和静态变量区;局部变量区即栈区;动态存储区,即堆区;具体如下:
Linux
内存管理
内存映射以及通过反汇编定位内存错误
问题
提到C语言,我们知道C语言和其他
高级
语言的最大的区别就是C语言是要操作内存的! 我们需要知道——变量,其实是内存地址的一个抽像名字罢了。在静态编译的程序
中
,所有的变量名都会在编译时被转成内存地址。机器是不知道我们取的名字的,只知道地址。 内存的使用时程序设计
中
需要考虑的重要因素之一,这不仅由于系统内存是有限的(尤其在嵌入式系统
中
),而且内存分配也会直接影响到程序的效率。因此,.........
Linux
内存泄漏与溢出
Linux
系统下真正有危害的是内存泄漏的堆积,这会最终消耗尽系统任何的内存。下面是排查和解决方案与大家一起分享。1、
Linux
内存监控内存泄漏的定义:一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程式从堆
中
分配的,大小任意的(内存块的大小能够在程式运行期决定),使用完后必须显示释放的内存。应用程式一般使用malloc,realloc,new等函数从堆
中
分配到一块内存,使用完后,程式必须负责相...
Linux_Kernel
4,465
社区成员
17,462
社区内容
发帖
与我相关
我的任务
Linux_Kernel
Linux/Unix社区 内核源代码研究区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章