核心如何訪問使用者空間

2021-04-27 08:09:35 字數 1401 閱讀 6797

核心得到使用者傳來的, void *p,需要訪問它?

copy_to_user的實現:

copy_to_user

__copy_to_user

__copy_to_user_inatomic

__put_user_size

__put_user_asm/__copy_to_user_ll

__copy_to_user_ll or __copy_user

一般很少使用__copy_to_user, 而是使用__copy_user()...__copy_user():是直接使用使用者空間的指標來完成拷貝工作的!!!只有沒有在使用者上下文是才使用下面的方法:

get_user_pages並沒有直接使用使用者態位址,它是先根據使用者空間的位址得到對應的page(記憶體實體地址),又把這個page kmap_atomic了一下了

然後再進行memcpy

請看arch/i386/lib/usercopy.c

__copy_to_user_ll()

retval = get_user_pages(current, current->mm,

(unsigned long)to, 1, 1, 0, &pg, null);

......

maddr = kmap_atomic(pg, km_user0);

memcpy(maddr + offset, from, len);

kunmap_atomic(maddr, km_user0);

而kmap_atomic的實現分兩種情況:

1. 當使用者的page在低端記憶體時,核心已經對其進行了一一對映,直接可以使用,即,直接:return page->virtual;

2. 當使用者的page在高階記憶體時,由於核心並沒有對其進行一一對映,這時就需要建立臨時映**...

-------------------

kmalloc是基於slab實現的,當slab中沒有空閒的object可以分配時,它會向buddy system請求新的物理頁cache_grow -> kmem_getpages -> alloc_page_node, 得到物理頁後,就將這個物理頁所對應的kernel virtual address返回給slab. 因為slab allocator只使用low memory,所以這個virtual addr就是phy_addr + page_offset。這裡並沒有對page table的操作,kernel就直接使用這個virtual address來訪問物理記憶體,因為對映在初始化的時候早就做好了。

kmalloc()返回的指標就是這個virtual address + 偏移量(指向slab中不同的object).

如果在kernel中訪問high memory的話,就需要通過kmap_atomic把這個物理頁map到kernel[3g+896m,4g)的虛擬空間後,才能訪問。

核心空間與使用者空間

1.核心態與使用者態的區別 1 核心態 的 不受任何限制,可以訪問 所有處理器指令集 記憶體位址以及i o空間 2 使用者態的 只能訪問其位址空間的頁表項中規定的虛擬位址。2.使用者態到核心態的切換方式 1 系統呼叫 軟中斷的一種 由使用者程序主動發起 2 異常 當cpu在執行執行在使用者態下的程式...

使用者空間和核心空間

應用程式是從頭到尾執行單個任務。模組只是預先註冊自己以便服務於將來的某個請求,模組初始化函式的任務就是為以後呼叫模組函式預先做準備,就像模組說 我在這,並且我能做這些工作。模組的退出函式將在模組被解除安裝前呼叫,他告訴核心 我要離開了,不要再讓我做任何事了。應用程式在退出時,可以不管資源的釋放或其他...

核心空間與使用者空間

首先,這個概念的由來,我認為跟cpu的發展有很大關係,在目前cpu的保護模式下,系統需要對其賴以執行的資料進行保護,為了保證作業系統核心資料,我們把記憶體空間進行劃分,一部分為作業系統核心執行的空間,另一部分是應用程式執行的空間,所謂空間就是記憶體的位址。因此核心空間和使用者空間的概念就出現了。在3...