1. 程式人生 > >LINUX核心記憶體管理kmalloc,vmalloc

LINUX核心記憶體管理kmalloc,vmalloc

  1 #include <linux/init.h>
  2 #include <linux/thread_info.h>
  3 #include <linux/module.h>
  4 #include <linux/sched.h>
  5 #include <linux/errno.h>
  6 #include <linux/kernel.h>
  7 #include <linux/module.h>
  8 #include <linux/slab.h>
  9 #include <linux/input.h>
 10
#include <linux/init.h> 11 #include <linux/serio.h> 12 #include <linux/delay.h> 13 #include <linux/clk.h> 14 #include <linux/miscdevice.h> 15 #include <linux/io.h> 16 #include <linux/ioport.h> 17 #include <linux/vmalloc.h> 18 #include <linux/dma-mapping.h> 19
#include <linux/export.h> 20 #include <linux/gfp.h> 21 22 #include <asm/dma-mapping.h> 23 #include <asm/uaccess.h> 24 25 #include <linux/gpio.h> 26 #include <mach/gpio.h> 27 #include <plat/gpio-cfg.h> 28 29 MODULE_LICENSE("GPL"); 30 MODULE_AUTHOR("
bunfly"); 31 32 33 unsigned long vmalloc_to_pfn(const void *vmalloc_addr); 34 int test_init() 35 { 36 int ret = 0; 37 unsigned char *vmalloc_virt, *normal_virt, *phys; 38 unsigned long pfn; 39 40 printk("KERNEL SPACE: init\n"); 41 42 printk("KERNEL SPACE: read from d0003000: %s\n", 0xd0003000); 43 //讀出d0003000虛擬地址裡面的資料 44 45 normal_virt = kmalloc(40, GFP_KERNEL); 46 //kmalloc分配一段虛擬地址,大小,睡眠不可中斷 47 48 phys = virt_to_phys(normal_virt); 49 printk("KMAKLLOC: kmalloc virt: %p <==> phys: %p\n", normal_virt, phys); 50 51 kfree(normal_virt); 52 53 //分配頁 54 //-------------------------------------- 55 vmalloc_virt = vmalloc(500); 56 //vmalloc分配記憶體 57 58 pfn = vmalloc_to_pfn(vmalloc_virt); 59 //頁分配 60 phys = (pfn << 12) | ((unsigned long)vmalloc_virt & 0xfff); 61 //將頁地址轉換成實體地址 62 normal_virt = phys_to_virt(phys); 63 //再將實體地址轉換成虛擬地址 64 printk("VMALLOC: vmalloc_virt = %p, normal_virt = %p\n", vmalloc_virt, normal_virt); 65 66 //dma分配 67 normal_virt = dma_alloc_coherent(NULL, 1024, &phys, GFP_KERNEL); 68 printk("DMA: vmalloc_virt = %p, normal_virt = %p\n", vmalloc_virt,phys); 69 dma_free_coherent(NULL, 1024, normal_virt, phys); 70 71 vfree(vmalloc_virt); 72 return 0; 73 } 74 75 void test_exit() 76 { 77 printk("KERNEL SPACE: exit\n"); 78 } 79 80 module_init(test_init); 81 module_exit(test_exit); 82 ~ ~ ~

相關推薦

LINUX核心記憶體管理kmalloc,vmalloc

1 #include <linux/init.h> 2 #include <linux/thread_info.h> 3 #include <linux/module.h> 4 #include <linux/sched.h> 5

Linux 記憶體管理vmalloc實現

vmalloc最小分配一個page.並且分配到的頁面不保證是連續的.因為vmalloc內部呼叫alloc_page多次分配單個頁面. vmalloc主要內容: 1. 從VMALLOC_START到VMALLOC_END查詢空閒的虛擬地址空間(hole) 2.根據分配的size,呼叫all

深入理解 Linux 核心---記憶體管理

核心中的函式以比較直接了當的方式獲得動態記憶體: __get_free_pages() 或 alloc_pages() 從分割槽頁框分配器獲得頁框。 kmem_cache_alloc() 或 kmalloc() 使用 slab 分配器為專用或通用物件分配塊。 vm

深入淺出Linux核心記憶體管理基礎

1 背景 記憶體管理是Linux核心通過軟硬體協作來管理記憶體的分配及回收的一種方法。在Linux系統上電自檢(POST,Power-On-Self-Test)階段使用臨時記憶體,而系統啟動後正常執行階段的記憶體使用又有兩大類:(1)固定的記憶體分配,是永久的不變的,主要

linux核心記憶體管理學習之二(實體記憶體管理--夥伴系統)

linux使用夥伴系統來管理實體記憶體頁。 一、夥伴系統原理 1. 夥伴關係 定義:由一個母實體分成的兩個各方面屬性一致的兩個子實體,這兩個子實體就處於夥伴關係。在作業系統分配記憶體的過程中,一個記憶體塊常常被分成兩個大小相等的記憶體塊,這兩個大小相等的記憶體塊就處於夥伴關

Linux核心記憶體管理架構

記憶體管理子系統可能是linux核心中最為複雜的一個子系統,其支援的功能需求眾多,如頁面對映、頁面分配、頁面回收、頁面交換、冷熱頁面、緊急頁面、頁面碎片管理、頁面快取、頁面統計等,而且對效能也有很高的要求。本文從記憶體管理硬體架構、地址空間劃分和記憶體管理軟體架構三個方面入手

linux 核心 記憶體管理 slub演算法 (一) 原理

        核心管理頁面使用了2個演算法:夥伴演算法和slub演算法,夥伴演算法以頁為單位管理記憶體,但在大多數情況下,程式需要的並不是一整頁,而是幾個、幾十個位元組的小記憶體。於是需要另外一套系統來完成對小記憶體的管理,這就是slub系統。slub系統執行在夥伴系統之

linux記憶體管理——kmallocvmalloc

直接對映區:線性空間中從3G開始最大896M的區間,為直接記憶體對映區,該區域的線性地址和實體地址存線上性轉換關係:線性地址=3G+實體地址。 動態記憶體對映區:該區域由核心函式vmalloc

Linux記憶體管理vmallockmalloc

vmalloc()函式的工作方式類似於kmalloc(),只不過前者分配的記憶體虛擬地址是連續的,而實體地址則無需連續。這也是使用者空間分配函式的工作方式:由malloc()(這個函式我們後續還會介紹,這也是我們在使用者空間進行開發的時候經常會碰到的一個記憶體分配函式)返回的頁在程序的虛擬地址空間內是連續的,

linux高階記憶體管理之永久核心對映

與直接對映的實體記憶體末端、高階記憶體的始端所對應的線性地址存放在high_memory變數中,在x86體系結構上,高於896MB的所有實體記憶體的範圍大都是高階記憶體,它並不會永久地或自動地對映到核心地址空間,儘管x86處理器能夠定址物理RAM的範圍達到4GB(啟用PAE可以定址到64GB)。一旦這些頁被

Linux核心學習筆記九——核心記憶體管理方式

一 頁        核心把物理頁作為記憶體管理的基本單位;記憶體管理單元(MMU)把虛擬地址轉換為物理 地址,通常以頁為單位進行處理。MMU以頁大小為單位來管理系統中的也表。        32位系統:頁大小4KB        64位系統:頁大小8KB 核心

linux核心記憶體分配

核心中的記憶體分配通常通過kmalloc/kfree來進行,但是也有其它的方式來獲取記憶體,所有這些方式共同提供了核心中分配、釋放記憶體的介面。 一、kmalloc/kfree 類似於標準C中的malloc/free,kmalloc/kfree是核心中的用於常規記憶體分配的介面。 kma

Linux核心電源管理綜述

資料:http://blog.csdn.net/bingqingsuimeng/article/category/1228414http://os.chinaunix.net/a2006/0519/1002/000001002210.shtmlhttp://www.ednchina.com/ART_44010

Linux 核心初級管理

Linux 核心初步管理     單核心體系設計,但充分借鑑了微核心設計體系的優點,微核心引入模組化機制;         核心組成部分:             kernel:核心核心,一般為bzImage,通常在/boot目錄下,名稱為vmlinuz-VERSION-RE

Linux系統記憶體管理之夥伴系統分析

 1.夥伴系統概念   夥伴系統是一種經典的記憶體管理方法。Linux夥伴系統的引入為核心提供了一種用於分配一組連續的頁而建立的一種高效的分配策略,並有效的解決了外碎片問題。  2.夥伴系統的組織結構 Linux中的記憶體管理的“頁”大小為4KB。把所有的空閒頁分組

不要盲目增加ip_conntrack_max-理解Linux核心記憶體

                1.由ip_conntrack引出的Linux記憶體對映有很多文章在討論關於ip_conntrack表爆滿之後丟棄資料包的問題,對此研究深入一些的知道Linux有個核心引數ip_conntrack_max,在擁有較大記憶體的機器中預設65536,於是瘋狂的增加這個引數,比如設定

不要盲目增加ip conntrack max-理解Linux核心記憶體

1.由ip_conntrack引出的Linux記憶體對映 有很多文章在討論關於ip_conntrack表爆滿之後丟棄資料包的問題,對此研究深入一些的知道Linux有個核心引數ip_conntrack_max,在擁有較大記憶體的機器中預設65536,於是瘋狂的增加這個引數,比如設定成10000…00,只要

簡述Linux虛擬記憶體管理

原文地址:https://cloud.tencent.com/ developer/article/1157420 虛擬儲存 虛擬儲存(virtual memory, VM)的基本思想是: 維護一個虛擬的邏輯記憶體機制(通常比實體記憶體大得多), 程序都基於這個虛擬記憶體, 在

Linux核心時間管理子系統——時鐘源

struct clocksource { /* * Hotpath data, fits in a single cache line when the * clocksource itself is cacheline aligned.

linux核心記憶體問題檢測除錯

記憶體檢測: 編譯slabinfo,對應在核心原始碼tools/vm下 /* * Slabinfo: Tool to get reports about slabs * * (C) 2007 sgi, Christoph Lameter * (C