久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

linux的啟動配置文件(grub) - 福,。oO - 博客園

 文心雕龍_01 2015-10-11
linux的啟動配置文件(grub):
GRUB:系統(tǒng)引導(dǎo)管理器,。GRUB啟動時會在 /boot/grub 中尋找一個名字為grub.conf的設(shè)置文件,,如果找不到此設(shè)置文件則不進(jìn)入菜單模式而直接進(jìn)入命令行模式。
    grub.conf是一個純文字文件,,您可以用任何一個文字編輯器來打開它,。每一行代表一個設(shè)置命令,如果一行的第一個字符為井號#,,則這一行為注釋,,您可以簡單地用增加或減少注釋行來改變設(shè)置。
用vi打開grub.conf,,內(nèi)容如下:
default=0
timeout=10
splashimage=(hd0,6)/grub/splash.xpm.gz
title Red Hat Linux (2.4.20-8)
        root (hd0,0)
        kernel /vmlinuz-2.4.20-8 ro root=LABEL=/
        initrd /initrd-2.4.20-8.img
timeout second
設(shè)置在second秒之后引導(dǎo)默認(rèn)的操作系統(tǒng),。
Linux 默認(rèn)是timeout 10,也就是說10秒之內(nèi)如果沒有其他命令就啟動系統(tǒng),。如果設(shè)成 -1,,則 GRUB 會一直等待直到用戶選擇一個選項為止。
default num
默認(rèn)啟動第 num +1行選項,,也就說default=0,,則默認(rèn)啟動菜單第1行的操作系統(tǒng),,default=1,則啟動第2行的系統(tǒng),,如此類推,。
splashimage指定了開機(jī)畫面文件splash.xpm.gz的位置.
title: 定義啟動菜單項的名稱
root: 設(shè)置 Grub 的根設(shè)備 (root)為 Linux 內(nèi)核所在分區(qū)
hd0是指第一個硬盤(主硬盤),(hd0,0)是指第一個硬盤的第一個分區(qū),。
kernel: 后跟 Linux 內(nèi)核文件為參數(shù),, 加載 Linux 內(nèi)核文件
kernel /vmlinuz是指出Linux內(nèi)核的路徑在/vmlinuz中。
initrd: 加載鏡像文件
如果自己重新編譯了內(nèi)核,,可把這個內(nèi)核加載到grub,開機(jī)時可以選擇運(yùn)行哪個內(nèi)核,。(把這段加在原有內(nèi)容的后面,想啟動幾個就加幾個)
如:title Linux (2.4.18)
        root (hd0,0)
        kernel /bzImage ro root=/dev/hda2
        initrd /initrd-2.4.20-8.img
改一下啟動菜單的名稱,,把編譯好的內(nèi)核bImage掛載到/dev/hda2
如果硬盤用的是scsi的,,掛載到/dev/sda2,在make menuconfig時,,以下選項必選:
Device Drivers  --->SCSI device support  ---><*>   SCSI disk support
Device Drivers  --->SCSI device support  --->SCSI low-level drivers  ---> <*> BusLogic SCSI support
Open()
頭文件: #include<fcntl.h>
定義函數(shù) int open( const char * pathname, int flags);
int open( const char * pathname,int flags, mode_t mode);
Open()和 C 中的fopen相似,,定義int fd;fd=open(“filename”,,打開方式),;
返回值:此函數(shù)調(diào)用成功后(所有欲核查的權(quán)限都通過了檢查)將返回所打開的文件的文件描述符(int類型),表示成功,,如果調(diào)用失敗,,或只要有一個權(quán)限被禁止則返回-1。
O_RDONLY 以只讀方式打開文件
O_WRONLY 以只寫方式打開文件
O_RDWR 以可讀寫方式打開文件,。上述三種是互斥的,,也就是不可同時使用,但可與下列的利用OR(|)運(yùn)算符組合,。
O_CREAT 若欲打開的文件不存在則自動建立該文件,。
O_EXCL 如果O_CREAT 也被設(shè)置,此指令會去檢查文件是否存在,。文件若不存在則建立該文件,,否則將導(dǎo)致打開文件錯誤。此外,,若O_CREAT與O_EXCL同時設(shè)置,,并且欲打開的文件為符號連接,則會打開文件失敗,。
O_NOCTTY 如果欲打開的文件為終端機(jī)設(shè)備時,,則不會將該終端機(jī)當(dāng)成進(jìn)程控制終端機(jī)。
O_TRUNC 若文件存在并且以可寫的方式打開時,,此旗標(biāo)會令文件長度清為0,,而原來存于該文件的資料也會消失,。
O_APPEND 當(dāng)讀寫文件時會從文件尾開始移動,也就是所寫入的數(shù)據(jù)會以附加的方式加入到文件后面,。
O_NONBLOCK 以不可阻斷的方式打開文件,,也就是無論有無數(shù)據(jù)讀取或等待,都會立即返回進(jìn)程之中,。
O_NDELAY 同O_NONBLOCK,。
O_SYNC 以同步的方式打開文件。
O_NOFOLLOW 如果參數(shù)pathname 所指的文件為一符號連接,,則會令打開文件失敗,。
O_DIRECTORY 如果參數(shù)pathname 所指的文件并非為一目錄,則會令打開文件失敗,。
Read()
頭文件: #include<unistd.h>
定義函數(shù) ssize_t read(int fd,void * buf ,size_t count);
函數(shù)說明 read()會把參數(shù)fd 所指的文件傳送count個字節(jié)到buf指針?biāo)傅膬?nèi)存中,。若參數(shù)count為0,則read()不會有作用并返回0,。返回值為實(shí)際讀取到的字節(jié)數(shù),,如果返回0,表示已到達(dá)文件尾或是無可讀取的數(shù)據(jù),,此外文件讀寫位置會隨讀取到的字節(jié)移動,。
附加說明 如果順利read()會返回實(shí)際讀到的字節(jié)數(shù),最好能將返回值與參數(shù)count 作比較,,若返回的字節(jié)數(shù)比要求讀取的字節(jié)數(shù)少,,則有可能讀到了文件尾、從管道(pipe)或終端機(jī)讀取,,或者是read()被信號中斷了讀取動作,。當(dāng)有錯誤發(fā)生時則返回-1,錯誤代碼存入errno中,,而文件讀寫位置則無法預(yù)期,。
文件描述符:
     任何打開的文件都將被分配一個唯一標(biāo)識該打開文件夾的文件描述符(也稱文件句柄),,為一個大于等于0的整數(shù),。系統(tǒng)啟動后,默認(rèn)打開的文件流有標(biāo)準(zhǔn)輸入設(shè)備(STDIN),、標(biāo)準(zhǔn)輸出設(shè)備(STDOUT)和標(biāo)準(zhǔn)錯誤輸出設(shè)備(STDERR),,其文件描述符分別為0、1,、2,。以后打開的文件的文件描述符分配依次增加。
     內(nèi)核(kernel)利用文件描述符(file descriptor)來訪問文件,。文件描述符是非負(fù)整數(shù),。打開現(xiàn)存文件或新建文件時,,內(nèi)核會返回一個文件描述符。讀寫文件也需要使用文件描述符來指定待讀寫的文件,。
系統(tǒng)調(diào)用:
在Linux中,,為了更好地保護(hù)內(nèi)核,把程序運(yùn)行空間分為內(nèi)核空間和用戶空間,,它們分別運(yùn)行在不同的級別上,,用戶進(jìn)程在通常情況下不允許訪問內(nèi)核數(shù)據(jù),也無法使用內(nèi)核函數(shù),。但是在有些情況下,,用戶空間的進(jìn)程需要獲得一定的系統(tǒng)服務(wù),這時,,就必須通過系統(tǒng)調(diào)用,。
系統(tǒng)調(diào)用是指操作系統(tǒng)提供給用戶程序調(diào)用的一組“特殊”接口,用戶程序可以通過這組接口獲得操作系統(tǒng)內(nèi)核提供的服務(wù),。從邏輯上來說,,系統(tǒng)調(diào)用可被看成是一個內(nèi)核與用戶空間程序交互的接口——它好比一個中間人,把用戶進(jìn)程的請求傳達(dá)給內(nèi)核,,待內(nèi)核把請求處理完畢后再將處理結(jié)果送回給用戶空間,。
系統(tǒng)調(diào)用、用戶編程接口(API),、系統(tǒng)命令,、和內(nèi)核函數(shù)的關(guān)系
系統(tǒng)調(diào)用并非直接和程序員或系統(tǒng)管理員打交道,它僅僅是一個通過軟中斷機(jī)制向內(nèi)核提交請求,,獲取內(nèi)核服務(wù)的接口,。而在實(shí)際使用中程序員調(diào)用的多是用戶編程接口——API,而管理員使用的則多是系統(tǒng)命令,。
用戶編程接口其實(shí)是一個函數(shù)定義,,說明了如何獲得一個給定的服務(wù),比如read(),、malloc(),、free()、abs()等,。這些系統(tǒng)調(diào)用編程接口主要是通過C庫(libc)實(shí)現(xiàn)的,。
系統(tǒng)命令相對編程接口更高了一層,它是內(nèi)部引用API的可執(zhí)行程序,,比如我們常用的系統(tǒng)命令ls等,。
內(nèi)核函數(shù)和系統(tǒng)調(diào)用的關(guān)系,內(nèi)核函數(shù)不要想像的過于復(fù)雜,,其實(shí)它們和普通函數(shù)很像,,只不過在內(nèi)核實(shí)現(xiàn),,因此要滿足一些內(nèi)核編程的要求。系統(tǒng)調(diào)用是一層用戶進(jìn)入內(nèi)核的接口,,它本身并非內(nèi)核函數(shù),,進(jìn)入內(nèi)核后,不同的系統(tǒng)調(diào)用會找到對應(yīng)到各自的內(nèi)核函數(shù)——換個專業(yè)說法就叫:系統(tǒng)調(diào)用服務(wù)服務(wù)例程,。實(shí)際對請求服務(wù)的是內(nèi)核函數(shù)而非調(diào)用接口,。
總而言之,從用戶角度向內(nèi)核看,,依次是系統(tǒng)命令,、編程接口、系統(tǒng)調(diào)用和內(nèi)核函數(shù),。
系統(tǒng)調(diào)用通常通過函數(shù)進(jìn)行調(diào)用,通常,用一個負(fù)的返回值來表明錯誤,返回一個0值表明成功.
系統(tǒng)調(diào)用號:
在Linux中,每個系統(tǒng)調(diào)用被賦予一個全局唯一的系統(tǒng)調(diào)用號.用戶空間進(jìn)程執(zhí)行一個系統(tǒng)調(diào)用的時候,這個系統(tǒng)調(diào)用號就被用來指明到底要執(zhí)行哪個系統(tǒng)調(diào)用;進(jìn)程不會提及系統(tǒng)調(diào)用的名稱.
系統(tǒng)調(diào)用號相當(dāng)關(guān)鍵,一旦分配就不能再有任何變更,否則編譯好的應(yīng)用程序就會崩潰.此外,如果一個系統(tǒng)調(diào)用被刪除,它所占用的系統(tǒng)調(diào)用號也不允許被回收利用.
應(yīng)用程序應(yīng)該以某種方式通知系統(tǒng),告訴內(nèi)核自己需要執(zhí)行一個系統(tǒng)調(diào)用,希望系統(tǒng)切換到內(nèi)核態(tài),這樣內(nèi)核就可以代表應(yīng)用程序來執(zhí)行該系統(tǒng)調(diào)用了.
文件include/asm/unisted.h為每個系統(tǒng)調(diào)用規(guī)定了唯一的編號,。假設(shè)用name表示系統(tǒng)調(diào)用的名稱,那么系統(tǒng)調(diào)用號與系統(tǒng)調(diào)用響應(yīng)函數(shù)的關(guān)系是:以系統(tǒng)調(diào)用號_NR_name作為下標(biāo),,可找出系統(tǒng)調(diào)用表sys_call_table(見arch/i386/kernel/entry.S)中對應(yīng)表項的內(nèi)容,,它正好 是該系統(tǒng)調(diào)用的響應(yīng)函數(shù)sys_name的入口地址。系統(tǒng)調(diào) 用表sys_call_table記錄了各sys_name函數(shù)在表中的位 置,。有了這張表,,就很容易根據(jù)特定系統(tǒng)調(diào)用 在表中的偏移量,找到對應(yīng)的系統(tǒng)調(diào)用響應(yīng)函數(shù)的入口地址,。系統(tǒng)調(diào)用表共2XX項,,余下的項是可供用戶自己添加的系統(tǒng)調(diào)用空間。
1.編寫一個系統(tǒng)調(diào)用函數(shù),,把它加到內(nèi)核中,,函數(shù)名以 sys_ 開頭,后跟該系統(tǒng)調(diào)用名,。如新加系統(tǒng)調(diào)用為foo(),,在/linux/kernel/sys.c中添加源代碼:
asmlinkage int sys_foo(int x)
{
        printk(“%d\n”,x);  //注意這是在內(nèi)核下的,用printk
}
2. 連接新的系統(tǒng)調(diào)用
1).inculde/asm/unistd.h在這個文件中加入
#define_NR_foo 238   (因為原列表結(jié)尾是237,,所以在后面加)
2).are/i386/kernel/entry.S這個文件用來對指針數(shù)組初始化,,在這個文件中增加一行:
.long SYMBOL_NAME(_sys_foo)
3.重新編譯內(nèi)核
    為了使新的系統(tǒng)調(diào)用生效,需要重建Linux內(nèi)核,,以root身份在linux文件夾下編譯內(nèi)核:
    make menuconfig  //配置內(nèi)核,,在File system下選中ext3文件系統(tǒng)支持
    make clean       //清除以前編譯的中間文件
    make dep         //讀取配置文件,,創(chuàng)建依賴關(guān)系樹
    make bzImage     //編譯內(nèi)核
4.裝載內(nèi)核,,將/linux/arch/i386/boot/bzImage復(fù)制到/boot下
  修改grub.conf(請看linux啟動配置文件)
  重啟系統(tǒng),在啟動介面上,,可以選擇剛才編譯的那個內(nèi)核進(jìn)入,。
5.編寫測試程序
#include <stdio.h>
#include '/home/xgc/linux/include/asm-i386/unistd.h'
int errno;
_syscall1(char *, foo, int, ret)
int main()
{
        int i;
        i = 100;
        printf('This is the result of new kernel\n');
        foo(i);
        return 0;
}
在字符介面運(yùn)行可得到結(jié)果:100
宏定義_syscallN()見include/asm/unisted.h)用于系統(tǒng)調(diào)用的格式轉(zhuǎn)換和參數(shù)的傳遞,。N取0~5之間的整數(shù)。 參數(shù)個數(shù)為N的系統(tǒng)調(diào)用由_syscallN()負(fù)責(zé)格式轉(zhuǎn)換和參數(shù)傳遞,。在這里使用了_syscall1()宏指令,,宏指令本身在程序中將擴(kuò)展成名為syscall()的函數(shù),它在main()函數(shù)內(nèi)部加以調(diào)用,。
unistd.h

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多