mudos阅读笔记2

 上次写的东西因为csdn的bug丢了只好在写一遍,让天父原谅他的罪。

mudos的lex文件是在flex建立的基础上修改的但改动较大,文件的读写入口在yyin_desc,读入文件是在correct_read可能是个被修改的函数因为读进来的是缓冲区而不是line,但用了MAXLINE宏。refill_buffer() 函数会在合适的时候重新填充缓冲区。
    我将详细的说下和调试相关的部分,在program_t部分有
unsigned char *line_info;   /* Line number information */
unsigned short *file_info;
两个变量,其中line_info是行信息,file_info是每个文件行长度,
line_info是一个map结构,key是binary的偏移量,value是对应原文件的行号。
value是一个变长值所以你会在find_line看到这么一个写法

    lns = progp->line_info;
    while (offset > *lns) {
 offset -= *lns;//减去key值找到最合适的
 lns += (sizeof(ADDRESS_TYPE) + 1);//下一个key值注意这里可以理解成sizeof(value)+sizeof(key)
    }
   
#if !defined(USE_32BIT_ADDRESSES) && !defined(LPC_TO_C)
    COPY_SHORT(&abs_line, lns + 1);//拷贝value到abs_line
#else
    COPY_INT(&abs_line, lns + 1);
#endif

在translate_absolute_line回找到对应绝对行数的文件内偏移的相对行数.

简单的说对应binery文件的原文件是一个以main为开始混杂了头文件的类似应用程序的binery结构。每个文件被当作了一个program相关信息记录在program_t。
switch_to_line记录了binery对应的行到A_LINENUMBERS动态内存中。
  mem_block是一套动态的内存分配机制。switch_to_line是在epilog后期整理的时候调用的可以这么理解yyparse翻译原文件成为n多个二进制的代码块,每个代码块记录截止行号。在i_generate_node生成语法树时调用switch_to_line记录行号。
  save_file_info会存储每个文件对应的行长度并且对应文件先后次序和在binery的先后次序也是相同的。
  很惊喜地偶然发现了#breakpoint命令在lex.C的1582 line 调用了lex_breakpoint();但这函数是空的。

你可能感兴趣的:(mudos阅读笔记2)