今天在做linux系統呼叫與核心編譯的實驗,主要任務有兩個:
1)新增乙個新的系統呼叫:
mysyscall
,功能僅為列印一條語句。
2)編譯核心。
實驗步驟如下:1.
2.以root登入,將核心包複製到usr/src下:cp linux-2.6.36.tar.bz2 /usr/src 3.
解壓:tar -xjvf linux-2.6.36.2.tar.bz2
4.修改以下資料夾下的
3個檔案:
①編輯/usr/src/ linux-2.6.36.2/kernel/sys.c
檔案,新增系統呼叫函式:
syscall_define1(mysyscall,int, number)
②編輯/usr/src/linux-2.6.36.2/arch/x86/kernel/syscall_table_32.s,
.long sys_mysyscall/* 341 */
從這個檔案來確定
mysyscall
的系統呼叫號,
mysyscall
的系統呼叫號等於最後一行的系統呼叫號
+1。如最後行對應的系統呼叫號是
340,
mysyscall
的系統呼叫號為
341。
③修改/usr/src/linux-2.6.36.2/arch/x86/include/asm/unistd_32.h
,新增一行將
mysyscall
與確定的系統呼叫號對應起來:
#define __nr_mysyscall 341 5.
重新編譯核心
在終端輸入命令,進入源**資料夾:
cd /usr/src/linux-2.6.36.2
,執行如下命令:
make mrproper
①配置核心
(兩種方法):
1)手動:
make menuconfig
(出現選單配置介面)
2)採用核心的配置選項:
make allyesconfig
盡可能地使用
''y''
設定特徵值,來建立乙個配置檔案,得到乙份最詳細的**
make allmodconfig
盡可能地使用
''m''
設定特徵值,來建立乙個配置檔案
make allnoconfig
盡可能地使用
''n''
設定特徵值,來建立乙個配置檔案
,得到乙份精簡的**
關於是直接編進核心還是編譯成模組的一點參考:若是核心一定需要的功能,不用多說直接編進核心;可能在將來會用到的功能,盡量編譯成模組;完全不了解的核心功能就保留預設值。
首頁的幾個選項介紹:
(1)general setup
與linux
最相關的程式互動、核心版本說明、是否使用開發中程式**等資訊都在這裡設定的。基本上,保留預設值即可。不要隨便取消下面的任何乙個選項,可能造成某些程式無法被同時執行的困境。
(2)processor type and features
挑選主機的實際
cpu形式。
(3)power management and acpi options
系統電源管理機制。
(4)executable file formats/emulations
編譯成可執行檔案的格式,是給
linux
核心執行可執行檔案之用的資料。
(5)networking support
核心的網路功能,包含了防火牆的相關選項,就是防火牆
iptables
這個資料。建議編成模組。
(6)device drivers
各項裝置的驅動程式,這是所有硬體裝置的驅動程式庫。
(7)security options
、cryptographic api
資訊保安、密碼應用
②編譯核心(結果檔案會放到源**所在目錄)
makebzimage
(耗時很長)
以上命令執行完畢後,會在當前目錄下生成乙個名為
system.map
的檔案,會在
/usr/src/linux-2.6.36.2/arch/x86/boot/
下生成乙個
bzimage
檔案。③編譯模組(
結果檔案會放到
/lib
目錄下)
make modules
實際上,只要直接執行make命令就會同時編譯核心和模組,模組編譯完成後執行「make modules_install」更新模組和驅動程式。
④拷貝核心檔案到
/boot
下,在終端執行以下命令:
cp /usr/src/linux-2.6.36.2/arch/x86/boot/bzimage/boot/vmlinuz-2.6.36.2
(拷貝核心映象)
cp /usr/src/linux-2.6.36.2/system.map/boot/system.map-2.6.36.2
(拷貝符號表)
⑤建立ramfs
和ramdisk
cd /boot
(進入/boot
目錄)生成
ramfs
:mkinitrd initramfs-2.6.36.2.img 2.6.36.2 生成
ramdisk
:mkinitrd initrd-2.6.36.2.img 2.6.36.2
(注:ramfs
與ramdisk
選乙個就行,下面
grub.conf
檔案裡initrd
對應生成的檔案)
注:這一步可能會提示一些錯誤,不過不影響後面的實驗
~⑥編輯啟動配置檔案
grub 編輯
/boot/grub/grub.conf
。在grub.conf
檔案中,每乙個
title
標籤表示乙個啟動項,仿照第一段
title
的寫法,編寫新核心的啟動項,其中
kernel
和initrd
使用新拷貝過來的
vmlinz
—版本號檔案和
initrd-2.6.36.2.img
檔案。原來的
grub.conf
檔案:default=0
timeout=0
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title fedora (2.6.33.3-85.fc13.i686)
root (hd0,0)
initrd /initramfs-2.6.33.3-85.fc13.i686.img
修改後的
grub.conf
檔案:default=1
timeout=15
splashimage=(hd0,0)/grub/splash.xpm.gz #
hiddenmenu
title fedora (2.6.33.3-85.fc13.i686)
root (hd0,0)
initrd /initramfs-2.6.33.3-85.fc13.i686.img
title fedora(2.6.36.2)
root(hd0,0)
initrd /initramfs-2.6.36.2.img
⑦重新啟動系統,使用新生成的核心。
⑧編寫測試程式
testcall.c
,測試新系統呼叫。
1)新建檔案
testcall.c:
int main() 2)
終端編譯
gcc –o testcall testcall.c 3)
執行./testcall 4)
檢視結果
:終端執行命令
dmesg
,會看到在最後一行輸出
call number is 100
linux核心之系統呼叫
應用程式與系統呼叫 使用者應用程式訪問並使用核心所提供的各種服務的途徑,就是系統呼叫,系統呼叫介面層作為核心和使用者應用程式之間的中間層,扮演了乙個橋梁,系統呼叫把應用程式的請求傳達給核心,核心處理完後,把結果返回給應用程式。應用程式通過作業系統提供的應用程式設計介面api而不是直接通過系統呼叫來程...
Linux核心之系統呼叫
linux核心之系統呼叫 1.應用程式通過api而不是直接呼叫系統呼叫來程式設計 2.getpid 系統呼叫示例 asmlinkage long sys getpid void asmlinkage 編譯器僅從棧中提取引數 系統呼叫的命名規則 sys syscallname 3.每個系統呼叫都對應乙...
Linux核心之系統呼叫
1.應用程式通過api而不是直接呼叫系統呼叫來程式設計 2.getpid 系統呼叫示例 asmlinkage long sys getpid void asmlinkage 編譯器僅從棧中提取引數 系統呼叫的命名規則 sys syscallname 3.每個系統呼叫都對應乙個唯一的系統呼叫號,如果系...