修改內核源碼
『壹』 linux內核源碼如何編譯Ubuntu源代碼在哪裡呢
編譯linux內核步驟:
1、安裝內核
如果內核已經安裝(/usr/src/目錄有linux子目錄),跳過。如果沒有安裝,在光碟機中放入linux安裝光碟,找到kernel-source-2.xx.xx.rpm文件(xx代表數字,表示內核的版本號),比如RedHat linux的RPMS目錄是/RedHat/RPMS/目錄,然後使用命令rpm -ivh kernel-source-2.xx.xx.rpm安裝內核。如果沒有安裝盤,可以去各linux廠家站點或者www.kernel.org下載。
2、清除從前編譯內核時殘留的.o 文件和不必要的關聯
cd /usr/src/linux
make mrproper
3、配置內核,修改相關參數,請參考其他資料
在圖形界面下,make xconfig;字元界面下,make menuconfig。在內核配置菜單中正確設置個內核選項,保存退出
4、正確設置關聯文件
make dep
5、編譯內核
對於大內核(比如需要SCSI支持),make bzImage
對於小內核,make zImage
6、編譯模塊
make moles
7、安裝模塊
make moles_install
8、使用新內核
把/usr/src/linux/arch/i386/boot/目錄內新生成的內核文件bzImage/zImage拷貝到/boot目錄,然後修改/etc/lilo.conf文件,加一個啟動選項,使用新內核bzImage/zImage啟動。格式如下:
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
linear
default=linux-new ### 告訴lilo預設使用新內核啟動linux ###
append="mem=256M"
image=/boot/vmlinuz-2.2.14-5.0
label=linux
read-only
root=/dev/hda5
image=/boot/bzImage(zImage)
label=linux-new
read-only
root=/dev/hda5
保留舊有的啟動選項可以保證新內核不能引導的情況,還可以進入linux進行其他操作。保存退出後,不要忘記了最重要的一步,運行/sbin/lilo,使修改生效。
9、重新生成ram磁碟
如果您的系統中的/etc/lilo.conf沒有使用了ram磁碟選項initrd,略過。如果您的系統中的/etc/lilo.conf使用了ram磁碟選項initrd,使用mkinitrd initrd-內核版本號,內核版本號命令重新生成ram磁碟文件,例如我的Redhat 6.2:
mkinitrd initrd-2.2.14-5.0 2.2.14-5.0
之後把/etc/lilo.conf中的initrd指向新生成的initrd-2.2.14-5.0文件:
initrd=/boot/initrd-2.2.14-5.0
ram磁碟能使系統性能盡可能的優化,具體參考/usr/src/linux/Documents/initrd.txt文件
10、重新啟動,OK!
『貳』 ARM Linux的內核源代碼怎麼弄
linux的內核源碼要去網上下載,系統里的是編譯過的。如果你C語言很過硬的話可以去研究研究,對於你的益處很大,做ARM開發不用看內核,除非做底層驅動開發的話會需要看一些函數是怎麼實現和調用的。
至於u-boot的話你要先把shell編程看一下,不然你看不懂的,那個對於你理解arm板子上的linux系統是怎麼啟動的有一定幫助,其實在真正開發過程中作用不大。
給嵌入式板子載入linux系統就需要源碼進行編譯,編譯成鏡像然後下載到flash里
『叄』 Linux內核源碼如何編譯
首先uname
-r看一下你當前的linux內核版本
1、linux的源碼是在/usr/src這個目錄下,此目錄有你電腦上各個版本的linux內核源代碼,用uname
-r命令可以查看你當前使用的是哪套內核,你把你下載的內核源碼也保存到這個目錄之下。
2、配置內核
make
menuconfig,根據你的需要來進行選擇,設置完保存之後會在當前目錄下生成.config配置文件,以後的編譯會根據這個來有選擇的編譯。
3、編譯,依次執行make、make
bzImage、make
moles、make
moles
4、安裝,make
install
5、.創建系統啟動映像,到
/boot
目錄下,執行
mkinitramfs
-o
initrd.img-2.6.36
2.6.36
6、修改啟動項,因為你在啟動的時候會出現多個內核供你選擇,此事要選擇你剛編譯的那個版本,如果你的電腦沒有等待時間,就會進入默認的,默認的那個取決於
/boot/grub/grub.cfg
文件的設置,找到if
[
"${linux_gfx_mode}"
!=
"text"
]這行,他的第一個就是你默認啟動的那個內核,如果你剛編譯的內核是在下面,就把代表這個內核的幾行代碼移到第一位如:
menuentry
'Ubuntu,
with
Linux
3.2.0-35-generic'
--class
ubuntu
--class
gnu-linux
--class
gnu
--class
os
{
recordfail
gfxmode
$linux_gfx_mode
insmod
gzio
insmod
part_msdos
insmod
ext2
set
root='(hd0,msdos1)'
search
--no-floppy
--fs-uuid
--set=root
9961c170-2566-41ac-8155-18f231c1bea5
linux/boot/vmlinuz-3.2.0-35-generic
root=UUID=9961c170-2566-41ac-8155-18f231c1bea5
ro
quiet
splash
$vt_handoff
initrd/boot/initrd.img-3.2.0-35-generic
}
當然你也可以修改
set
default="0"來決定用哪個,看看你的內核在第幾位,default就填幾,不過我用過這種方法,貌似不好用。
重啟過後你編譯的內核源碼就成功地運行了,如果出現問題,比如滑鼠不能用,usb不識別等問題就好好查查你的make
menuconfig這一步,改好後就萬事ok了。
最後再用uname
-r看看你的linux內核版本。是不是你剛下的那個呢!有沒有成就感?
打字不易,如滿意,望採納。
『肆』 lbochs運行Win11
、下載Linux0.11系統包,本鏈接的下載包已包含Bochs軟體。
點擊打開鏈接http://oldlinux.org/Linux.old/bochs/linux-0.11-devel-040329.zip
2、解壓linux-0.11-devel-040329.zip,目錄結構如下圖所示:
這里真正使用到的文件為:Bochs-2.1.1.exe 、bochsrc-hd.bxrc、bootimage-0.11、bootimage-0.11-hd、hdc-0.11.img
3、點擊Bochs-2.1.1.exe進行安裝。
4、安裝完畢後,將所有linux-0.11-devel-040329下的文件,拷貝到剛才安裝bochs下的根目錄。原目錄如下:
拷貝過後目錄為:
5、拷貝完成後,運行bochsrc-hd.bxrc,若安裝成功,打開即能見到如下界面:
這已經是x86PC模擬器上,搭建完成的Linux操作系統。建立linux操作平台命令,就能操作Linux。由於學習操作系統需要,我們需要在Linux下,編譯操作系統以及完成簡單的源碼修改,從而達到理解Linux內核的能力。接下來,主要演示Linux內核源碼的修改,以及內核的編譯過程。由於該Linux版本的原因,我們還需要對代碼做出調整,方能成功編譯。
內核編譯過程:
1、進入/usr/src/linux 目錄下,鍵入命令 cd ../src/linux ,如下圖所示:
2、進行編譯,鍵入命令 make clean 和 make後。
若出現如下所示錯誤:gcc-cc1: Invalid option "string-insns"。這是需將Linux目錄下的Makefile文件中的-mstring-insns參數去掉。除此之外,每個子目錄fs,lib,kernel以及kernel目錄下的三個驅動程序子目錄(math, blk_drv, chr_drv)的Makefike當中的-mstring-insns參數去除掉。此處只演示根目錄下的Makefile文件修改。
3、依次修改:/linux/Makefile、/linux/fs/Makefile、/linux/lib/Makefile、
/linux/kernel/Makefile、/linux/kernel/math/Makefile、/linux/kernel/blk_drv/Makefile、/linux/kernel/chr_drv/Makefile文件。linux目錄下,鍵入:vi Makefile。如下圖所示:
找到文件中的-mstring-insns 參數,並刪去保存。
4、到/usr/local/bin中找到文件ar,並把ar 改名為gar,鍵入命令:mv ar gar。如下圖所示:
5、回到linux 目錄下,重新鍵入make clean以及 make,完成內核的編譯鏈接。
出現上圖提示,即表面程序編譯成功。完成編譯後,便可以開始修改內核源碼,從而達到擴展操作系統功能以及學習操作系統的目的。這里,我們簡單修改下,linux操作系統開機啟動項bootsect.s源碼,讓開機後輸出個性化的字元串。
6、進入/usr/src/linux/boot目錄,修改bootsect.s源碼,保存並退出。
! Print some inane message
mov ah,#0x03 ! read cursor pos
xor bh,bh
int 0x10
mov cx,#47
mov bx,#0x0007 ! page 0, attribute 7 (normal)
mov bp,#msg1
mov ax,#0x1301 ! write string, move cursor
int 0x10
msg1:
.byte 13,10
.ascii "Loading system ...this is create by demon"
.byte 13,10,13,10
.org 508
7、修改完成後,在linux目錄下,重新鍵入make命令,完成編譯。
8、make成功後生成引導啟動映象文件Image。若需要輸出這個Image文件, 可以首先備份bootimage-0.11-hd文件, 然後使用下面命令就會把bootimage-0.11-hd替換成新的引導啟動文件,鍵入命令:dd bs=8192 if=Image of=/dev/fd0。如下圖所示:
9點擊reset重啟Linux操作系統。如下圖所示:
『伍』 怎麼在ubuntu上編個程序完成系統調用並修改一下內核
你可以修改內核源代碼,比如添加個系統調用:
kernel/sys.c:
SYSCALL_DEFINE0(hello){
printk(KERN_EMERG"hello ");
return123456;
}
然後再注冊一下:
include/linux/syscalls.h:
asmlinkagelongsys_hello(void);
arch/x86/syscalls/syscall_64.tbl:
102564hellosys_hello
編譯下內核,安裝並重新啟動就可以使用這個系統調用了:(用syscall()或者嵌入匯編都可以)
#include<stdio.h>
intmain(){
//inta=syscall(1025);
longa=97;
asm(
"movq$0x0401,%%rax "
"syscall "
"movq%%rax,%0 "
:"=r"(a)
);
printf("%d ",a);
return0;
}
(以上代碼在內核版本3.12.5 x86_64上通過)
『陸』 如何配置bc網站源碼搭建sysctl.conf文件修改內核參數
BC這類配置跟普通建站配置基本一致。搭建看名飛機來交流建站開發。配置sysctl這類文件內核參數一般都是linux伺服器運行狀態下可以進行修改的。在伺服器重啟會失效。有以下方法修改:
1.直接修改內核參數ip_forward對應在/proc下的文件/proc/sys/net/ipv4/ip_forward。用下面命令查看ip_forward文件內容:# cat /proc/sys/net/ipv4/ip_forward
該文件默認值0是禁止ip轉發,修改為1即開啟ip轉發功能。
2.通過/etc/sysctl.conf文件可以永久生效修改後的內核參數。
sysctl -p
該命令可以立即生效sysctl.conf中配置的內核參數。
kernel.shmall
shmall表示共享內存總量,以頁為單位, 而shmall默認為4294967296 已經足夠大了,一般不需要調整,shmall不能低於SGA大小,若shmall低於SGA大小,實例啟動時會報:ORA-27123: unable to attach to shared memory segment錯誤,且無法啟動實例。
kernel.shmmax
shmmax參數用來定義單個共享內存段的最大值,該值應該配置足夠大,能夠在一個共享內存段中容下整個的SGA ,如果配置過低可能導致需要創建多個共享內存段,這樣可能會導致系統性能下降。
269838450688/1024/1024/1024=252GB。
shmmax的單位為Byte(位元組)。
vm.min_free_kbytes
該參數表示Linux VM最低保留多少的空閑內存空間,當可用的內存低於配置參數時,系統會進行cache內存的回收,來進行內存的釋放。
單位是kb,524288/1024=512M。
kernel.sem
sem是semaphores的縮寫,進程間通信--信號量,kernel.sem中4個參數分別對應SEMMSL SEMMNS SEMOPM SEMMNI
SEMMSL: 每個信號集的最大信號數量 ,一般該參數配置為資料庫中最大 PROCESS 參數的設置值加上 10,Oracle 建議 SEMMSL 不低於100。
SEMMNS:控制整個系統中信號量的最大數量,使用以下計算公式來確定系統中需要配置的信號的最大數量,(SEMMSL * SEMMNI)=SEMMNS。4096*128=524288。
SEMOPM: 該參數表示在一個 semop call中,每個信號量所允許的最大操作數量,一個信號集可以擁有每個信號集當中的最大數量SEMMSL 信號,建議 SEMOPM 等於SEMMSL 。 Oracle 建議SEMOPM的值不低於 100 。
SEMMNI:該參數用於控制整個系統中信號集的最大數量。Oracle 建議SEMMNI 的值不低於 100 。
fs.file-max
該參數表示系統級別最大可以打開文件句柄的數量,文件句柄代表系統中可以打開文件的數量。
net.ipv4.ip_local_port_range
該參數配置向外連接埠范圍,預設為1024到4999。
net.ipv4.ipfrag_*
net.ipv4.ipfrag_low_thresh
net.ipv4.ipfrag_high_thresh
系統中當數據包傳輸發生錯誤,會進行碎片整理,有效的數據包被保留,而無效的數據包被丟棄,ipfrag參數指定了碎片整理時的最大/最小內存。
net.core.rmem_*
net.core.rmem_default默認數據接收窗口大小。
net.core.rmem_max最大數據接收窗口大小。
net.core.wmem_default默認數據發送窗口大小。
net.core.wmem_max最大數據發送窗口大小。
單位均為位元組。
fs.aio-max-nr
該參數表示最大並發非同步I/O請求數量,當系統中存在非常高的I/O請求時,如果該參數配置過低,可能導致資料庫報ORA-27090 - Unable to Reserve Kernel Resources for Asynchronous Disk I/O錯誤,遇到該問題需將fs.aio-max-nr調整為Oracle建議值3145728。
註:Doc ID 579108.1
kernel.shmmni
該參數為共享內存段的最大數量,預設值為4096 ,一般情況下無需調整。
vm.nr_hugepages
該參數指定採用大頁內存,大頁內存數量,單位為個數。 作者:D-Cycle https://www.bilibili.com/read/cv18496552/ 出處:bilibili
『柒』 如何重新編譯修改後的Linux內核源代碼
Perl code?
make menuconfig
make all
make install
make moles_install
make firmware_install
『捌』 什麼是內核源碼 求普及
很多cpu有兩種運行方式,一種叫裸奔,直接運行程序,比如最早的手機運行
還有一種要載入操作系統,比如Linux、Windows這種,然後再在操作系統上運行程序,讓操作系統完成運行程序的維護、調度等工作。載入操作系統時,需要將操作系統必須載入部分讀入內存運行,這部分就叫做內核,是操作系統的內部核心,有這部分引導入內存後,才能繼續載入操作系統其餘部分和運行程序。
以上說明的內核的源代碼,即內核源碼,通過源碼可以用編譯器生成經過你裁剪、修改過的操作系統內核,從而形成對操作系統的定製。
『玖』 如何修改linux內核源碼並調試
內核源碼調試的一款工具QEMU. 仔細研究一下,慢慢學吧。
『拾』 LINUX怎麼修改內核文件
我理解的修改順序如下
1,下載內核源碼
2,修改源碼文件
3,重新編譯源碼生成新的內核