LINUX.ORG.RU

параметры загрузчика для ядра и драйвера ?


0

0

Здраствуйте. Не могу разобраться как передается параметр драйверу. Не подскажите как осуществляется передача параметров от загрузчика в ядро ? Есть ли в ядре куда это все кладется. Как драйвер получает такую информацию, если он часть ядра ? Что делать если драйвер как модуль, как получить эти параметры внитри модуля ? Можно ли передать параметры драйверу кроме известных irq,io? Если не сложно, подскажите пожалуйста, что смотреть.

anonymous

Про загрузчик не знаю, для модулей так:

Описываются параметры через MODULE_PARM_DESC, передаются либо через module_param либо module_param_named.

Для передачи параметров linux/moduleparam.h там еще куча других макросов есть

SatanClaus ★★★
()
Ответ на: комментарий от fortl

Модуль - модуль ядра, сетевой драйвер.
В драйвере нашел такую штуку:

__setup("name_permen=", smc_setup);

как я понял этот макрос создает структуру
struct kernel_param { 
  const char *str;           //<- "name_permen="
  int (*setup_func)(char *); //<- smc_setup
};
В которой в первом поле создается строковая переменная
со значением  "name_permen=" - значение идентично параметру, который передается загрузчиком, во втором 
поле, указатель на функцию smc_setup(), которая описанна в драйвере.

Я не могу понять 
 когда и откуда будет вызываться smc_setup() ?
 и не могу понять как и где брать значения переменной
 имя которой - "name_permen=" 
 

anonymous
()
Ответ на: комментарий от anonymous

> офигенно советую уделить внимание

Спасибо, внимание уделил, правда у меня почемуто
'checksetup(char *line)', много новой информации, 
правда появились вопросики, так как не удалось все понять.
Не подскажите, на каком ASM-е написаны коды в Linux? AT&T ?
Давно мучал вопрос: в ветке 2.4.x функции main() нет?
Из asm-кода вызывается C-функция, я правильно понял?

anonymous
()
Ответ на: комментарий от anonymous

1) часть кода написана на ассемблере соответствующей архитектуры с использованием синтаксиса AT&T 2)функции майн нет и в 2.6.х (по крайней мере в 2.6.11.7,которая у меня есть) основная ф-ия,ответственная за инициализацию - start_kernel() 3)ну,к примеру,говоря существует ряд секций,связанных с инициализацией.одна из них - .init.text , куда попадают адреса всех функций с __init.начало доступно (если не путаю - ибо бухой) как __initcall_start,конец - как __initcall_end.при старте ядро просто проходит от __initcall_start до __initcall_end и передает управление на каждый адрес,который там лежит "так жы сабачки,так жы и птички" (c) не мой

anonymous
()
Ответ на: комментарий от anonymous

Спасибо буду пробовать разбираться с синтаксисом AT&T,
спасибо, что корректируете мои корявые фразы.
Что-то понял по поводу "start_kernel()"
хотел уточнить, спасибо.
Я все-же не смог разобраться с адресом памяти куда пишет загрузчик. 
Загрузчик записывает информацию, параметры, в область памяти - подозреваю просто по определенному адресу, 
эти параметры при старте ядро да-же выводит на экран как printk("Kernel command line: %s\n", saved_command_line); Позже происходит разбор
parse_options(command_line);
  - checksetup(line) - куда передается один из параметров и в которой происходит вызов процедуры из драйвера
   
struct kernel_param *p;
p = &__setup_start;
do {
  if (!strncmp(line,p->str,n)) {
      if (p->setup_func(line+n))
         return 1;
  } // if()
  p++;
} while (p < &__setup_end);

Я пытался понять  __setup_start и __setup_end.
Как я понимаю - это список данных и скорее всего
это адреса, но я пока не нашел где это, буду искать. 
Может подскажите если не сложно ?

Есть еще один момент, который мне не удалось прояснить.
Это копирование параметров из ячейки памяти в данные ядра: saved_command_line[].
  setup_arch(&command_line);
    - parse_cmdline(cmdline_p, , , , );

parse_cmdline_early (char ** cmdline_p)  - для i386
parse_cmdline(cmdline_p, , , , )
{
  /* Save unparsed command line copy for /proc/cmdline */
memcpy(saved_command_line,COMMAND_LINE,COMMAND_LINE_SIZE);
saved_command_line[COMMAND_LINE_SIZE-1] = '\0';
....

} // parse_cmdline()

не могу найти COMMAND_LINE ??
вернее
 
#define PARAM   ((unsigned char *)empty_zero_page)
#define COMMAND_LINE ((char *) (PARAM+2048)) - i386
#define COMMAND_LINE ((char *) (PARAM+0x100))

а вот  empty_zero_page  -  и не могу найти. ? :((

Было бы неплохо в моем варианте залезть из драйвера в
эту ячеку памяти, но скорее всего ядро не предоставляет доступ и 
сисменые вызовы работающие с COMMAND_LINE тоже недоступны.
Поэтому еще и вопрос как правильно поступить
 - добавить в драйвер параметр в котором задаются нужные данные или все-же 
 - попытаться как-то достучаться до нужного адреса ?

Нашел, что ядро EXPORT_SYMBOL(empty_zero_page); 
Тогда из моего модуля видна "empty_zero_page",
я правильно понимаю ?

Но не могу понять/найти определение  "empty_zero_page"
для процкессора ./arch/sh/kernel/head.S
        .section        .empty_zero_page, "aw"
ENTRY(empty_zero_page)


а для i386 только строчка:
./arch/i386/kernel/head.S:89:
/*
 * Initialize page tables
 */
        movl $pg0-__PAGE_OFFSET,%edi /* initialize page tables */
        movl $007,%eax          /* "007" doesn't mean with right to kill, but
                                   PRESENT+RW+USER */
2:      stosl
        add $0x1000,%eax
        cmp $empty_zero_page-__PAGE_OFFSET,%edi //<--


empty_zero_page - страница в памяти,
 по определенным  адресам  ??


Можите еще прокоментировать сторчку в
./arch/sh/boot/compressed/Makefile
" ..
$(OBJCOPY) -R .empty_zero_page $(SYSTEM) $$tmppiggy;
..
"
Зачем здесь этот набор символов ?
Это я совсем не понимаю, хоть что смотреть, чтоб небольшое представление получить.

Извините наверное писать сюда весь этот кошмар
нельзя но что-то меня заклинило.

Если сможите подскажите куда и что посмотреть.

Еще совсем глупый вопрос про доку по синтаксису
AT&T - русские статейки я читал, может не все конечно,
а нет какойнибудь доки - учебника, может есть на русском?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.