有关linux中内存管理的问题---高级,呵呵

chen_zdc 2011-01-06 04:37:24
各位大虾,有没有什么方法在linux系统中创建一块不受系统重启影响的内存啊?
也就是说,在装有linux系统的机器中开辟一块内存,这块内存中的信息不会受到linux系统
重启的影响,linux系统重启时这块块内存中的信息不会丢失。
但在linux内核代码中,要能使用这块内存,因为需要将一些内核信息发到这块内存中。

...全文
279 15 打赏 收藏 转发到动态 举报
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
  • 打赏
  • 举报
回复
你这个问题有点高深哦,难道是用高端内存?

4,465

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧