文档章节

QEMU1.3.0的源码分析三:user model之linux

snsn1984
 snsn1984
发布于 2012/12/11 11:30
字数 633
阅读 775
收藏 5

作者:snsn1984

从源码目录来看,user model有两块内容bsd-user和linux-user。我主要研究了下linux-user这种情况。

首先要提一下通常容易关注的焦点,linux-user下的函数入口点:/源码目录/linux-user/main.c中的
Line:3388    int main(int argc, char **argv, char **envp).
找到了入口函数,就可以根据这个main函数中的调用关系来看看这个情况下的主要执行流程和动作了。

int main(int argc, char **argv, char **envp)
{

    module_call_init(MODULE_INIT_QOM);

    qemu_cache_utils_init(envp);

    /*初始化了tcg的相关部分,包含了cpu动态转化的一些初始化操作。*/
    tcg_exec_init(0);
    cpu_exec_init_all();

    /*包含了虚拟cpu的初始化*/
    env = cpu_init(cpu_model);
 
    /*加载可执行程序,即Guest code*/
    ret = loader_exec(filename, target_argv, target_environ, regs,
        info, &bprm);


    target_set_brk(info->brk);
    /*系统调用初始化*/
    syscall_init();
    /*信号初始化*/
    signal_init();

   /*此函数是主要的循环体,通过这个函数来实现对指令的动态翻译,并且执行翻译之后的Host Code。
   通过最终调用cpu_gen_code()函数(位于translate-all.c文件中)来实现
    动态翻译,其中调用了两个关键函数。一个关键函数是gen_intermediate_code()
   函数(位于target-arm/translate.c,此处以guest指令集为arm为例,其他的可以自行替换),
   这个函数的主要功能是根据Guest Code生成TCG Operations。另外一个重要的函数是
  tcg_gen_code()函数(位于tcg/tcg.c),这个函数主要是把TCG Operations转化成Host code。*/
    cpu_loop(env);
    /* never exits */
 
    return 0;
}

下面来分析下刚才介绍的重要函数cpu_loop(). cpu_loop()函数在linux-user/main.c中有多个版本,区别在于参数,参数是不同的cpu state,下面举例仍然以arm为主。

void cpu_loop(CPUARMState *env)
{
    int trapnr;
    unsigned int n, insn;
    target_siginfo_t info;
    uint32_t addr;

    for(;;) {
        cpu_exec_start(env);
        trapnr = cpu_arm_exec(env);
        cpu_exec_end(env);
   ...............
}
可以看到for循环里有三个函数调用,分别是cpu_exec_start,cpu_arm_exec,cpu_exec_end。其中最重要的
cpu_arm_exec函数,通过target-arm/cpu.h中的宏定义#define cpu_exec cpu_arm_exec调用了cpu-exec.c文件
中的cpu_exec()函数。
cpu_exec()是整个qemu中的一个重要函数,它负责整个核心的从guest code 到host code的翻译和执行。
cpu_exec()首先会去调用tb_find_fast(),tb_find_fast()会判断取回来的tb是否合法,如果不合法会去调用tb_find_slow()函数。
tb_find_slow()会试图通过物理mapping去寻找tb,如果寻找失败则会调用tb_gen_code()去翻译代码。
cpu_exec()函数调用tb_find_fast()之后会调用tcg_qemu_tb_exec()去执行所找到的tb。最后再调用cpu_exec_nocache()去执行剩下的代码。

© 著作权归作者所有

共有 人打赏支持
snsn1984
粉丝 91
博文 32
码字总数 45245
作品 0
长春
项目经理
加载中

评论(2)

snsn1984
snsn1984

引用来自“麦子粒粒香”的评论

你好 在社区看见你对QEMU的学习经验共享 我现在准备开始着手学习QEMU 想要做该平台上的动态优化 后期可能有很多问题 能否留个邮箱什么的方便讨论交流 谢谢

好的,snsn19840203@163.com.欢迎交流,最近关注QEMU不是特别多。
麦子粒粒香
你好 在社区看见你对QEMU的学习经验共享 我现在准备开始着手学习QEMU 想要做该平台上的动态优化 后期可能有很多问题 能否留个邮箱什么的方便讨论交流 谢谢
QEMU1.3.0的源码分析一 : 源码目录简介

作者:snsn1984 最近在研究QEMU,读了一些QEMU的源码,因为涉及的东西比较多,找到的资料又都比较破碎,不太完整。所以将最近的成果总结一下。 相比其他的开源软件来说,QEMU源码下面目录比较...

snsn1984
2012/12/06
0
0
Lavavel笔记 Eloquent ORM分页源码分析

安装了laravel-debugbar后打开一个列表页面,发现页面输出有两个 select count(*) 语句,这是一个严重的设计缺陷呀。 查看代码 $users = User::where('votes', '>', 100)->paginate(15);$cou...

daweilang
2017/03/12
0
0
JFinal之Model功能扩展的问题

JFinal中POJO的定义与DAO是可以放在一起的,这个JFinal已经给了很好的例子: public static final User dao = new User(); 这个dao是定义在User中的,User是继承Model的POJO类,在该类中如定...

Jetmark
2013/05/11
2.2K
5
processes, threads and signals in Linux

之前想知道process和threads在Linux kernel中的调度问题,后来就想知道linux如何支持multithreaded application了;感谢几位osc的朋友提供的资料和帮助。对于以上两个问题,我了解了个大概。...

ChenQi
2012/04/10
0
2
ThinkPHP框架安全实现分析

ThinkPHP框架是国内比较流行的PHP框架之一,虽然跟国外的那些个框架没法比,但优点在于,恩,中文手册很全面。最近研究SQL注入,之前用TP框架的时候因为底层提供了安全功能,在开发过程中没怎...

simple简单
2016/12/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

多线程

1. 多线程概念。并发和并行的概念。 多线程指的是一段时间内cpu同时执行多个线程。一个程序至少运行>=1个进程,进程就是运行中的程序,而一个进程至少运行>=1个线程,线程是操作系统能调度的...

鱼想吃肉
今天
0
0
HBase 表修复在线方式和离线方式

一、在线修复 1.1 使用检查命令 $ ./bin/hbase hbck 该命令可完整修复 HBase 元数据信息;存在有错误信息会进行输出; 也可以通过如下命令查看详细信息: $ ./bin/hbase hbck -details 1.2 ...

Ryan-瑞恩
今天
3
0
redis 系列二 -- 常用命令

1.基础命令 info ping quit save dbsize select flushdb flushall 2.键命令 2.1 set 直接赋值 set a a 2.2 get 取值 get a 2.3 exists 是否存在 exists a 2.4 expire 设置剩余时间 秒 expire......

imbiao
今天
2
0
php foreach

<?php// 数组的引用$a=array(1,2,3,4,5);foreach($a as $key=>&$value){$value=$value*2;}print_r($a);echo " $key -------------------$value\r\n";/** * ...

小张525
今天
3
0
12-利用思维导图梳理JavaSE-多线程

12-利用思维导图梳理JavaSE-多线程 主要内容 1.线程概念 2.线程开发 3.线程的状态 4.线程的同步和死锁 5.Java5.0并发库类 QQ/知识星球/个人WeChat/公众号二维码 本文为原创文章,如果对你有一...

飞鱼说编程
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部