如何在linux内核中保留一块内存不被系统分配

作者&投稿:呈夏 (若有异议请与网页底部的电邮联系)
我想在Linux内核中,分配一块固定地址的内存(或者变量也可以),分配时指定起始地址。请问要怎么做。~

内核中分配内存可以使用kmalloc或vmalloc函数,函数的返回值便是起始地址,但是无法制定,因为内存是由内核来管理的,不是用户想要在哪分配内存就在哪分配。

Linux内核中采 用了一种同时适用于32位和64位系统的内 存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系 统中,用到了四级页表:
* 页全局目录(Page Global Directory)
* 页上级目录(Page Upper Directory)
* 页中间目录(Page Middle Directory)
* 页表(Page Table)
页全局目录包含若干页上级目录的地址,页上级目录又依次包含若干页中间目录的地址,而页中间目录又包含若干页表的地址,每一个页表项指 向一个页框Linux中采用4KB大小的 页框作为标准的内存分配单元。

要想在内核中保留一个块内存,不被系统分配,而是只由自己使用,可以使用以下函数
reserve_bootmem(addr,size,flag)
这个函数的三个参数,addr是你要保留的地址,size就是要保留的大小,flag是标志位,要来确定是否检查你要保留的空间是否已经被保留了,它可以设置为两个值,BOOTMEM_DEFAULT和BOOTMEM_EXCLUSIVE,前者就是总是会返回0(也就是保留成功),而后者则会检查你所要保留的空间是否已经被保留了,若已经被保留了,则它返回失败(负数)

那么这个函数一般放在哪里使用过了,我们建议放到内核init/main.c中,在页表的建立之前进行保留,比如我们下面的代码,放在main中的start_kernel函数中,我们的内核是2.6.32
asmlinkage void __init start_kernel(void)
{
……
……
trap_init();

if(reserve_bootmem(0x41000000,0x100000,BOOTMEM_EXCLUSIVE) != 0){
printk("reserve fail----\n");
}
printk("we reserve boot meme of 0x41000000 for gps---------------------------------\n");

mm_init();
……
……
}
这样就保留了一个起始地址为0x41000000,大小为1M的空间

在开机保留内存的方式一共有三种方法:
1. reserve_bootmem(addr,size,flag)
这种方法,我做实验一直没有成功...
如果有成功的,希望大神留言,求指导!
2. alloc_bootmem(size)
其实还是比较简单的,在int/main.c中:
//设置全局变量
char* reserve_memory;
EXPORT_SYMBOL_GPL(reserve_memory);
void __init start_kernel()
{
...
trap_init();
//在此添加代码,在zone保留40M的内存
reserve_memory=alloc_bootmem(0x2800000);
mem_init();
...
}
但是在内核中得到reserve_memory之后,如何映射到内核空间中使用,没有理出头绪...
网上搜到有人说,

有了allco_bootmem返回的地址,
在内核态,找到要使用这段内存的task_struct;
进而强行建立页表;

如果有大神理解这句话,或者更好的映射方法,请留言,谢谢!
3. 开机时设置Linux 内核参数
mem=180M /* 开机时只给系统180M的内存空间,其余都保留 */
这种方法最为简单,但是设置和使用的时候,需要和硬件内存物理大小相适应。
在内核驱动中,可以以ioremap()的方式映射到内核空间中,或者再mmap()到用户空间中读写。


全球首个RISC-V OoO CPU面世,RISC-V魅力何在?
2019年10月31日,SiFive公布了IP产品的一个里程碑,因为他们展示了其有史以来第一个乱序的CPU微体系结构,并承诺在现有RISC-V内核上实现显着的性能飞跃,并提供与Arm产品相比具有竞争力的PPA指标。说起SiFive这个公司,其实很有意思。SiFive中国是在去年8月份成立的,与其他跨国企业的做法不一样的是,...

开源的意义何在?
像当前的Red Hat Linux就是使用这样的模式。但是,这种模式并不是每一家开源企业都能使用的,也只有像Red Hat这样的行业领先者才有这样的资本。第二种,软件免费,没有售后服务,在软件市场成熟后,靠出售专利谋生。这种方式的代表是Foxmail。第三种,应用服务提供模式。在这种模式下,软件和服务都是...

Linux中分区问题
系统对于分区的要求是和主机开放的服务有关的,当然这是对服务器说的。例如文件服务器,那肯定最好把\/var单独分区,因为文件服务器对\/var目录读写频繁,将这些特点主机读写频繁的目录独立出来不与\/放在一起,那么这些频繁读写的分区即使出现问题时,至少不会影响到\/系统,挽救起来就比较方便快捷。这样就...

计算机课操作系统的作用是
你可以讨厌Linux内核但它比你以后的职业生涯会遇到的软件好多了。计算机系统设计 设计任何的工程系统,包括软件系统,都是一个权衡的过程。是要侧重于可靠性?性能?消耗还是维护性?因为操作系统是很庞大的,性能至关重要的程序,它一般都要维护几十年,所以它们是学生学习这类权衡的很好的地方。拥有一双...

Linux Bourne Shell编译出错:Syntax error: end of file unexpected (e...
有几点需要看看:1、 if [ $person =~ root ] ---这是要表示什么?是说明如果不等于root?2、 cat <<-FINIS --- 结束时却是 FINIS ,好像没匹配上 3、for 循环本身就会去遍历全部内容,感觉你加 shift ,不知道意义何在 ...

Linux:为什么查找进程的时候要过滤掉grep呢?
因为你查找进程用到了grep命令,而这个命令执行的时候带有你查找的进程参数,同时这也是一个进程。例如 这条命令 ps -ef | grep http 其实是分两步执行的 先执行ps -ef 再执行 grep http 这个命令本身执行的时候也是一个进程,并把也带有http。所以你要查找http进程,需要把 grep http这个进程过滤...

linux 修改权限
第一个问题: 不管是文件还是文件夹都不会出现你说的通过下面的命令后由755变成200的情况。chmod o-rx Manage 第二个问题: Manage只有组,不知道该定义给什么用户? 那为什么你要建这个一个组呢,意义何在, 如果要加入某个用户组,可以用下面的命令:usermod -g groupname username 加入有效...

周立功教授新书《面向AMetal框架与接口的编程(上)》简介?
《面向 AWorks 框架与接口的编程——基于 Linux》(适用于 ARM9 以上内核)《面向对象的分析与设计》第四套 《C++现代程序设计》《面向 AWorks 框架与接口的编程——基于 C++》(适用于 ARM9 以上内核)《面向对象的分析与设计》还在写作中的内容包括测试与持续集成,书籍均由周立功团队从理论知识到实践...

linux系统fdisk命令-o参数
首先它不是创建一个空盘,而是创建一个新的Dos分区表。这样就重写了磁盘的MBR,因此一旦重启之后理论上是不可恢复的。而最好的办法是用Q不保存退出,然而你已经保存了。。至于不关机补救的方法,从理论上来说是可以的。但是我学Linux的知识不太系统,因此我也帮不了你。

linux怎么安装exe文件
linux不能直接在系统安装,只能下载镜像文件,如ISO,然后通过虚拟光驱来安装。http:\/\/119.147.41.16\/down?cid=C0F424B4068A14000D58F296B7B2D4AB6C4BFF61&t=2&fmt=-1&redirect=no 这里下载。

赣榆县19398692366: 如何在linux内核中保留一块内存不被系统分配 -
暴询悦康: 不会.就算两张内存条也不会划分两块.内存的内容断电很容易丢失,内核也是程序.如果内存不足程序自动强制结束.内核关闭程序就会异常.事实上内核在其他程序前就启动了,其他程序结束后才关闭内核.

赣榆县19398692366: 我想在Linux内核中,分配一块固定地址的内存(或者变量也可以),分配时指定起始地址.请问要怎么做. -
暴询悦康: 内核中分配内存可以使用kmalloc或vmalloc函数,函数的返回值便是起始地址,但是无法制定,因为内存是由内核来管理的,不是用户想要在哪分配内存就在哪分配.

赣榆县19398692366: LinuxKernel内存如何分配?
暴询悦康: 这周BSP那边碰到一个蛮严重的issue: 循环放电影,v4l2 output driver的 dma_alloc很容易就失败,kernel panic,dump出当前buddy系统的状态. 初步分析是由于内存...

赣榆县19398692366: linux采用什么方式实现内存的分配和释?linux采用什么方式
暴询悦康: 转载自http://blog.csdn.net/wangyunqian6/article/details/7364638 1.原理说明 Linux内核中采 用了一种同时适用于32位和64位系统的内 存分页模型,对于32位系统来说...

赣榆县19398692366: 如何将linux kernel指定的一段内存设置为只读 -
暴询悦康: 静态保留的又分为两种,事先知道虚拟地址的和事先不知道虚拟地址的前者可以在paging_init阶段就建立为只读的,具体参考android的kernel,搜索CONFIG_DEBUG_RODATA对于事先不知道虚拟地址的,一般都是通过mmap来使用 那么在mmap时,参数prot不要设置PROT_WRITE就能够设置为只读的(只设置PROT_READ)

赣榆县19398692366: linux的内核模块都在哪里放着啊 -
暴询悦康: 一个完整的Linux内核一般由5部分组成,它们分别是内存管理、进程管理、进程间通信、虚拟文件系统和网络接口.1、内存管理内存管理主要完成的是如何合理有效地管理整个系统的物理内存,同时快速响应内核各个子系统对内存分配的请求...

赣榆县19398692366: 怎么修改kernel里的预留内存
暴询悦康: 可以自己加一段代码阿,在启动时通过bootmem申请你所需大小的内存,用EXPORT_SYMBOL_GPL导出即可bootmem申请在arch/powerpc/mm/mem.c中加入void *my_bootmem = NULL; 72 EXPORT_SYMBOL(my_bootmem); 73 unsigned long ...

赣榆县19398692366: Linux 系统是怎样进行内存管理的 -
暴询悦康: Linux 系统和android 虽然都是用的是linux内核,但对处理程序内存的方式不一样,特别是前台的上层程序,内核级程序基本是一样的. linux内核基本是先把数据都放在内存上的,内存不够才放到交换分区(虚拟内存)上

赣榆县19398692366: linux采用什么方法实现内存的分配和释放 -
暴询悦康: Linux 采用 Buddy 算法有效分配和释放物理页块. linux系统内存管理的特点linux的进程结束后,它占用的资源全部释放,但是内存仅仅是设置了标志,标志了这部分内存已经不再使用,可以被重新分配的.当进程需要内存时,linux系统首先从空闲内存中查找分配,空闲内存不足时就会使用不再使用的内存;另外,如果你的程序又一次运行,系统直接使用内存中 的数据,不再从文件系统读组,提高了效率.这样一来,linux的系统使用律会很高,服务器的在98%以上;这样做的目的是:linux认为内存是最宝贵 的资源,充分利用,不能让他空闲

赣榆县19398692366: linux内存溢出怎么解决方案 -
暴询悦康: 内存溢出是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出. 当内存严重不足时,内核有两种选择: 1.直接panic 2.杀掉部分进程,释放一些内核.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网