成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux內(nèi)核編譯與開發(fā)

系統(tǒng) Linux 企業(yè)動態(tài)
本文主要介紹Linux的內(nèi)核編譯與開發(fā),具體內(nèi)容詳見下文。

一.Linux內(nèi)核簡介

linux kernel map: 

 

 

linux kernel map 

linux 系統(tǒng)體系結(jié)構(gòu): 

 

 

linux 系統(tǒng)體系結(jié)構(gòu)

 

linux kernel體系結(jié)構(gòu):

arm有7種工作模式,x86也實(shí)現(xiàn)了4個不同級別RING0-RING3,RING0級別***,

這樣linux用戶代碼運(yùn)行在RING3下,內(nèi)核運(yùn)行在RING0,這樣系統(tǒng)本身就得到了

充分的保護(hù)

用戶空間(用戶模式)轉(zhuǎn)到內(nèi)核空間(系統(tǒng)模式)方法:

  • 系統(tǒng)調(diào)用
  • 硬件中斷

linux kernel 體系結(jié)構(gòu): 

 

 

linux kernel 體系結(jié)構(gòu) 

虛擬文件系統(tǒng)VFS:

VFS(虛擬文件系統(tǒng))隱藏各種文件系統(tǒng)的具體細(xì)節(jié),為文件操作提供統(tǒng)一的接口

二.Linux內(nèi)核源代碼

linux內(nèi)核下載www.kernel.org

目錄結(jié)構(gòu):

解壓linux kernel tar后目錄

  • arch:根據(jù)cpu體系結(jié)構(gòu)不同而分的代碼
  • block:部分塊設(shè)備驅(qū)動程序
  • crypto:加密,壓縮,CRC校驗算法
  • documentation:內(nèi)核文檔
  • drivers:設(shè)備驅(qū)動程序
  • fs(虛擬文件系統(tǒng)vfs):文件系統(tǒng)
  • include:內(nèi)核所需的頭文件,(與平臺無關(guān)的頭文件在include/linux中)
  • lib:庫文件代碼(與平臺相關(guān)的)
  • mm:實(shí)現(xiàn)內(nèi)存管理,與硬件體系結(jié)構(gòu)無關(guān)的(與硬件體系結(jié)構(gòu)相關(guān)的在arch中)
  • net:網(wǎng)絡(luò)協(xié)議的代碼
  • samples:一些內(nèi)核編程的范例
  • scripts:配置內(nèi)核的腳本
  • security:SElinux的模塊
  • sound:音頻設(shè)備的驅(qū)動程序
  • usr:cpio命令實(shí)現(xiàn),用于制作根文件系統(tǒng)的命令(文件系統(tǒng)與內(nèi)核放到一塊的命令)
  • virt:內(nèi)核虛擬機(jī)

linux DOC 編譯生成:

linux源根目錄/Documentation/00-INDEX:目錄索引

linux源根目錄/Documentation/HOWTO:指南

生成linux內(nèi)核幫助文檔:在linux源根目錄(Documentation) 執(zhí)行make htmldocs

ubuntu16下需要執(zhí)行sudo apt-get install xmlto安裝插件才可生成doc文檔

后面開發(fā)中經(jīng)常要改的是arch,drivers中的代碼

三.Linux內(nèi)核配置與編譯

清理文件(在linux源碼根目錄):

  • make clean:只清理所有產(chǎn)生的文件
  • make mrproper:清理所有產(chǎn)生的文件與config配置文件
  • make distclean:清理所有產(chǎn)生的文件與config配置文件,并且編輯過的與補(bǔ)丁文件

配置(收集硬件信息如cpu型號,網(wǎng)卡等...):

  • make config:基于文本模式的交互配置
  • make menuconfig:基于文本模式的菜單模式(推薦使用)
  • make oldconfig:使用已有的.config,但會詢問新增的配置項
  • make xconfig:圖形化的配置(需要安裝圖形化系統(tǒng))

配置方法:

1)使用make menuconfig操作方法:

1>按y:編譯>連接>鏡像文件

2>按m:編譯

3>按n:什么都不做

4>按"空格鍵":y,n輪換

配置完并保存后會在linux源碼根目錄下生成一個.config文件

注意:在ubuntu11上要執(zhí)行apt-get install libncurses5-dev來安裝支持包

2)利用已有的配置文件模板(.config)

1>linux源碼根目錄/arch/<cpu架構(gòu)>/configs/<具體某一的CPU文件>,把里面對應(yīng)的文件copy并改名為.config至linux源碼根目錄下

2>利用當(dāng)前運(yùn)行已有的文件(要用ls /boot/ -a查看)把/boot/config-2.6.18-53.e15拷貝并改名為.config至linux源碼根目錄下執(zhí)行以上操作就可以用make menuconfig在拷貝

.config文件上面修改文件了

編譯內(nèi)核:

1)make zImage

2)make bzImage

區(qū)別:在X86平臺上,zimage只能用于小于512k的內(nèi)核

獲取詳細(xì)編譯信息:make zimage V=1 或 make bzimage V=1

編譯好的內(nèi)核在:arch/<cpu>/boot/目錄下

注意:在把.config配置文件cp到根目錄編譯內(nèi)核前,必須進(jìn)入make menuconfig并保存退出(否則生不了效)

編譯并安裝模塊:

1)編譯內(nèi)核模塊:make modules

2)安裝內(nèi)核模塊:make modules_install INSTALL_MOD_PATH=/lib/modules

更換本機(jī)器內(nèi)核:將編譯好的內(nèi)核模塊從內(nèi)核源碼目錄copy至/lib/modules下

制作init ramdisk():輸入執(zhí)行命令mkinitrd initrd-2.6.39(任意) 2.6.39(可通過查詢/lib/modules下的目錄得到)

注意:

mkinitrd命令為redhat里面的,ubuntu的命令為:mkinitramfs -k /lib/modules/模塊安裝位置 -o initrd-2.6.39(任意) 2.6.39(可通過查詢/lib/modules下的目錄得到)

如果ubuntu里面沒有mkinitramfs命令可以用apt-get install initrd-tools進(jìn)行安裝

安裝內(nèi)核模塊:

1)手動

1>cp linux根目錄/arch/x86/boot/bzImage /boot/mylinux-2.6.39

2>cp linux根目錄/initrd-2.6.39 /boot/initrd-2.6.39

***修改/etc/grub.conf或/etc/lilo.conf文件

2)自動

1>make install:這個命令會自動完成上面的操作(查看當(dāng)前內(nèi)核版本:uname -r)

-----------------------------------------------------------------------------

四.linux內(nèi)核模塊開發(fā)

描述:

linux內(nèi)核組件非常龐大,內(nèi)核ximage并不包含某組件,而是在該組件需要被使用的時候,動態(tài)的添加到正在運(yùn)行的內(nèi)核中(也可以卸載),這種機(jī)制叫做“內(nèi)核模塊”的機(jī)制。內(nèi)核模塊通常通過使用makefile文件對模塊進(jìn)行編譯

模塊安裝與卸載:

1)加載:insmod hello.ko

2)卸載:rmmod hello

3)查看:lsmod

4)加載(自動尋找模塊依賴):modprobe hello

modprobe會根據(jù)文件/lib/modules/version/modules.dep來查看要加載的模塊,看它是否還依賴于其他模塊,如果是,會先找到這些模塊,把它們先加載到內(nèi)核

實(shí)例分析:

1)moduleDep/1(一個模塊的編譯)

 

  1.  1 #include <linux/module.h> 2 #include <linux/init.h> 3  4 //模塊入口函數(shù) 5 //__init:表示代碼段中的子段,里面的內(nèi)容只運(yùn)行一次并且回收內(nèi)存. 6 static int __init hello_init(void) 7 { 8     printk(KERN_EMERG "hello world!\n"); 9     return 0;10 }11 //模塊卸載函數(shù)12 //__exit:13 static void __exit hello_exit(void)14 {15     printk(KERN_EMERG "hello exit!\n");16 }17 //內(nèi)核符號導(dǎo)出 函數(shù)18 int add_integar(int a,int b)19 {20     return a+b;  
  2. 21 }22 int sub_integar(int a,int b)23 {24     return a-b;  
  3. 25 }26 27 module_init(hello_init);28 module_exit(hello_exit);29 //函數(shù)導(dǎo)出30 EXPORT_SYMBOL(add_integar);31 EXPORT_SYMBOL(sub_integar); 

 

makefile:

  1. #***次執(zhí)行KERNELRELEASE是空的,所以執(zhí)行else里面的 
  2. ifneq ($(KERNELRELEASE),) 
  3.  
  4. obj-m :=hello.o 
  5.  
  6. #else塊 
  7.  
  8. elseKDIR:= /lib/modules/2.6.18-53.el5/build 
  9.  
  10. all
  11. #KDIR    依賴內(nèi)核模塊源代碼路徑(內(nèi)核編譯安裝路徑) 
  12. #PWD     表示內(nèi)核代碼在哪(當(dāng)前目錄) 
  13. #modules 編譯的是模塊 
  14.     make -C $(KDIR) M=$(PWD) modules  
  15.  
  16. clean: 
  17.     rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.order 
  18.  
  19. endif 

 

2)moduleDep/2(兩個模塊的編譯)

  1. #include <linux/module.h>  
  2. #include <linux/init.h>  
  3. //模塊可選信息  
  4. MODULE_LICENSE("GPL");//許可證聲明  
  5. MODULE_AUTHOR("liyuan");//作者聲明  
  6. MODULE_DESCRIPTION("This module is a param example.");//模塊描述  
  7. MODULE_VERSION("V1.0");//模塊別名  
  8. MODULE_ALIAS("a simple module");//模塊別名  
  9.  
  10. //模塊參數(shù) 
  11. static char *name = "liyuan arg"
  12. static int age = 30; 
  13. //S_IRUGO是參數(shù)權(quán)限,也可以用數(shù)字 
  14. module_param(age,int,S_IRUGO); 
  15. module_param(name,charp,S_IRUGO); 
  16.  
  17.  
  18. //使用外部文件函數(shù) 
  19. extern int add(int a,int b); 
  20.  
  21.  
  22. //聲明 外部內(nèi)核符號 函數(shù) 
  23. extern int add_integar(int a,int b); 
  24. extern int sub_integar(int a,int b); 
  25.  
  26. static int __init mains_init(void) 
  27.      //多文件編譯 
  28.  
  29.     printk(KERN_EMERG"param hi"); 
  30.     int vle=add(1,2); 
  31.     printk(KERN_EMERG"add value:%d\n",vle); 
  32.     //模塊參數(shù) 
  33.  
  34.      printk(KERN_EMERG" name : %s\n",name); 
  35.      printk(KERN_EMERG" age : %d\n",age); 
  36.  
  37.     //使用其他模塊的函數(shù)(內(nèi)核符號導(dǎo)出) 
  38.     int adds=add_integar(3,1); 
  39.     int subs=sub_integar(3,1); 
  40.     printk(KERN_EMERG" add_integar : %d\n",adds); 
  41.     printk(KERN_EMERG" sub_integar : %d\n",subs); 
  42.     return 0; 
  43.  
  44. static void __exit mains_exit(void) 
  45.     printk("param exit!"); 
  46.  
  47. module_init(mains_init);52 module_exit(mains_exit); 

add.c

  1. int add(int a,int b) 
  2.      return a+b; 

 

makefile

  1. ifneq ($(KERNELRELEASE),) 
  2. #兩個以上內(nèi)核源文件 生成單獨(dú)的內(nèi)核模塊名ma 
  3.  
  4. #內(nèi)核ma 
  5. obj-m :=ma.o 
  6. #下面的ma-objs前面必須和上面一樣為ma 
  7. ma-objs := mains.o add.oelseKDIR:= /lib/modules/2.6.18-53.el5/build 
  8.  
  9. all
  10.         make -C $(KDIR) M=$(PWD) modules  
  11. clean: 
  12.     rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.order 
  13.  
  14. endif 

 

運(yùn)行帶參模塊:insmod hello.ko name=yuan age=12

內(nèi)核符號導(dǎo)出(/proc/kallsyms記錄了內(nèi)核中所有導(dǎo)出的符號的名字與地址):

一個內(nèi)核模塊的運(yùn)行依賴另一個內(nèi)核模塊的函數(shù)實(shí)現(xiàn),必須先運(yùn)行***個內(nèi)核模塊,這樣就需要進(jìn)行內(nèi)核符號導(dǎo)出。

注意:

錯誤信息:disagrees about version of symbol struct_module insmod:error inserting ...

開發(fā)內(nèi)核模塊時會出現(xiàn),內(nèi)核模塊不匹配的情況.是你當(dāng)前運(yùn)行的linux內(nèi)核與編譯連接所依賴的

內(nèi)核版本不匹配,解決方法:

  • 使用modprobe --force-modversion強(qiáng)行插入
  • 可使用uname -r進(jìn)行查看當(dāng)前運(yùn)行的內(nèi)核版本

printk內(nèi)核打印:

在<linux/kernel.h>中printk有8個優(yōu)先級,按優(yōu)先級遞減的是:

  • KERN_EMERG 0

用于緊急的消息,常常是那些崩潰的消息

  • KERN_ALERT 1

需要立刻行動的消息

  • KERN_CRIT 2

嚴(yán)重情況

  • KERN_ERR 3

錯誤情況

  • KERN_WARNING(printk默認(rèn)級別) 4

有問題的警告

  • KERN_NOTICE 5

正常情況,但是仍然值得注意

  • KERN_INFO 6

信息消息

  • KERN_DEBUG 7

用作調(diào)試消息

不管是哪個級別的都會在/var/log/messages里面打印出來(messages可以刪除后,運(yùn)行內(nèi)核進(jìn)行測試內(nèi)核打印情況)控制臺打印(優(yōu)先級配置/proc/sys/kernel/printk)

6 4 1 7

  • Console_loglevel
  • Default_message_loglevel
  • Minimum_console_level
  • Default_console_loglevel

在vm+redhat安裝2.6.39內(nèi)核時出現(xiàn)的錯誤

啟動時報could not find filesystem '/dev/root'

解決方法

a.通過make menuconfig選中以下對應(yīng)的選項

General setup -->

[*] enable deprecated sysfs features to support old userspace tools

成功時下面那個也*了的

b.修改.config文件

修改.config文件中CONFIG_SYSFS_DEPRECATED_V2,將原本被注釋掉的

CONFIG_SYSFS_DEPRECATED_V2 改成CONFIG_SYSFS_DEPRECATED_V2=y 

 

責(zé)任編輯:龐桂玉 來源: 嵌入式Linux中文站
相關(guān)推薦

2010-02-26 10:17:15

Linux uClin

2010-02-02 11:00:03

Linux 2.6內(nèi)核

2011-07-28 18:24:15

Linux 3.0內(nèi)核

2011-01-04 17:00:32

Linux內(nèi)核編譯

2010-03-02 16:13:56

Linux升級

2009-12-17 15:18:47

2009-10-16 09:45:41

Linux內(nèi)核操作系統(tǒng)

2023-10-05 15:47:04

Linux內(nèi)核編譯

2011-01-14 16:51:44

Linux內(nèi)核

2021-05-26 07:53:58

Linux運(yùn)維Linux系統(tǒng)

2009-10-23 16:35:44

linux Debia

2010-02-02 13:26:53

Linux內(nèi)核

2023-05-08 08:05:42

內(nèi)核模塊Linux

2010-04-20 10:12:05

2010-04-21 12:54:46

Unix內(nèi)核

2023-07-25 15:17:38

Linux操作系統(tǒng)開發(fā)

2018-05-18 09:07:43

Linux內(nèi)核內(nèi)存

2010-03-02 15:47:39

Linux內(nèi)核系統(tǒng)

2010-05-13 09:45:26

Linux地址空間

2022-02-08 15:15:26

OpenHarmonlinux鴻蒙
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久黄色网 | 国产精品毛片久久久久久 | 国产乱精品一区二区三区 | 精品欧美一区二区精品久久久 | 亚洲人人 | 日韩在线 | 精品国产亚洲一区二区三区大结局 | 一级大片免费 | 午夜国产羞羞视频免费网站 | 91电影院 | 日本视频一区二区三区 | 免费在线看黄 | 国产精品成av人在线视午夜片 | 国产精品久久福利 | 国产精品成人一区二区 | 欧美精品一区二区三区蜜臀 | 国产综合av | 亚洲成人在线视频播放 | 国产亚洲www | 成人美女免费网站视频 | 国产剧情一区 | 久久国产欧美日韩精品 | 黄色福利 | 亚洲 欧美 激情 另类 校园 | 欧美日韩精品久久久免费观看 | 91精品国产综合久久香蕉麻豆 | 免费播放一级片 | 欧美日韩看片 | 国产熟熟 | 在线男人天堂 | av一二三四| 欧美精产国品一二三区 | 久久久精| 欧美精品影院 | 欧美a免费| 国产视频一视频二 | 国产精品久久久久久久久久久久久久 | 国产精品一区二区在线 | 日韩一区二区三区在线视频 | 欧美日韩一区不卡 | 欧美日本亚洲 |