Я прохожу через руководство по программированию модуля ядра 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 в свой исходный код, чтобы я мог узнать, как именно ядро может взаимодействовать с пользовательским пространством, но у меня нет большого успеха.
Посмотрите [здесь] (http://lxr.free-electrons.com/ident?i=__put_user_1). Он также упоминается в нескольких файлах .c. У вас, вероятно, не установлены полные исходные файлы ядра ... только заголовки ядра. – RobotHumans
@hbdgaf - Привет, я там посмотрел. Другие ссылки просто говорят EXPORT_SYMBOL (__ put_user_1), что я уже догадался. Есть также два макроса, но я не верю, что они расширены в моем коде. В конце концов, код работает, когда я перехожу к символу __put_user_1. –
Мой плохой ... он находится в [put_user.S] (https://lkml.org/lkml/2004/1/23/108) - и файл ASM, который, похоже, не индексируется вещами, которые индексируют источники ядра много. Все еще просто макрос или статическое определение. Вероятно, возможно, он был помещен в файл C и использовал встроенную декларацию сборки вместо того, чтобы собирать ее, а затем связывать ее просто для ясности. – RobotHumans