1.linux ping命令中的源码struct proto
2.linux内核$(kallsyms.o)详解续篇 --- 内核符号表的生成和查找过程
3.WindowProcåDefWindowProcçåºå«
linux ping命令中的struct proto
fproc是函数指针,指向函数的入口地址。
标准写法是源码proto_v4.fproc = &proc_v4;
可以简写为proto_v4.fproc = proc_v4;
编译器都认识。
用函数指针通常可以封装某些内部信息,源码参数可以通过消息传递。源码
可能的源码一种调用形式为:
void process(struct proto *p,u msg[4])
{
char *s = (char*)msg[0];
ssize_t *sz = (ssize_t*)msg[1];
struct timeval *tv = (struct timeval*)msg[2];
p->fproc(s,*sz,tv);
}
结构体初始化用=有什么问题吗?
linux内核$(kallsyms.o)详解续篇 --- 内核符号表的生成和查找过程
在内核中,维护着一张符号表,源码shiro注解权限源码记录着内核中的源码所有符号,包括函数与全局变量的源码地址与名称。这张表嵌入在内核镜像中,源码供内核运行时随时查找符号名。源码通过调用__print_symbol,源码内核代码能打印出符号名。源码 接下来,源码我们将详细解析内核符号表的源码生成与查找过程。系统映像文件与/proc/kallsyms的源码利物周边源码区别与联系
系统映像文件(System.map)在编译内核时生成,记录了内核中的所有符号及其在内存中的虚拟地址。文件由scripts/mksysmap脚本生成,依赖于nm命令。系统映像文件的每条记录包括地址、符号类型与符号名。符号类型包括函数、全局变量等。oa源码 项目管理 而/proc/kallsyms文件是在内核启动后自动生成,位于/proc目录下,其代码实现于kernel/kallsyms.c。区别在于它包含了内核模块的符号列表,并且允许用户态访问,非内核常规操作。通常,扫码投币源码我们只需关注_stext ~ _etext 和 _sinittext ~ _einittext之间的符号。内核符号表的生成与查找
内核在运行过程中可能需要查找地址对应的函数名,如Oops或调试信息输出。但内核并未依赖System.map或/proc/kallsyms文件,而是通过vmlinux中的符号表(.tmp_vmlinux2.o)实现快速查找。内核符号表结构
内嵌符号表通过scripts/kallsyms工具生成,源码位于kallsyms.c。出手机plp源码该表包含6个全局变量:kallsyms_addresses、kallsyms_num_syms、kallsyms_names、kallsyms_token_table、kallsyms_token_index与kallsyms_markers。其中,kallsyms_addresses记录所有符号地址,kallsyms_num_syms统计符号数量,kallsyms_names存放符号名,kallsyms_token_table与kallsyms_token_index用于压缩存储高频率字符串。压缩算法与优化
内核使用压缩算法减少存储开销,将高频率字符串表示为token,并通过kallsyms_token_table与kallsyms_token_index实现压缩与解压。kallsyms_markers将符号每个分组,加速查找过程。查找过程实例与源码分析
举例说明查找地址0xc对应的符号名。首先在System.map中定位到该地址位于__create_page_tables与__enable_mmu之间。在.tmp_kallsyms2.S文件中,利用二分查找定位符号地址,然后通过kallsyms_names与kallsyms_markers加速查找过程。最后解析压缩的符号名,得到结果为__enable_mmu。内核模块符号查找
内核模块在启动时动态加载,其符号表存储在struct module结构中,所有已加载模块的struct module结构构成全局链表。查找内核模块中的符号时,调用kallsyms_lookup()函数,模块符号查找由get_ksymbol()函数完成。WindowProcåDefWindowProcçåºå«
1.
WindowProcæ¯ä½ ç»èªå·±ççªå£å®ä¹ççªå£å¤çå½æ°
DefWindowProcæ¯windowså¹³å°æä¾çé»è®¤çªå£å¤çå½æ°
å¦ææäºæ¶æ¯ä½ ä¸éè¦åç¹å«çå¤çï¼è°ç¨DefWindowProcè¿è¡å¤çå°±å¯ä»¥äºï¼ä¸éè¦ä½ èªå·±åå»äºé£äºwindowsç"æ åå¨ä½"
2.
æ ¹æ®1ï¼æ¾ç¶ï¼ä½ åªè½å®ä¹WindowProcèä¸è½å®ä¹DefWindowProc
ççMFCçCWndæºç å°±ä¸ç®äºç¶äº
LRESULT CWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// OnWndMsg does most of the work, except for DefWindowProc call
LRESULT lResult = 0;
if (!OnWndMsg(message, wParam, lParam, &lResult)) // å¦ææ¶æ¯æ¯éè¦èªå·±å¤ççï¼
//å¤çåå°±ä¸å¿ 让windowsç³»ç»è¿è¡é»è®¤å¤çäº
lResult = DefWindowProc(message, wParam, lParam); // èªå·±æ²¡æå¤çç就交ç»windowså»å
return lResult;
}