亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1754 | 回復(fù): 8
打印 上一主題 下一主題

[內(nèi)核模塊] 發(fā)現(xiàn)一個奇怪的現(xiàn)象,請教大家 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2014-01-21 13:51 |只看該作者 |倒序瀏覽
本帖最后由 txawplh 于 2014-01-21 13:52 編輯

         發(fā)現(xiàn)問題不大好描述,直接上代碼吧
  1. #include <linux/init.h>
  2. #include <linux/module.h>
  3. #include <linux/kernel.h>
  4. #include <linux/list.h>
  5. #include <linux/cpumask.h>

  6. void func(char *str)
  7. {
  8.   printk("func: %s", str);
  9. }
  10. int caller(void)
  11. {
  12.   int i = 0;
  13.   func("AAAA\n");
  14.   return 0;
  15. }
  16. static int __init mod_init(void)
  17. {
  18.   unsigned char* p = caller; //獲取函數(shù)caller的地址
  19.   int i = 0;
  20.   printk("caller addr: 0x%x\n", p);
  21.   for(;i<80;i++)
  22.   {
  23.     printk("%02x", p[i]); //打印出caller的opcode
  24.   }
  25.   return 0;
  26. }

  27. static void __exit mod_exit(void)
  28. {
  29.   printk(KERN_ALERT"[rmmod mymod] name:%s state:%d\n", THIS_MODULE->name, THIS_MODULE->state);
  30. }

  31. module_init(mod_init);
  32. module_exit(mod_exit);
復(fù)制代碼
內(nèi)核模塊編譯完成之后,用objdump看一下,發(fā)現(xiàn)函數(shù)caller有兩個call指令:

  1. 0000000000000020 <caller>:
  2.   20:        55                                          push   %rbp
  3.   21:        48 89 e5                            mov    %rsp,%rbp
  4.   24:        e8 00 00 00 00                     callq  29 <caller+0x9>
  5.   29:        48 c7 c7 00 00 00 00               mov    $0x0,%rdi
  6.   30:        e8 00 00 00 00                      callq  35 <caller+0x15>
  7.   35:        31 c0                                       xor    %eax,%eax
  8.   37:        5d                                           pop    %rbp
  9.   38:        c3                                           retq   
復(fù)制代碼
來看一下模塊加載后的情況:
  1. [12663.567517] caller addr: 0xa0567020
  2. [12663.567526] 554889e5666666669048c7c72d8056a0e8cbffffff31c05dc3000000558b15bd1f000048c7c6189056a048c7c7508056a031c04889e5e83d230ee15dc300000000000000000000000000000000000000
復(fù)制代碼
利用hexedit和ndisasm反匯編一下:

  1. Aspire-4752:~$ ndisasm -b 64 a.bin
  2. 00000000  55                               push rbp
  3. 00000001  4889E5                       mov rbp,rsp
  4. 00000004  [color=Red]6666666690               xchg ax,ax[/color] //這里原來是第一個call指令
  5. 00000009  48C7C72D8056A0    mov rdi,0xa056802d
  6. 00000010  E8CBFFFFFF           call dword 0xffffffffffffffe0   //這里調(diào)用func函數(shù)
  7. 00000015  31C0                          xor eax,eax
  8. 00000017  5D                             pop rbp
  9. 00000018  C3                              ret
  10. 00000019  0000                           add [rax],al
復(fù)制代碼
請問有沒有人知道為什么編譯后會有兩個call指令,而在模塊加載后第一個被修改為(xchg ax,ax),謝謝

論壇徽章:
0
2 [報告]
發(fā)表于 2014-01-21 14:50 |只看該作者
粗看了一下。ko文件是重定位文件,insmod到內(nèi)核之后,符號會被重定位。

論壇徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16賽季CBA聯(lián)賽之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金雞報曉
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年紀(jì)念徽章
日期:2016-11-09 13:19:1015-16賽季CBA聯(lián)賽之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序設(shè)計版塊每日發(fā)帖之星
日期:2015-12-03 06:20:002015七夕節(jié)徽章
日期:2015-08-21 11:06:17IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-08-09 06:20:002015亞冠之吉達(dá)阿赫利
日期:2015-07-03 08:39:42
3 [報告]
發(fā)表于 2014-01-21 15:04 |只看該作者
insmod會鏈接到正確的地址,但是為什么有兩個call,我想不明白了

論壇徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辭舊歲徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亞洲杯之卡塔爾
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08處女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技術(shù)圖書徽章
日期:2014-03-25 09:00:29
4 [報告]
發(fā)表于 2014-01-21 15:08 |只看該作者
像是符號重定位的時候修改的。

論壇徽章:
0
5 [報告]
發(fā)表于 2014-01-21 15:29 |只看該作者
是的,重定位這個倒是不難理解,但是為啥會在ko中產(chǎn)生一個額外的call了,然后加載后被修改為xchg ax,ax

論壇徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辭舊歲徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亞洲杯之卡塔爾
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08處女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技術(shù)圖書徽章
日期:2014-03-25 09:00:29
6 [報告]
發(fā)表于 2014-01-21 16:02 |只看該作者
那段opcode看似占位的,不一定代表call,具體沒研究過,猜的哈~

論壇徽章:
0
7 [報告]
發(fā)表于 2014-01-21 17:58 |只看該作者
這個應(yīng)該和ftrace有關(guān)。ftrace CONFIG OPTION打開的話,kenrel的編譯會加上-pg switch,在每個函數(shù)的人口會call mcount.

但是如果ftrace沒有enable的話(/sys/,每次進(jìn)入一個函數(shù)都會調(diào)用一下mcount在出來,會有performace損失。所以kernel hacker做了一下hack,如果ftrace沒有enable的話,就會在module load的時候把call mcount的指令換成一個no-op (x86_64上定義的noop, 就是0x66 0x66 0x66 0x66 0x90 K8_NOP5_ATOMIC).

論壇徽章:
0
8 [報告]
發(fā)表于 2014-01-21 23:11 |只看該作者
感謝兄臺的回答,太牛逼了回復(fù) 7# eexplorer


   

論壇徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辭舊歲徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亞洲杯之卡塔爾
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08處女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技術(shù)圖書徽章
日期:2014-03-25 09:00:29
9 [報告]
發(fā)表于 2014-01-22 08:48 |只看該作者
回復(fù) 7# eexplorer
這個很有道理~~


   
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP