kernel建立一裝置分配記憶體, 並將記憶體位址通過d_mmap 對映, userland使用mmap!
參考/sys/dev/mem/memdev.c.
freebsd 7.1
kernel **:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//#include
//#include
/* for use with destroy_dev(9). */
static struct cdev *memio_dev;
static d_write_t memio_write;
static d_ioctl_t memio_ioctl;
static d_read_t memio_read;
static d_mmap_t memio_mmap;
#define memio_minor 212
static struct cdevsw memio_cdevsw = ;
static void *zbuf;
static int
memio_read(struct cdev *dev __unused, struct uio *uio, int flags __unused)
/* argsused */
static int
memio_write(struct cdev *dev __unused, struct uio *uio, int flags __unused)
static int
memio_mmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr,
int prot __unused)
/* argsused */
static int
memio_ioctl(struct cdev *dev __unused, u_long cmd, caddr_t data __unused,
int flags __unused, struct thread *td)
/* argsused */
static int
memio_modevent(module_t mod __unused, int type, void *data __unused)
return (0);
}dev_module(memio, memio_modevent, null);
module_version(memio, 1);
makefile
srcs = main.c
kmod = memio
ko = $(kmod).ko
kldmod = t
.include
userland test**
#include
#include
#include
#include
#define page_size 4096
int main ( int argc, char **argv )
char * address = null;
address = mmap(null, page_size, prot_read|prot_write, map_shared, configfd, 0);
if (address == map_failed)
printf("address=%p/n", address );
printf("initial message: %s/n", address);
memcpy(address + 11 , "*user*", 6);
printf("changed message: %s/n", address);
close(configfd);
return 0;
}
核心空間與使用者空間
1.核心態與使用者態的區別 1 核心態 的 不受任何限制,可以訪問 所有處理器指令集 記憶體位址以及i o空間 2 使用者態的 只能訪問其位址空間的頁表項中規定的虛擬位址。2.使用者態到核心態的切換方式 1 系統呼叫 軟中斷的一種 由使用者程序主動發起 2 異常 當cpu在執行執行在使用者態下的程式...
核心空間與使用者空間
首先,這個概念的由來,我認為跟cpu的發展有很大關係,在目前cpu的保護模式下,系統需要對其賴以執行的資料進行保護,為了保證作業系統核心資料,我們把記憶體空間進行劃分,一部分為作業系統核心執行的空間,另一部分是應用程式執行的空間,所謂空間就是記憶體的位址。因此核心空間和使用者空間的概念就出現了。在3...
核心空間與使用者空間
關於虛擬記憶體有三點需要注意 上圖展示了整個程序位址空間的分布,其中4g的位址空間分為兩部分,在使用者空間內,對應了記憶體分布的五個段 資料段 段 bss段 堆 棧。在上篇文章中有詳細的介紹。這個圖示核心使用者空間的劃分,圖中最重要的就是高階記憶體的對映 其中kmalloc和vmalloc函式申請的...