日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

系统初始化时kernel_init在内核态创建和运行应用程序以完成系统初始化

發布時間:2025/4/5 windows 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 系统初始化时kernel_init在内核态创建和运行应用程序以完成系统初始化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?系統初始化時kernel_init在內核態創建和運行應用程序以完成系統初始化.? 內核剛剛啟動時,只有內核態的代碼,后來在init過程中,在內核態運行了一些初始化系統的程序,才產生了工作在用戶空間的進程。


/* This is a non __init function. Force it to be noinline otherwise gcc736 * makes it inline to init() and it becomes part of init.text section737 */738static noinline int init_post(void)739{740 /* need to finish all async __init code before freeing the memory */741 async_synchronize_full();742 free_initmem();743 mark_rodata_ro();744 system_state = SYSTEM_RUNNING;745 numa_default_policy();746747748 current->signal->flags |= SIGNAL_UNKILLABLE;749750 if (ramdisk_execute_command) {751 run_init_process(ramdisk_execute_command);752 printk(KERN_WARNING "Failed to execute %s\n",753 ramdisk_execute_command);754 }755756 /*757 * We try each of these until one succeeds.758 *759 * The Bourne shell can be used instead of init if we are760 * trying to recover a really broken machine.



從內核里發起系統調用,執行用戶空間的應用程序。這些程序自動以root權限運行。

761 */762 if (execute_command) {763 run_init_process(execute_command);764 printk(KERN_WARNING "Failed to execute %s. Attempting "765 "defaults...\n", execute_command);766 }767 run_init_process("/sbin/init");768 run_init_process("/etc/init");769 run_init_process("/bin/init");770 run_init_process("/bin/sh");771772 panic("No init found. Try passing init= option to kernel. "773 "See Linux Documentation/init.txt for guidance.");774}



? ? ? ? 這里,內核以此運行用戶空間程序,從而產生了第一個以及后續的用戶空間程序。一般用戶空間的init程序,會啟動一個shell,供用戶登錄系統用。這樣,這里啟動的用戶空間的程序永遠不會返回。也就是說,正常情況下不會到panic這一步。系統執行到這里后,Linux Kernel的初始化就完成了。

此時,中斷和中斷驅動的進程調度機制,調度著各個線程在各個CPU上的運行。中斷處理程序不時被觸發。操作系統上,一些內核線程在內核態運行,它們永遠不會進入用戶態。它們也根本沒有用戶態的內存空間。它的線性地址空間就是共享內核的線性地址空間。一些用戶進程通常在用戶態運行。有時因為系統調用而進入內核態,調用內核提供的系統調用處理函數。

? ? ? ?但有時,我們的內核模塊或者內核線程希望能夠調用用戶空間的進程,就像系統啟動之初init_post函數做的那樣。

? ? ? ?如,一個驅動從內核得到了主從設備號,然后需要使用mknod命令創建相應的設備文件,以供用戶調用該設備。

? ? ? ?如,一個內核線程想神不知鬼不覺地偷偷運行個有特權的后門程序。等等之類的需求。

call_usermodehelper函數

? ? ? ? ??Linux ?Kernel提供了call_usermodehelper函數,讓我們能夠異常方便地在內核中直接新建和運行用戶空間程序,并且該程序具有root權限。

call_usermodehelper函數源碼

include/linux/kmod.h頭文件

105static inline int106call_usermodehelper(char *path, char **argv, char **envp, enum umh_wait wait)107{108 return call_usermodehelper_fns(path, argv, envp, wait,109 NULL, NULL, NULL);110}11150enum umh_wait {51 UMH_NO_WAIT = -1, /* don't wait at all */52 UMH_WAIT_EXEC = 0, /* wait for the exec, but not the process */53 UMH_WAIT_PROC = 1, /* wait for the process to complete */54};5556struct subprocess_info {57 struct work_struct work;58 struct completion *complete;59 char *path;60 char **argv;61 char **envp;62 enum umh_wait wait;63 int retval;64 int (*init)(struct subprocess_info *info);65 void (*cleanup)(struct subprocess_info *info);66 void *data;67};68 kernel/kmod.c實現文件 377/**378 * call_usermodehelper_exec - start a usermode application379 * @sub_info: information about the subprocessa 子進程的信息380 * @wait: wait for the application to finish and return status.等待用戶空間子進程的完成,并返回結果。381 * when -1 don't wait at all, but you get no useful error back when382 * the program couldn't be exec'ed. This makes it safe to call383 * from interrupt context.


-1表示根本不等待子進程的結束。 但這樣你就無法對程序出錯進行處理。
如果使用中斷上下文,那么應該使用-1。

384 *385 * Runs a user-space application. The application is started386 * asynchronously if wait is not set, and runs as a child of keventd.387 * (ie. it runs with full root capabilities).


call_usermodehelper_exec函數,啟動一個用戶模式應用程序。
如果不設置wait,那么用戶空間應用程序會被異步啟動。 ?它在root權限下運行。是keventd進程的子進程。

388 */389int call_usermodehelper_exec(struct subprocess_info *sub_info,390 enum umh_wait wait)391{392 DECLARE_COMPLETION_ONSTACK(done);393 int retval = 0;394395 helper_lock();396 if (sub_info->path[0] == '\0')397 goto out;398399 if (!khelper_wq || usermodehelper_disabled) {400 retval = -EBUSY;401 goto out;402 }403404 sub_info->complete = &done;405 sub_info->wait = wait;406把用戶空間進程掛到一個內核工作隊列。407 queue_work(khelper_wq, &sub_info->work);408 if (wait == UMH_NO_WAIT) /* task has freed sub_info */409 goto unlock;


如果等待子進程完成,那么執行等待完成的 ?事件通知和喚醒。就是說當前進程sleep。
?

410 wait_for_completion(&done);411 retval = sub_info->retval;412413out:414 call_usermodehelper_freeinfo(sub_info);415unlock:416 helper_unlock();417 return retval;418}419EXPORT_SYMBOL(call_usermodehelper_exec);420421void __init usermodehelper_init(void)422{423 khelper_wq = create_singlethread_workqueue("khelper");424 BUG_ON(!khelper_wq);425}

?

? ? ?call_usermodeheler函數創建的新程序,實際上作為keventd內核線程的子進程運行,因此具有root權限。? 新程序被扔到內核工作隊列“khelper”中進行執行。

? ? ? 如果使用UMH_NO_WAIT,那么因為沒有在事件隊列上等待和喚醒的過程,因此可以在中斷上下文中使用。?它的返回值是新程序的返回值。

?

call_usermodeheler函數的參數用法和execve函數一致?

#include<unistd.h>

intexecve(const char *filename, char *const?argv[],
char*const
?envp[]);

execve函數使用sys_execve系統調用,創建并運行一個程序。

argv是字符串數組,是將被傳輸到新程序的參數。

envp是字符串數組,格式是key=value,是傳遞給新程序的環境變量。

argv和envp都必須以NULL字符串結束。以此來實現對字符串數組的大小統計。?

? ? ?這就意味著,argv的第一個參數也必須是程序名。也就是說,新程序名要在execve函數的參數中傳遞兩次。

?

? ? ?這和main函數傳入的參數格式也是一致的。


#include <linux/init.h> #include <linux/module.h> #include <linux/moduleparam.h> //#include<linux/config.h> #include <linux/kernel.h>/*printk()*/ #include <linux/sched.h>MODULE_LICENSE("GPL");static __init int test_driver_init(void) {int result = 0;char cmd_path[] = "/usr/bin/touch";char* cmd_argv[] = {cmd_path,"/touchX.txt",NULL};char* cmd_envp[] = {"HOME=/", "PATH=/sbin:/bin:/usr/bin", NULL};result = call_usermodehelper(cmd_path, cmd_argv, cmd_envp, UMH_WAIT_PROC);printk(KERN_DEBUG "test driver init exec! there result of call_usermodehelper is %d\n", result);printk(KERN_DEBUG "test driver init exec! the process is \"%s\", pid is %d.\n",current->comm, current->pid);return result; }static __exit void test_driver_exit(void) {int result = 0;char cmd_path[] = "/bin/rm";char* cmd_argv[] = {cmd_path,"/touchX.txt",NULL};char* cmd_envp[] = {"HOME=/", "PATH=/sbin:/bin:/usr/bin", NULL};result = call_usermodehelper(cmd_path, cmd_argv, cmd_envp, UMH_WAIT_PROC);printk(KERN_DEBUG "test driver exit exec! the result of call_usermodehelper is %d\n", result);printk(KERN_DEBUG "test driver exit exec! the process is \"%s\",pidis %d \n", current->comm, current->pid); }module_init(test_driver_init); module_exit(test_driver_exit);

編譯上述模塊的命令:

make-C /lib/modules/`uname -r`/build M=`pwd` modules


然后使用insmod和rmmod命令加載和卸載驅動。可以看到上述命令創建了文件和刪除了創建的文件。

總結

以上是生活随笔為你收集整理的系统初始化时kernel_init在内核态创建和运行应用程序以完成系统初始化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 六月丁香婷婷网 | 成人拍拍 | 亚洲色图导航 | 精品国产视频在线 | 色哟哟一区二区三区 | 国产精品久久久久久无人区 | 纯爱无遮挡h肉动漫在线播放 | 成人免费黄色小视频 | 嫩草懂你 | av免费播放网站 | 精品99在线观看 | 国产又粗又猛又爽又黄91精品 | 97一级片 | 男女裸体无遮挡做爰 | 小视频成人 | 超碰资源在线 | 超碰在线影院 | 日婷婷 | 成人欧美精品一区二区 | 国产成人精品一区二区三区 | 中国av一区 | 欧美一级黄| 欧美黑人性生活 | 亚洲www.| 91插插视频 | 欧美人禽杂交狂配 | 三级黄在线观看 | 久草资源网 | 精品中文字幕在线观看 | 成人福利在线视频 | 少妇性高潮视频 | 亚洲精品高清视频 | 天堂bt在线| 97国产精品久久 | 欧美日韩一区在线观看 | 日韩视频一区二区三区四区 | 欧美人与动牲交a欧美精品 欧美三级在线看 | av成人在线看 | av网站在线播放 | 免费观看的黄色网址 | 中文字幕在线观看二区 | aaa在线播放| 久热亚洲 | 自拍偷拍一区 | 深夜福利在线播放 | 国产毛片在线视频 | 欧美黑人啪啪 | 黄片毛片在线观看 | 在线观看黄色的网站 | 狠色综合| 九九视频在线播放 | 美女被娇喘流出白 | 国产精品无码电影在线观看 | 视频区小说区图片区 | 国产成人无码一二三区视频 | 精品国产乱码久久久久久1区二区 | 黄视频免费在线看 | 能免费看18视频网站 | 亚洲图片在线播放 | 欧美成人r级一区二区三区 中文无码一区二区三区在线观看 | 久久亚洲精品小早川怜子 | 丰满少妇麻豆av苏语棠 | 最新日韩在线 | 亚洲女人毛茸茸 | av55 | 免费高清av在线看 | 伊人伊网| 夜夜爽日日澡人人添 | 曰本黄色片 | 久久精品女人毛片国产 | 你懂的在线观看网站 | 天天干天天草天天射 | 成人免费av网站 | 深夜视频在线观看免费 | 91九色国产在线 | 久久99精品国产91久久来源 | 亚洲情se | 欧洲色网站 | 中文字幕一区二区人妻痴汉电车 | 九九色网 | 黄片一区二区 | 麻豆回家视频区一区二 | 国产人妻精品一区二区三区不卡 | 97在线免费观看 | 九九九热 | av福利在线观看 | 华人永久免费 | 亚洲国产精品99久久久久久久久 | 欧美人与性动交a欧美精品 日韩免费高清视频 | 免费黄色在线播放 | 亚洲熟妇国产熟妇肥婆 | 精品国精品国产 | 99久久久久久久 | 日韩一区二区三区在线播放 | 伊人中文字幕在线观看 | 成人午夜视频免费看 | 成人av免费观看 | 国产亚洲AV无码成人网站在线 | 一区二区精彩视频 | 成年黄色片 |