從trust zone之我見知道,支援trustzone的晶元會跑在兩個世界。
普通世界、安全世界,對應高通這邊是hlos,qsee。
如下圖:
如下是hlos與qsee的軟體架構圖
qseecom driver 除了提供api,還呼叫scm函式做世界切換。
scm driver 那邊接到qseecom的呼叫後,會把hlos相關資料(包括指令引數)放入指它buffer,然後執行scm呼叫。
monitor就不用說了,切換世界用的,還處理shared buffer的內容。
是大概的架構圖,細節比較複雜,沒有開元。
下面通過乙個簡單的qseecom_security_test**來說明整個呼叫流程。
如下圖:
qseecom_security_test.c
int main( int argc, char *argv )初始化乙個barrier訊號變數,用於執行緒建立時的同步ret = pthread_create( &threads[j], null, &test_thread, (void*)j );//建立test_thread執行緒
}
void *test_thread( void* threadid )scm_call_common的實現如下:
static int scm_call_common(u32 svc_id, u32 cmd_id, const void *cmd_buf,__scm_call實現如下:size_t cmd_len, void *resp_buf, size_t resp_len,
struct scm_command *scm_buf,
size_t scm_buf_length)
while (!rsp->is_complete);
end = (unsigned long)scm_get_response_buffer(rsp) + resp_len;
scm_inv_range(start, end);
if (resp_buf)
memcpy(resp_buf, scm_get_response_buffer(rsp), resp_len);
return ret;
}
static int __scm_call(const struct scm_command *cmd)smc實現如下:
static u32 smc(u32 cmd_addr)實現如下:while (r0 == scm_interrupted);
return r0;
}
void *listener_thread( void* threadid )這個函式比較長,簡化一下,分步來看} while( 0 );
...}
整個過程執行完畢。如下:
void *test_thread( void* threadid )注:qseecom _xx開頭的函式都在kernel中的qseecom.c裡實現,scm系統呼叫,都在scm.c中實現。} while( 0 );
pthread_exit( null );
return null;
}
hlos user層把握qseecomapi.h檔案
hlos kernel層把握qseecom.c 和 scm.c兩檔案
謝謝
高通LCD背光控制軟體簡析
背光控制驅動分析 1,wled backlight 在driver leds 目錄下存放著系統背光以及led燈的驅動程式,通常需要在驅動程式中構造好struct led classdev結構體,用來描述當前的led裝置 structled classdev name 用來表述裝置的名稱,在註冊到le...
高通LCD之顯示幀資料簡析
1 顯示幀資料 mdp和su ceflinger之間通過hal層來鏈結 hwcomposer便是兩者之間的橋梁。hwcomposer顯示前,要開啟framebuffer裝置 hardware qcom display libhwcomposer hwc utils.cpp檔案 static int ...
簡談vuex的理解
vuex 組成部分 1.action 2.mutation 3.state 邊外component 通過元件通過dispatch派發action 型別有兩種寫法 以載荷形式分發this.store.dispatch cart delete id 以物件形式分發 store.dispatch disp...