· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.UNIX —› Кто тут крутой? Неплохой тест для вас!

. 1 . 2 . 3 . >>

Посл.отвђт Сообщен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

Немножко рано. Погоди хотя бы до завтрашнего вечера (или, по вашему времени, сегодняшнего вечера, хе). Или шли мне приватом. Мыло выше...

. 1 . 2 . 3 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.055