copy_from_user 與 copy_to_user 函式在使用使用user space指標的時候都會用access_ok 函式檢查
檢查的內容:
#define access_ok(type, addr, size) (__range_ok(addr, size) == 0)
#define __range_ok(addr, size) ()
static inline void __chk_user_ptr(const volatile void *p, size_t size)
asm c嵌入彙編:
int a=10,b;
asm("movl %1, %%eax;
movl %%eax, %0;"
:"=r"(b) /*輸出部*/
:"r"(a) /*輸入部*/
:"%eax" /*毀壞部*/
);
表示c語言裡的「b=a;」r表示使用任意暫存器,%0、%1表示使用兩個暫存器,一般只能%0~%9共十個運算元,按輸出輸入部變數出現順序進行對映。暫存器用兩個百分號,是因為使用了%0%1這些數字使百分號有了特殊意義,所以在運算元出現的暫存器必須用雙百分表示。毀壞部裡邊的%eax表示eax暫存器在彙編**塊執行過程中會被改寫,在執行前要保護好,這是提交給編
譯器決定的。
adds %1, %2, %3
rosum = addr + size 這個操作影響狀態位(目的是影響是進製標誌c),以下的兩個指令都帶有條件cc,也就是當c=0的時候才執行。
如果上面的加法指令進製了(c=1),則以下的指令都不執行,flag就為初始值current_thread_info()->addr_limit(非0),並返回。
如果沒有進製(c=0),就執行下面的指令:
sbcccs %1, %1, %0
rosum = rosum - flag - 1,也就是(addr + size) - (current_thread_info()->addr_limit) - 1,操作影響符號位。
如果(addr + size) >= (current_thread_info()->addr_limit) - 1,則c=1
如果(addr + size) < (current_thread_info()->addr_limit) - 1,則c=0
當c=0的時候執行以下指令,否則跳過(flag非零)。
movcc %0, #0
flag = 0,給flag賦值0。
綜上所述:__range_ok巨集其實等價於:
如果(addr + size) >= (current_thread_info()->addr_limit) - 1,返回非零值
如果(addr + size) < (current_thread_info()->addr_limit),返回零
而access_ok就是檢驗將要操作的使用者空間的位址範圍是否在當前程序的使用者位址空間限制中。這個巨集的功能很簡單,完全可以用c實現,不是必須使用彙編。但於這兩個函式使用頻繁,就使用彙編來實現部分功能來增加效率。
從這裡再次可以認識到,copy_from_user的使用是結合程序上下文的,因為他們要訪問「user」的記憶體空間,這個「user」必須是某個特定的程序。通過上面的原始碼就知道,其中使用了current_thread_info()來檢查空間是否可以訪問。如果在驅動中使用這兩個函式,必須是在實現系統呼叫的函式中使用,不可在實現中斷處理的函式中使用。如果在中斷上下文中使用了,那**就很可能操作了根本不相關的程序位址空間。其次由於操作的頁面可能被換出,這兩個函式可能會休眠,所以同樣不可在中斷上下文中使用。
使用者模組 使用者登出
退出登入 大概步驟 servlet層 退出登入 1 銷毀session 2 刪除cookie 3 跳轉到登入頁面 1 銷毀session 2 刪除cookie 3 跳轉到登入頁面前台 1.銷毀session request.getsession.invalidate 2.刪除cookie cooki...
使用者與使用者管理
使用者賬號的新增 刪除 修改以及使用者密碼的管理 使用者組的管理 注意三個檔案 etc passwd 儲存使用者的關鍵資訊 etc group 儲存使用者組的關鍵資訊 etc shadow 儲存使用者密碼的資訊 1 使用者管理 新增使用者 常用語法 useradd 選項 使用者名稱 g 表示指定使用...
騰訊所擁有的 使用者,使用者,還是使用者
不是我們這些做程式的 做it的,誰會去在乎tx創新不創新?他們更在乎的,是東西好不好用,聯絡朋友方便不方便。大家可以試試,問問你身邊的人,當然,不是你本行業的朋友,看看有幾個知道這個在我們it業鬧的沸沸揚揚的大論戰。再問問他們tx的創新問題,他們也許會說 某某東西不就是qq做出來的嗎?身邊就有很多例...