zhcon源码中对vga驱动的处理
时间:2007-04-24 来源:hauto
linux启动时,若grub引导命令行下不指定"vga="参数,则启动后不支持framebuffer设备
在/dev目录下不会有fb*设备文件(注:即udev没有在/dev下创建该设备,该设备内核不支持)
此时,zhcon将使用bios提供的中断向量int 10h,设置显示模式。
其代码中,包含了在用户进程中调用bios中断处理,用到了系统调用 int 0x80
见代码:
lrmi_vm86(struct vm86_struct *vm)
{
int r;
asm volatile (
"int $0x80"
: "=a" (r)
: "0" (113), "b" (vm));
return r;
}
首先将113赋给寄存器eax(eax为调用号),vm赋给ebx,然后调用 int 0x80;
实际上,就是调用sys_vm86old
vm(为vm86_struct结构)中,regs.cs regs.ip事先赋为bios中中断向量10h的调用
地址
见 get_int_seg() 和 get_int_off(int i)
get_int_seg(int i) //i即为要调用的中断向量
{
return *(unsigned short *)(i * 4 + 2);
}
static inline unsigned int get_int_off(int i) { return *(unsigned short *)(i * 4); } 系统调用sys_vm86old处理完,从内核返回时将regs->cs regs->ip赋给 cs ip. 用户进程就从cs ip 处执行(这里就是执行bios中断处理)。
static inline unsigned int get_int_off(int i) { return *(unsigned short *)(i * 4); } 系统调用sys_vm86old处理完,从内核返回时将regs->cs regs->ip赋给 cs ip. 用户进程就从cs ip 处执行(这里就是执行bios中断处理)。
相关阅读 更多 +