一、linux內(nèi)核
Linux是一種開源電腦操作系統(tǒng)。它是一個(gè)用C語(yǔ)言寫成,符合POSIX標(biāo)準(zhǔn)的類Unix操系統(tǒng)钦扭。
Linux最早是由芬蘭黑客 Linus Torvalds為嘗試在英特爾x86架構(gòu)上提供自由免費(fèi)的類Unix操作系統(tǒng)而開發(fā)的。該計(jì)劃開始于1991年床绪,在計(jì)劃的早期有一些Minix 黑客提供了協(xié)助客情,而今天全球無(wú)數(shù)程序員正在為該計(jì)劃無(wú)償提供幫助。
時(shí)鐘-->(調(diào)度器)
v
[task_struct]<---->[task_struct]
二癞己、內(nèi)存管理:
1.地址空間管理 v = malloc(50)
2.虛擬地址物理地址的映射
三裹匙、網(wǎng)絡(luò)
1.socket
2.tcp/ip
四、文件系統(tǒng)
1.抽象統(tǒng)一的文件操作接口
2.支持不同的文件系統(tǒng)(fat ext4 ......)
五末秃、設(shè)備驅(qū)動(dòng)
-->字符設(shè)備 LCD/TS/SOUND/ADC.... <---字符驅(qū)動(dòng)
-->塊設(shè)備 硬件 u盤 sd卡 <---塊驅(qū)動(dòng)
--->網(wǎng)絡(luò)設(shè)備 網(wǎng)卡 <----網(wǎng)卡驅(qū)動(dòng)
六概页、linux 源碼介紹
1、linux內(nèi)核源碼查看:
安裝ctags sudo apt-get install ctags
使用ctags vim -t memcpy
在文件中使用ctags :cstag memcpy
追蹤源碼:ctrl+]
返回:ctrl+o
==============================================
2练慕、在內(nèi)核中添加自己的文件
mkdir drivers/kernel/
touch drivers/kernel/test.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/sched.h>
//內(nèi)核啟動(dòng)的時(shí)候調(diào)用test_init
static __init int test_init(void)
{
int i;
for (i = 0; i < 20; i++)
printk("test_init\n");
//執(zhí)行成功的話返回0,否則返回相應(yīng)的錯(cuò)
return 0;
}
module_init(test_init);
MODULE_LICENSE("GPL");
touch drivers/kernel/Makefile
obj-y += test.o
vim drivers/Makefile
obj-y += kernel/
make
3惰匙、在內(nèi)核中添加自己的選項(xiàng)
make menuconfig
--------->Kconfig
kernel/Kconfig drivers/Kconfig
Kconfig
------->.config
make
------->include/generated/autoconf.h--->test.c
------->include/config/auto.conf------->Makefil
六、內(nèi)核模塊
注意:1.編譯模塊使用的內(nèi)核和板子中運(yùn)行的內(nèi)核必
2.內(nèi)核的配置要統(tǒng)一
多個(gè)文件編譯成一個(gè)模塊
模塊之間的依賴關(guān)系
符號(hào)導(dǎo)出(EXPORT_SYMBOL)
七铃将、內(nèi)存管理
MMU+Page_table---->
虛擬地址--->映射
Linux啟動(dòng)后 虛擬地址
早期:32 x86
物理內(nèi)存分為3個(gè)驅(qū)動(dòng)
DMA(16M) NOMAL(896M-16M) HIGH
dma尋址 24位
虛擬地址范圍 0-4G
0-3G應(yīng)用程序使用
3G-4G內(nèi)核使用
DMA+NOMAL--->[3G--3G+896M] 直接映射區(qū) 線性
HIGH-------->動(dòng)態(tài)映射到3G+896M
虛擬地址范圍
[3G-4G]
0xfff00000----->0xffff0000 臨時(shí)映射區(qū) 高
0xf0000000----->0xff000000
只能保證虛擬是連續(xù),物理上不一定連續(xù)
能夠把不連續(xù)的物理內(nèi)存映射到連續(xù)的虛擬
vmalloc
vzalloc
適合分配比較大的內(nèi)存
0xc0000000----->0xef800000 直接映射區(qū) 52
保證物理空間和虛擬空間都是連續(xù)的
alloc_pages 2^n page
alloc_page 2^0 page
__get_free_pages 2^n page
__get_free_page 2^0 page
kmalloc
kzalloc
0xbfe00000----->0xc0000000 永久映射區(qū) 高
0xbf000000----->0xbfe00000 模塊
0x00000000----->0xbf000000 usr
使用內(nèi)存
1.映射 [0xc0000100-0xc0000200]
2.權(quán)限 申請(qǐng)內(nèi)存
page struct page -----> 1024M / 4K = 256K
每一個(gè)page結(jié)構(gòu)提描述一個(gè)物理頁(yè) 臟頁(yè) 虛擬地