我在Windows上编写解释型语言,我使用HeapCreate来实现堆栈和HeapCreate / HeapAllocdynamic分配我的语言。 也许我需要将我的语言移植到其他操作系统..所以,在Linux(或POSIX标准..),有什么类似于这些win32 api? (我希望他们没有很大的不同..) 好的,如果你不知道这些win32 API,请看下面的内容: HeapCreate – 简单。 创build一个新的堆: void *mem = malloc(123); // alloc from default heap HANDLE hHeap = HeapCreate(…); // create a new heap void *mem2 = HeapAlloc(hHeap, some_flag, 123); // alloc from new heap PAGE_GUARD – 有点复杂; 它被用来实现堆栈。 例如,有一个堆栈,其最大大小为5页。 为了节省内存,我只分配一个页面,只是“保留”4个页面的虚拟内存地址。 ——— | alloc | ——— |reserve| ——— |reserve| […]
超过896MB的线性地址对应于高存储区ZONE_HIGHMEM。 所以页面分配器function在这个区域不起作用,因为它们给出ZONE_NORMAL和ZONE_DMA中直接映射的页面帧的线性地址。 我对Undertanding linux内核中指定的这些行感到困惑: 当他们说“在64位硬件平台ZONE_HIGHMEM总是空的时候”是什么意思? 这个突出显示的语句意味着什么:“高内存页框的分配只能通过alloc_pages()函数完成,这些函数不返回线性地址,因为它们不存在, 而是函数返回页面描述符的线性地址第一个分配的页框,这些线性地址总是存在,因为在内核初始化期间,所有的页面描述符在低内存中一次又一次地被分配 。 这些页面描述符是什么,896MB是否已经包含了整个RAM的所有页面描述符。
免责声明:我在德州仪器论坛上交叉发表这个问题,但是我没有得到任何答复五天。 我对embedded式编程相当陌生,所以请指出,如果您需要更多的信息,或者我的方法是无意义的。 动机 我有一个带有德州仪器公司的DM3730处理器的embedded式设备(您可以在Beagleboard-xm上find相同的结果)处理器通过显示子系统(DSS)连接到LCD显示器。 显示器看起来很暗,必须进行伽马校正。 幸运的是,DSS有一个Palette / gamma查找表。 不幸的是,我无法得到它的工作。 我发现了什么 我在德州仪器(TI)论坛上find了一个类似的问题,提出了一个类似的处理器,TI员工给出了下面的解释(重点是我的): 我不认为目前的Linux内核支持彩色索引graphics,但通过直接寄存器configuration从应用程序级别启用相当容易。 […] 接下来,声明一个包含256个无符号整数的数组,并用每个颜色索引条目所需的RGB值填充它。 将DISPC_GFX_TABLE_BA设置为之前configuration的arrays的物理地址(注1, 这需要物理地址而不是虚拟地址,因此您可能需要将其映射回注意2,这需要是一个32位alignment的地址,如何创build数组可能需要创build一个稍大的char数组,并填充数组,使得起始位于32位边界上) […] 他后来引用mem_util来转换地址,我可以使用它直接从应用程序级别(用户空间)写入寄存器,但我无法弄清楚如何将虚拟地址映射回物理地址。 系统信息 ~# uname -a Linux dm37x-evm 2.6.32.1 #1 Fri Dec 2 11:19:53 EST 2011 armv7l unknown 我的问题 如何将虚拟地址映射回物理地址? 这可以在用户空间完成吗? (我想象我提供了一个界面,用户可以调整伽玛曲线) 这是一个正确的方法吗? 我应该把它移到内核空间(我不愿意这么做,因为我没有很多Linux内核的经验) 任何好的资源或例子!
在下面的代码(char驱动程序的read实现)中,是否有可能在wait_event_interruptible期间更改MMU TLB条目,使得即使access_ok成功__put_user导致exception? 是否可以locking用户缓冲区,使其在请求期间保持有效? 在wait_event_interruptible返回后重复access_ok检查会使安全吗? ssize_t mydriver_pkt_read( struct file* filp, char __user* const buff, size_t count, loff_t* offp ) { struct mydriver_pkt_private* priv; volatile unsigned short* iobase; unsigned next; char __user* p = buff; if (count <= 0) return -EINVAL; if (!access_ok(VERIFY_WRITE, buff, count)) return -EFAULT; priv = (struct mydriver_pkt_private*)filp->private_data; iobase = priv->iobase; next = priv->retained; […]
我对kmalloc返回给我的地址有点困惑。 根据虚拟内存映射 ,我得到的地址是在ffff880000000000 – ffffc7ffffffffff范围内,所以“直接映射所有物理内存”。 这个映射如何工作? 我很确定,kmalloc不会简单地返回一个物理地址。
我正在调查embedded式系统的以太网驱动程序中的一些内存损坏问题。 我怀疑总线主控DMA控制器和慢速SDRAM之间的问题。 所以我想在快速SRAM中使用反弹缓冲器。 为此,我需要两件事:我必须将SRAM的物理地址(从总线主设备的angular度来看)放到DMA控制器缓冲区描述符中,一旦DMA控制器报告一个数据,我必须将数据从反弹缓冲区存入SDRAM的sk_buff传入数据包。 从阅读中我无法确定 http://vger.kernel.org/~davem/skb.html http://vger.kernel.org/~davem/skb_data.html 是skb-> data是一个物理地址还是虚拟地址。 即我应该打电话 memcpy(skb->data, phys_to_virt(bounce_addr), len); 要么 memcpy(phys_to_virt(skb->data), phys_to_virt(bounce_addr), len); 把数据包放到sk_buff中,这样linuxnetworking堆栈的其余部分就可以处理它了? 编辑: 这是有问题的驱动程序 。 我会说,它是通过虚拟地址到DMA控制器寄存器,因此无法正常工作,但我有这个代码工作的开发工具包。 然而,我的SDRAM没有像开发工具DDR SDRAM那么好的时序,所以我正在考虑实现反弹缓冲器。
在研究Linux内核时,我发现默认情况下,可执行文件有一个“可执行的”堆栈区域。 我自然认为唯一的(必要的)可执行区域是文本部分。 有没有与此有关的历史原因,或有任何实际用法?
希望标题清楚。 我有一个通过mmap()获得的内存块。 过了一段时间,我断定我不再需要这个范围内的数据。 但是,我仍然希望保持这个范围。 也就是说,我不想调用mummap()。 我试图成为一个好公民,而不是让系统交换超过需要。 有没有办法告诉Linux内核, 如果给定的页面是由一个物理页面支持, 如果内核决定它需要这个物理页面,不要打扰写这个页面交换? 我想在这个引擎盖下,这个神奇的函数调用会破坏给定的虚拟页面和物理页面之间的任何映射(如果存在的话),而不用先写入交换。
Intel core i5, Ubunu 16.04 我正在阅读关于这里的内存分页,现在试图尝试它。 我写了一个简单的汇编程序来获取Segmentation Fault并在gdb中运行。 这里是: section .text global _start _start: mov rax, 0xFFFFFFFFFFFF0A31 mov [val], eax mov eax, 4 mov ebx, 1 mov ecx, val mov edx, 2 int 0x80 mov eax, 1 int 0x80 segment .bss dummy resb 0xFFA val resb 1 我汇编并链接到一个64位ELF静态可执行文件。 据我看,每个进程都有自己的页面表,这是cr3注册点。 现在我想看看自己的页面表? 是否有可能在Linux中find关于进程页表的信息?
虽然我想了解32位cpu和Linux的高内存问题,但为什么64位cpu没有高内存问题呢? 特别是如何将虚拟内存划分为内核空间和用户空间,以便对64位cpu不存在高内存的需求? 谢谢。