linux源代码剖析之include-asm

include-asm
汇编

io.h
#define outb(value,port)
asm (“outb %%al,%%dx”::“a” (value),“d” (port))

#define inb(port) ({
unsigned char _v;
asm volatile (“inb %%dx,%%al”:"=a" (_v):“d” (port));
_v;
})

#define outb_p(value,port)
asm (“outb %%al,%%dx\n”
“\tjmp 1f\n”
“1:\tjmp 1f\n”
“1:”::“a” (value),“d” (port))

#define inb_p(port) ({
unsigned char _v;
asm volatile (“inb %%dx,%%al\n”
“\tjmp 1f\n”
“1:\tjmp 1f\n”
“1:”:"=a" (_v):“d” (port));
_v;
})



memory.h
/*

  • NOTE!!! memcpy(dest,src,n) assumes ds=es=normal data segment. This
  • goes for all kernel functions (ds=es=kernel space, fs=local data,
  • gs=null), as well as for all well-behaving user programs (ds=es=
  • user data space). This is NOT a bug, as any user program that changes
  • es deserves to die if it isn’t careful.
    */
    #define memcpy(dest,src,n) ({
    void * _res = dest;
    asm (“cld;rep;movsb”
    ::“D” ((long)(_res)),“S” ((long)(src)),“c” ((long) (n))
    :“di”,“si”,“cx”);
    _res;
    })


segment.h
extern inline unsigned char get_fs_byte(const char * addr)
{
unsigned register char _v;

__asm__ ("movb %%fs:%1,%0":"=r" (_v):"m" (*addr));
return _v;

}

extern inline unsigned short get_fs_word(const unsigned short *addr)
{
unsigned short _v;

__asm__ ("movw %%fs:%1,%0":"=r" (_v):"m" (*addr));
return _v;

}

extern inline unsigned long get_fs_long(const unsigned long *addr)
{
unsigned long _v;

__asm__ ("movl %%fs:%1,%0":"=r" (_v):"m" (*addr)); \
return _v;

}

extern inline void put_fs_byte(char val,char *addr)
{
asm (“movb %0,%%fs:%1”::“r” (val),“m” (*addr));
}

extern inline void put_fs_word(short val,short * addr)
{
asm (“movw %0,%%fs:%1”::“r” (val),“m” (*addr));
}

extern inline void put_fs_long(unsigned long val,unsigned long * addr)
{
asm (“movl %0,%%fs:%1”::“r” (val),“m” (*addr));
}



system.h
#define move_to_user_mode()
asm (“movl %%esp,%%eax\n\t”
“pushl $0x17\n\t”
“pushl %%eax\n\t”
“pushfl\n\t”
“pushl $0x0f\n\t”
“pushl $1f\n\t”
“iret\n”
“1:\tmovl $0x17,%%eax\n\t”
“movw %%ax,%%ds\n\t”
“movw %%ax,%%es\n\t”
“movw %%ax,%%fs\n\t”
“movw %%ax,%%gs”
:::“ax”)

#define sti() asm (“sti”:😃
#define cli() asm (“cli”:😃
#define nop() asm (“nop”:😃

#define iret() asm (“iret”:😃

#define _set_gate(gate_addr,type,dpl,addr)
asm (“movw %%dx,%%ax\n\t”
“movw %0,%%dx\n\t”
“movl %%eax,%1\n\t”
“movl %%edx,%2”
:
: “i” ((short) (0x8000+(dpl<<13)+(type<<8))),
“o” (*((char ) (gate_addr))),
“o” (
(4+(char *) (gate_addr))),
“d” ((char *) (addr)),“a” (0x00080000))

#define set_intr_gate(n,addr)
_set_gate(&idt[n],14,0,addr)

#define set_trap_gate(n,addr)
_set_gate(&idt[n],15,0,addr)

#define set_system_gate(n,addr)
_set_gate(&idt[n],15,3,addr)

#define _set_seg_desc(gate_addr,type,dpl,base,limit) {
*(gate_addr) = ((base) & 0xff000000) |
(((base) & 0x00ff0000)>>16) |
((limit) & 0xf0000) |
((dpl)<<13) |
(0x00408000) |
((type)<<8);
*((gate_addr)+1) = (((base) & 0x0000ffff)<<16) |
((limit) & 0x0ffff); }

#define _set_tssldt_desc(n,addr,type)
asm (“movw $104,%1\n\t”
“movw %%ax,%2\n\t”
“rorl $16,%%eax\n\t”
“movb %%al,%3\n\t”
“movb $” type “,%4\n\t”
“movb $0x00,%5\n\t”
“movb %%ah,%6\n\t”
“rorl $16,%%eax”
::“a” (addr), “m” ((n)), “m” ((n+2)), “m” ((n+4)),
“m” (
(n+5)), “m” ((n+6)), “m” ((n+7))
)

#define set_tss_desc(n,addr) _set_tssldt_desc(((char *) (n)),addr,“0x89”)
#define set_ldt_desc(n,addr) _set_tssldt_desc(((char *) (n)),addr,“0x82”)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

低调的小哥哥

你的关注就是我为你服务的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值