|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Апр 15, 2004 21:49:50 В последнее время сами штатовцы затрахались от своей манеры писать резюме. Там в каждом резюме написано, что человек МИНИМУМ второй Эйнштейн, и вообще, это он написал С и С++, да еще перед этим и ассемблер выдумал в качестве разминки. Для таких чувырл фирмы теперь вводят тесты. Т.е. резюме мало. Надо пару собеседований пройти и еще тесты. Один из таких любопытных тестов для системщиков под Linux я для вас и предлагаю. Честно скажу, что сам я его прошел, но во время я не уложился. У меня ушло что-то около 50 минут. В качестве частичного оправдания могу сказать, что я никогда не изучал AT&T синтаксис :( Тем, кто разгадает, просьба не говорить другим, чтобы не лишать их удовольствия. Ниже идет фрагмент core dump, который содержит состояние регистров и стека на момент сбоя OC и ассемблерный листинг. Так же приложен С-листинг. Теперь, собственно, задание:
Oops: 0000
Kernel 2.4.9-e.34enterprise
CPU: 4
EIP: 0010:[<c015b794>] Tainted: P
EFLAGS: 00010213
EIP is at d_lookup [kernel] 0x74
eax: f8b5294c ebx: 30f7c921 ecx: 00000013 edx: 019fc4bb
esi: e82d75c0 edi: 0007ffff ebp: 30f7c931 esp: e2b99df4
ds: 0018 es: 0018 ss: 0018
Process monitor (pid: 12520, stackpage=e2b99000)
Stack: f7c98ba8 fe10f016 019fc4bb 00000004 fe10f016 e82d75c0 e2b99e60 fe10f01b
c0151c50 e82d75c0 e2b99e60 fe10f016 c015216d e82d75c0 e2b99e60 00000004
00000001 00000000 00000000 f8cf55dc f8b2643e e2b98000 ec9e81e0 f8cfc8f4
Call Trace: [<c0151c50>] cached_lookup [kernel] 0x10 (0xe2b99e14)
[<c015216d>] path_walk [kernel] 0x28d (0xe2b99e24)
[<f8b2643e>] afs_linux_dentry_revalidate [openafs] 0x1ce (0xe2b99e44)
[<c0155692>] page_getlink [kernel] 0x22 (0xe2b99e58)
[<c01558f6>] page_follow_link [kernel] 0x146 (0xe2b99e80)
[<c01522f0>] path_walk [kernel] 0x410 (0xe2b99ec4)
[<c012f259>] do_mmap_pgoff [kernel] 0x409 (0xe2b99f0c)
[<c0152f1c>] open_namei [kernel] 0x8c (0xe2b99f20)
[<c010c97e>] old_mmap [kernel] 0xee (0xe2b99f44)
[<c0146256>] filp_open [kernel] 0x36 (0xe2b99f68)
[<c015198e>] getname [kernel] 0x5e (0xe2b99f88)
[<c0146556>] sys_open [kernel] 0x36 (0xe2b99fa0)
[<c01073e3>] system_call [kernel] 0x33 (0xe2b99fc0)
Code: 8b 6d 00 39 53 44 0f 85 82 00 00 00 8b 44 24 24 39 43 0c 75
<0>Kernel panic: not continuing
-----------------------------
c015b720 <d_lookup>:
c015b720: 55 push %ebp
c015b721: 57 push %edi
c015b722: 56 push %esi
c015b723: 53 push %ebx
c015b724: 83 ec 10 sub $0x10,%esp
c015b727: 8b 44 24 28 mov 0x28(%esp,1),%eax
c015b72b: 8b 54 24 24 mov 0x24(%esp,1),%edx
c015b72f: 8b 0d 10 43 3d c0 mov 0xc03d4310,%ecx
c015b735: 8b 40 04 mov 0x4(%eax),%eax
c015b738: c1 ea 05 shr $0x5,%edx
c015b73b: 8b 3d 0c 43 3d c0 mov 0xc03d430c,%edi
c015b741: 89 44 24 0c mov %eax,0xc(%esp,1)
c015b745: 8b 44 24 28 mov 0x28(%esp,1),%eax
c015b749: 8b 40 08 mov 0x8(%eax),%eax
c015b74c: 89 44 24 08 mov %eax,0x8(%esp,1)
c015b750: 8b 44 24 28 mov 0x28(%esp,1),%eax
c015b754: 8b 6c 24 08 mov 0x8(%esp,1),%ebp
c015b758: 8b 00 mov (%eax),%eax
c015b75a: 01 ea add %ebp,%edx
c015b75c: 89 44 24 04 mov %eax,0x4(%esp,1)
c015b760: 89 d0 mov %edx,%eax
c015b762: d3 e8 shr %cl,%eax
c015b764: 31 c2 xor %eax,%edx
c015b766: a1 14 43 3d c0 mov 0xc03d4314,%eax
c015b76b: 21 fa and %edi,%edx
c015b76d: 8d 14 d0 lea (%eax,%edx,8),%edx
c015b770: 89 14 24 mov %edx,(%esp,1)
c015b773: f0 fe 0d 98 b3 2f c0 lock decb 0xc02fb398
c015b77a: 0f 88 36 0b 0e 00 js c023c2b6 <VSYSCALL_text_end+0x32b6>
c015b780: 8b 2a mov (%edx),%ebp
c015b782: 39 d5 cmp %edx,%ebp
c015b784: 8d 5d f0 lea 0xfffffff0(%ebp),%ebx
c015b787: 0f 84 a1 00 00 00 je c015b82e <d_lookup+0x10e>
c015b78d: 8d 76 00 lea 0x0(%esi),%esi
c015b790: 8b 54 24 08 mov 0x8(%esp,1),%edx
c015b794: 8b 6d 00 mov 0x0(%ebp),%ebp
c015b797: 39 53 44 cmp %edx,0x44(%ebx)
c015b79a: 0f 85 82 00 00 00 jne c015b822 <d_lookup+0x102>
c015b7a0: 8b 44 24 24 mov 0x24(%esp,1),%eax
c015b7a4: 39 43 0c cmp %eax,0xc(%ebx)
c015b7a7: 75 79 jne c015b822 <d_lookup+0x102>
c015b7a9: 8b 40 4c mov 0x4c(%eax),%eax
c015b7ac: 85 c0 test %eax,%eax
c015b7ae: 74 20 je c015b7d0 <d_lookup+0xb0>
c015b7b0: 8b 50 08 mov 0x8(%eax),%edx
c015b7b3: 85 d2 test %edx,%edx
c015b7b5: 74 19 je c015b7d0 <d_lookup+0xb0>
c015b7b7: 8b 74 24 28 mov 0x28(%esp,1),%esi
c015b7bb: 8d 43 3c lea 0x3c(%ebx),%eax
c015b7be: 56 push %esi
c015b7bf: 50 push %eax
c015b7c0: 8b 4c 24 2c mov 0x2c(%esp,1),%ecx
c015b7c4: 51 push %ecx
c015b7c5: ff d2 call *%edx
c015b7c7: 83 c4 0c add $0xc,%esp
c015b7ca: 85 c0 test %eax,%eax
c015b7cc: 74 23 je c015b7f1 <d_lookup+0xd1>
c015b7ce: eb 52 jmp c015b822 <d_lookup+0x102>
c015b7d0: 8b 54 24 0c mov 0xc(%esp,1),%edx
c015b7d4: 39 53 40 cmp %edx,0x40(%ebx)
c015b7d7: 75 49 jne c015b822 <d_lookup+0x102>
c015b7d9: fc cld
c015b7da: 8b 73 3c mov 0x3c(%ebx),%esi
c015b7dd: 89 d1 mov %edx,%ecx
c015b7df: 8b 7c 24 04 mov 0x4(%esp,1),%edi
c015b7e3: 39 d2 cmp %edx,%edx
c015b7e5: f3 a6 repz cmpsb %es:(%edi),%ds:(%esi)
c015b7e7: 0f 97 c2 seta %dl
c015b7ea: 0f 92 c0 setb %al
c015b7ed: 38 c2 cmp %al,%dl
c015b7ef: 75 31 jne c015b822 <d_lookup+0x102>
c015b7f1: f0 ff 03 lock incl (%ebx)
c015b7f4: 8b 03 mov (%ebx),%eax
c015b7f6: 48 dec %eax
c015b7f7: 75 1a jne c015b813 <d_lookup+0xf3>
c015b7f9: ff 0d a8 b3 2f c0 decl 0xc02fb3a8
c015b7ff: 8d 43 18 lea 0x18(%ebx),%eax
c015b802: 8b 48 04 mov 0x4(%eax),%ecx
c015b805: 8b 53 18 mov 0x18(%ebx),%edx
c015b808: 89 4a 04 mov %ecx,0x4(%edx)
c015b80b: 89 11 mov %edx,(%ecx)
c015b80d: 89 43 18 mov %eax,0x18(%ebx)
c015b810: 89 40 04 mov %eax,0x4(%eax)
c015b813: 83 4b 54 08 orl $0x8,0x54(%ebx)
c015b817: c6 05 98 b3 2f c0 01 movb $0x1,0xc02fb398
c015b81e: 89 d8 mov %ebx,%eax
c015b820: eb 15 jmp c015b837 <d_lookup+0x117>
c015b822: 3b 2c 24 cmp (%esp,1),%ebp
c015b825: 8d 5d f0 lea 0xfffffff0(%ebp),%ebx
c015b828: 0f 85 62 ff ff ff jne c015b790 <d_lookup+0x70>
c015b82e: c6 05 98 b3 2f c0 01 movb $0x1,0xc02fb398
c015b835: 31 c0 xor %eax,%eax
c015b837: 83 c4 10 add $0x10,%esp
c015b83a: 5b pop %ebx
c015b83b: 5e pop %esi
c015b83c: 5f pop %edi
c015b83d: 5d pop %ebp
c015b83e: c3 ret
c015b83f: 90 nop
-----------------------------
struct dentry * d_lookup(struct dentry * parent, struct qstr * name)
{
unsigned int len = name->len;
unsigned int hash = name->hash;
const unsigned char *str = name->name;
struct list_head *head = d_hash(parent,hash);
struct list_head *tmp;
spin_lock(&dcache_lock);
tmp = head->next;
for (;;) {
struct dentry * dentry = list_entry(tmp, struct dentry, d_hash);
if (tmp == head)
break;
tmp = tmp->next;
if (dentry->d_name.hash != hash)
continue;
if (dentry->d_parent != parent)
continue;
if (parent->d_op && parent->d_op->d_compare) {
if (parent->d_op->d_compare(parent, &dentry->d_name, name))
continue;
} else {
if (dentry->d_name.len != len)
continue;
if (memcmp(dentry->d_name.name, str, len))
continue;
}
__dget_locked(dentry);
dentry->d_vfs_flags |= DCACHE_REFERENCED;
spin_unlock(&dcache_lock);
return dentry;
}
spin_unlock(&dcache_lock);
return NULL;
}
------------------------
Теперь вопросы (перевожу на русский) 1. "what is the direct cause of oops" - что послужило причиной упса :) Опса :) Короче, из-за чего сбой? 2. "which c variable of d_lookup does ebp contain when oops happens?" - какая переменная лежит в ebp на момент сбоя? Если не укладываетесь в 30 минут, то, хотя бы, соотнесите все, что успели наковырять с сишным кодом. Удачи! |
|
|
Дата: Апр 15, 2004 22:43:43 Да, AT&T это убожество. Пишут mov %eax, %ebx, а это оказывается не в eax записать ebx, а в ebx записать eax.. Насчёт первого вопроса, то это инструкция mov ebp, [ebp] по адресу, который в eip, память недоступна на чтение. Это я сразу заметил, а вот переменная судя по этому там никакая не лежит, раз сбой произошёл :) |
|
|
Дата: Апр 15, 2004 23:01:03 то это инструкция mov ebp, [ebp] по адресу, который в eip, память недоступна на чтение Это не ответ вообще. И так видно сходу. Ты мне его со строчками С кода соотнеси - вот это уже задание покруче :) Только ответ тут не пиши. а вот переменная судя по этому там никакая не лежит ну-ну... |
|
|
Дата: Апр 15, 2004 23:22:13 · Поправил: Безпощадный даос Я в аттаче кинул, после 15-20 минут, больше я ничего не успею. Пусть кто хочет сам думать - не смотрит(хотя там смотреть то особо и нечего). |
|
|
Дата: Апр 15, 2004 23:25:23 да, а вложения не работают.. Куда можно тогда то же самое кинуть? |
|
|
Дата: Апр 15, 2004 23:27:33 Любопытно. Брось мне на мыло - погляжу. |
|
|
Дата: Апр 15, 2004 23:40:36 Ответ я тебе написал. Довольно подробно. Хотя, кстати, и я могу быть не прав :) |
|
|
Дата: Апр 16, 2004 00:19:53 Во-первых, сотри, пожалуйста, свой пост - другим дай тыкву сломать. Во-вторых, я бы сказал, что почти прав. Твое мнение, и мнение dragon почти один в один, но кое-что меня в нем смущает... |
|
|
Дата: Апр 16, 2004 00:40:09 Прошу прощения за предыдущий пост. Не успел сам удалить, момедная связь.... Хотелось бы узнать, что именно смущает =) |
|
|
Дата: Апр 16, 2004 00:45:37 Ты немножко ошибся с началом for(;;) - его достаточно легко совершенно однозначно найти, если присмотреться. С причиной ошибки, скорее всего, ты совершенно прав, как и dragon. Сам я грешил изначально именно на это, потом подумал (горе от ума) и решил сместиться на строчку ниже. Dragon убедил меня, что я не прав - очень логичные объяснения. |
|
|
Дата: Апр 16, 2004 00:50:52 Куда кинуть мой (конечно же, неправильный) ответ, чтоб до времени соблюсти конспирацию? :+) |
|
|
Дата: Апр 16, 2004 00:58:25 Anonimka Йес, сэр. Теперь, плиз, начало for(;;) :) |
|
|
Дата: Апр 16, 2004 01:12:30 Получи, фашист, гранату (с смысле, выслано) ;-) |
|
|
Дата: Апр 16, 2004 01:35:09 вроде 'решил'. Что у других получилось? |
|
|
Дата: Апр 16, 2004 02:37:02 Anonimka А вот тут мы с тобой один в один. В точности. Я полностью согласен. Единственное над чем у меня до сих пор бошка болит, так это имел ли право компилятор так поступать... А вообще - ты молодец. Если бы я ту компанию учреждал - dragon и ты уже были бы там :) trophim Немножко рано. Погоди хотя бы до завтрашнего вечера (или, по вашему времени, сегодняшнего вечера, хе). Или шли мне приватом. Мыло выше... |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.055 |