- 論壇徽章:
- 0
|
看了下代碼,不得頭緒,還請(qǐng)指點(diǎn)下主要概念和參考資料,好去查閱。以前都只是LINUX應(yīng)用編程,內(nèi)核編程未有涉及。
下面是幾段源碼,不知道是要自己寫,還是有現(xiàn)成代碼?
/*
* Send to the message ring
*/
unsigned int fast_syscall_msgsnd(unsigned int size, unsigned int code,
unsigned int stid, unsigned long long msg0,
unsigned long long msg1)
{
unsigned int status,
arg0,
arg1,
arg2,
arg3;;
arg0 = (unsigned int)(msg0>>32);
arg1 = (unsigned int)(msg0);
arg2 = (unsigned int)(msg1>>32);
arg3 = (unsigned int)(msg1);
__asm__ volatile (
"move $8, %1\n" /* t0 = (((size-1)<<16)|(code<< |stid */
"move $9, %2\n" /* t1 = arg0 */
"move $10, %3\n" /* t2 = arg1 */
"move $11, %4\n" /* t3 = arg2 */
"move $12, %5\n" /* t4 = arg3 */
"syscall 1\n" /* syscall #xlr_fast_syscall_msgsnd */
"move %0, $9\n" /* status = t1 */
: "=r"(status)
: "r"(((size-1)<<16)|(code<< |stid), "r"(arg0), "r"(arg1), "r"(arg2), "r"(arg3)
:"$8", "$9", "$10", "$11", "$12"
);
return status;
}
/*
* Receive from the message ring
*/
int fast_syscall_msgrcv(int pri, int *size, int *code, int *src_id,
unsigned long long *msg0)
{
unsigned int result,
status,
arg0,
arg1;
__asm__ volatile (
"move $8, %4\n" /* t0 = pri */
"syscall 2\n" /* syscall #xlr_fast_syscall_msgld */
"move %0, $8\n" /* result = t0 */
"move %1, $9\n" /* arg0 = t1 */
"move %2, $10\n" /* arg1 = t2 */
"move %3, $11\n" /* status = t3 */
: "=r"(result), "=r"(arg0), "=r"(arg1), "=r"(status)
: "r"(pri)
:"$8", "$9", "$10", "$11"
);
if (!result) {
*size=((status & 0xc0)>>6)+1;
*code=(status & 0xff00)>>8;
*src_id=(status & 0x7f0000)>>16;
*msg0=(((unsigned long long)arg0)<<32)|arg1;
return 0;
}
return result;
} |
|