linux -- _setup宏介绍

本文介绍了Linux内核中启动参数的处理过程,包括__setup宏的定义与使用、early_param宏的作用,以及如何通过parse_args函数解析启动配置字符串。文章还讨论了启动参数在内核启动过程中的分类和处理时机。

 

 

 

 

 内核组件用__setup宏来注册关键字及相关联的处理函数,__setup宏在include/linux/init.h中定义,其原型如下:
__setup(string, function_handler)
其中:string是关键字,function_handler是关联处理函数。__setup只是告诉内核在启动时输入串中含有string时,内核要去执行function_handler。String必须以“=”符结束以使parse_args更方便解析。紧随“=”后的任何文本都会作为输入传给 function_handler。
下面的例子来自于net/core/dev.c,其中netdev_boot_setup作为处理程序被注册给“netdev=”关键字:
__setup("netdev=", netdev_boot_setup);
不 同的关键字可以注册相同的处理函数,例如在net/ethernet/eth.c中为“ether =”关键字注册了同样的处理函数 netdev_boot_setup。当代码作为模块被编译时,__setup宏被忽视,你可以在include/linux/init.h中看到 __setup宏是怎样变化的,不管后续包含它的文件是否是模块,include/linux/init.h都是独立的。
start_kernel两次调用parse_args解析启动配置字符串的原因是启动选项事实上分为两类,且每次调用值能够兼顾到其中一类:

缺省选项:
绝大多数选项归于此类,这些选项由__setup宏定义并在第二次调用parse_args时处理。
先期(处理)选项:
在 内核启动阶段,有些选项要在其它选项之前被处理,内核提供了early_param宏以代替__setup宏申明此类选项。这些选项由 parse_early_params函数解析。early_param宏和__setup宏仅有的不同就是前者设置了一个特殊标志让内核能够区分两种不同的状况。这个标志是我们将在“.init.setup内存区”小节中看到的obs_kernel_param结构的一部分。
启动时选项在内核 2.6中的处理方式已经改变,但并非所有的内核代码都因此而更新。在最近一次改变之前,还仅用__setup宏。因此,遗留下来将被更新的代码现在使用 __obsolete_setup宏。但用户用__obsolete_setup宏定义的选项给内核时,内核打印一条警告消息说明它已是废弃状态,并提供一个文件指针和随后被公告的源代码行信息。
图7-1概述了几个宏之间的关系:它们都包裹了普通的__setup_param函数。

 

 

 

注意:传给__setup宏的程序被放到.init.setup内存节,这样,在“启动时初始化代码”一节中可以很清晰的看出这样做的效果。

 

 

ldconfig -p | grep pcl libpcl_visualization.so.1.10 (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_visualization.so.1.10 libpcl_visualization.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_visualization.so libpcl_tracking.so.1.10 (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_tracking.so.1.10 libpcl_tracking.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_tracking.so libpcl_surface.so.1.10 (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_surface.so.1.10 libpcl_surface.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_surface.so libpcl_stereo.so.1.10 (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_stereo.so.1.10 libpcl_stereo.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_stereo.so libpcl_segmentation.so.1.10 (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_segmentation.so.1.10 libpcl_segmentation.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_segmentation.so libpcl_search.so.1.10 (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_search.so.1.10 libpcl_search.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_search.so libpcl_sample_consensus.so.1.10 (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_sample_consensus.so.1.10 libpcl_sample_consensus.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_sample_consensus.so libpcl_registration.so.1.10 (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_registration.so.1.10 libpcl_registration.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_registration.so libpcl_recognition.so.1.10 (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_recognition.so.1.10 libpcl_recognition.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_recognition.so libpcl_people.so.1.10 (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_people.so.1.10 libpcl_people.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_people.so libpcl_outofcore.so.1.10 (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_outofcore.so.1.10 libpcl_outofcore.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_outofcore.so libpcl_octree.so.1.10 (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_octree.so.1.10 libpcl_octree.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_octree.so libpcl_ml.so.1.10 (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_ml.so.1.10 libpcl_ml.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_ml.so libpcl_keypoints.so.1.10 (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_keypoints.so.1.10 libpcl_keypoints.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_keypoints.so libpcl_kdtree.so.1.10 (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_kdtree.so.1.10 libpcl_kdtree.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_kdtree.so libpcl_io_ply.so.1.10 (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_io_ply.so.1.10 libpcl_io_ply.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_io_ply.so libpcl_io.so.1.10 (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_io.so.1.10 libpcl_io.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_io.so libpcl_filters.so.1.10 (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_filters.so.1.10 libpcl_filters.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_filters.so libpcl_features.so.1.10 (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_features.so.1.10 libpcl_features.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_features.so libpcl_common.so.1.10 (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_common.so.1.10 libpcl_common.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_common.so libpcl_apps.so.1.10 (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_apps.so.1.10 libpcl_apps.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libpcl_apps.so libdapclient.so.6 (libc6,x86-64) => /lib/x86_64-linux-gnu/libdapclient.so.6 libdapclient.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libdapclient.so (base) kxl@kxl-MS-7D46:~$ ldconfig -p | grep boost libboost_wserialization.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_wserialization.so.1.71.0 libboost_wserialization.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_wserialization.so libboost_wave.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_wave.so.1.71.0 libboost_wave.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_wave.so libboost_unit_test_framework.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_unit_test_framework.so.1.71.0 libboost_unit_test_framework.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_unit_test_framework.so libboost_type_erasure.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_type_erasure.so.1.71.0 libboost_type_erasure.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_type_erasure.so libboost_timer.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_timer.so.1.71.0 libboost_timer.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_timer.so libboost_thread.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_thread.so.1.71.0 libboost_thread.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_thread.so libboost_system.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_system.so.1.71.0 libboost_system.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_system.so libboost_stacktrace_noop.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_stacktrace_noop.so.1.71.0 libboost_stacktrace_noop.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_stacktrace_noop.so libboost_stacktrace_basic.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_stacktrace_basic.so.1.71.0 libboost_stacktrace_basic.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_stacktrace_basic.so libboost_stacktrace_backtrace.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_stacktrace_backtrace.so.1.71.0 libboost_stacktrace_backtrace.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_stacktrace_backtrace.so libboost_stacktrace_addr2line.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_stacktrace_addr2line.so.1.71.0 libboost_stacktrace_addr2line.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_stacktrace_addr2line.so libboost_serialization.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_serialization.so.1.71.0 libboost_serialization.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_serialization.so libboost_regex.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_regex.so.1.71.0 libboost_regex.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_regex.so libboost_random.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_random.so.1.71.0 libboost_random.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_random.so libboost_python38.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_python38.so.1.71.0 libboost_python38.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_python38.so libboost_program_options.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_program_options.so.1.71.0 libboost_program_options.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_program_options.so libboost_prg_exec_monitor.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_prg_exec_monitor.so.1.71.0 libboost_prg_exec_monitor.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_prg_exec_monitor.so libboost_numpy38.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_numpy38.so.1.71.0 libboost_numpy38.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_numpy38.so libboost_mpi_python38.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_mpi_python38.so.1.71.0 libboost_mpi_python38.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_mpi_python38.so libboost_mpi.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_mpi.so.1.71.0 libboost_mpi.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_mpi.so libboost_math_tr1l.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_math_tr1l.so.1.71.0 libboost_math_tr1l.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_math_tr1l.so libboost_math_tr1f.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_math_tr1f.so.1.71.0 libboost_math_tr1f.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_math_tr1f.so libboost_math_tr1.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_math_tr1.so.1.71.0 libboost_math_tr1.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_math_tr1.so libboost_math_c99l.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_math_c99l.so.1.71.0 libboost_math_c99l.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_math_c99l.so libboost_math_c99f.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_math_c99f.so.1.71.0 libboost_math_c99f.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_math_c99f.so libboost_math_c99.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_math_c99.so.1.71.0 libboost_math_c99.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_math_c99.so libboost_log_setup.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_log_setup.so.1.71.0 libboost_log_setup.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_log_setup.so libboost_log.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_log.so.1.71.0 libboost_log.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_log.so libboost_locale.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_locale.so.1.71.0 libboost_locale.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_locale.so libboost_iostreams.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_iostreams.so.1.71.0 libboost_iostreams.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_iostreams.so libboost_graph_parallel.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_graph_parallel.so.1.71.0 libboost_graph_parallel.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_graph_parallel.so libboost_graph.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_graph.so.1.71.0 libboost_graph.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_graph.so libboost_filesystem.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_filesystem.so.1.71.0 libboost_filesystem.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_filesystem.so libboost_fiber.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_fiber.so.1.71.0 libboost_fiber.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_fiber.so libboost_date_time.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_date_time.so.1.71.0 libboost_date_time.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_date_time.so libboost_coroutine.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_coroutine.so.1.71.0 libboost_coroutine.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_coroutine.so libboost_context.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_context.so.1.71.0 libboost_context.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_context.so libboost_container.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_container.so.1.71.0 libboost_container.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_container.so libboost_chrono.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_chrono.so.1.71.0 libboost_chrono.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_chrono.so libboost_atomic.so.1.71.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_atomic.so.1.71.0 libboost_atomic.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libboost_atomic.so
07-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值