2014-12-09 3 views
1

Я прохожу через руководство по программированию модуля ядра Linux, и я решил выяснить, как работает put_user (* (msg_Ptr), буфер). После того, как все макрорасширения выполнены, кажется, что эта встроенная сборка помещает __pu_val в буфер в пользовательском пространстве. Я поместил это в свою программу.Не удается найти, где определена __put_user_1

asm volatile("call __put_user_1" : "=a" (__ret_pu) : "0" (__pu_val), "c" (buffer) : "ebx"); 

Просматривая код ядра, возникает только одно упоминание об этой функции __put_user_1, в /usr/src/linux-headers-3.13.0-37/arch/x86/include/asm/uaccess .час. Это так же, как внешний прототип функции:

/* 
* Strange magic calling convention: pointer in %ecx, 
* value in %eax(:%edx), return value in %eax. clobbers %rbx 
*/ 
extern void __get_user_1(void); 

Я не могу видеть, где это определено в любом месте, но Module.symvers имеет символ __get_user_1 как в ядре:

0x167e7f9d __get_user_1 vmlinux EXPORT_SYMBOL 

Моя цель заключается чтобы иметь возможность поместить код put_user в свой исходный код, чтобы я мог узнать, как именно ядро ​​может взаимодействовать с пользовательским пространством, но у меня нет большого успеха.

+0

Посмотрите [здесь] (http://lxr.free-electrons.com/ident?i=__put_user_1). Он также упоминается в нескольких файлах .c. У вас, вероятно, не установлены полные исходные файлы ядра ... только заголовки ядра. – RobotHumans

+0

@hbdgaf - Привет, я там посмотрел. Другие ссылки просто говорят EXPORT_SYMBOL (__ put_user_1), что я уже догадался. Есть также два макроса, но я не верю, что они расширены в моем коде. В конце концов, код работает, когда я перехожу к символу __put_user_1. –

+0

Мой плохой ... он находится в [put_user.S] (https://lkml.org/lkml/2004/1/23/108) - и файл ASM, который, похоже, не индексируется вещами, которые индексируют источники ядра много. Все еще просто макрос или статическое определение. Вероятно, возможно, он был помещен в файл C и использовал встроенную декларацию сборки вместо того, чтобы собирать ее, а затем связывать ее просто для ясности. – RobotHumans

ответ

0

это ' s в put_user.S - и файл ASM, который doesn ' t, как представляется, индексируется вещами, которые сильно индексируют источники ядра. Все еще просто макрос или статическое определение. Вероятно, возможно, он был помещен в файл C и использовал встроенную декларацию сборки вместо того, чтобы собирать ее, а затем связывать ее просто для ясности. –   RobotHumans

Смежные вопросы