Estou lendo o código do kernel que carrega a configuração de inicialização. Em main.c o seguinte código é executado.
err = parse_args("bootconfig", tmp_cmdline, NULL, 0, 0, 0, NULL,
bootconfig_params);
na linha 428. Eu abro parse_args, que, internamente, chama parse_one (ambos em kernel/params.c) e parece que, como const struct kernel_param *params
é NULL, ele nunca irá iterar sobre nenhum parâmetro em parse_one
.
Sei que deve haver algo que estou esquecendo aqui. O resto da função depois das linhas 431 e 432 static void __init setup_boot_config(void)
nunca é executada, até onde posso ver. A configuração de inicialização deve ser analisada.
Em init/main.c
https://elixir.bootlin.com/linux/v6.13.1/source/init/main.c
static void __init setup_boot_config(void)
Em kernel/params.c
https://elixir.bootlin.com/linux/v6.13.1/source/kernel/params.c
parse_one(..)
parse_args(..)
setup_boot_config(void) >> parse_args(..) >> parse_one(..)
retornaENOENT
setup_boot_config(void)
verificações
if (IS_ERR(err) || !(bootconfig_found || IS_ENABLED(CONFIG_BOOT_CONFIG_FORCE)))
e retorna. O xbc_init(..)
nunca é chamado. Há algo faltando aqui.
Na entrada para
parse_args()
, os parâmetros da função são:doing = "bootconfig"
args = tmp_cmdline
params = NULL
num_params = 0
min_level = 0
max_level = 0
arg = NULL
unknown = &(bootconfig_params)()
Então, na entrada para
parse_one()
:param
=param
deparse_args()
val
=val
deparse_args()
doing = "bootconfig"
params = NULL
num_params = 0
min_level = 0
max_level = 0
arg = NULL
handle_unknown
=unknown
deparse_args()
=&(bootconfig_params()
Como
num_params
é 0, o primeirofor
loopparse_one()
é pulado e chegamos a esta parte:E aqui está o que você perdeu:
handle_unknown
é um ponteiro de função válido parabootconfig_params()
, então não é NULL. E então, o conteúdo deif(handle_unknown)
será executado, e porque ele contém um incondicionalreturn
, ele ditará o resultado deparse_one()
.Então, depois de resolver o ponteiro de função, o retorno
parse_one()
será o quebootconfig_params(param, val, doing, arg)
for retornado.E isso é simplesmente:
Então se
param
for a string exata"bootconfig"
, entãobootconfig_found
é definido comotrue
. Mas essa função sempre retorna 0... o que significa queparse_one()
também retornará 0... o que defineret
comoparse_args()
0 em vez deENOENT
, então oswitch(ret)
irá paracontinue
.E assim, o
while (*args) ...
loop principalparse_args()
começa a iterar para o próximo parâmetro detmp_cmdline
.