簡談高通Trustzone的實現

2021-07-31 11:12:57 字數 1765 閱讀 1383

從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 )

ret = pthread_create( &threads[j], null, &test_thread, (void*)j );//建立test_thread執行緒

}

初始化乙個barrier訊號變數,用於執行緒建立時的同步

void *test_thread( void* threadid )

scm_call_common的實現如下:

static int scm_call_common(u32 svc_id, u32 cmd_id, const void *cmd_buf,

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;

}

__scm_call實現如下:

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 )

} while( 0 );

pthread_exit( null );

return null;

}

注:qseecom _xx開頭的函式都在kernel中的qseecom.c裡實現,scm系統呼叫,都在scm.c中實現。

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...