修改内核源码
‘壹’ 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,重新编译源码生成新的内核