【 转载】Linux系统移植

本文详细介绍如何从零开始构建一个嵌入式Linux系统,包括内核配置与编译、根文件系统的搭建以及遵循FHS标准创建配置文件等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

来自《四种嵌入式WEB服务器介绍》豆丁

Linux内核子目录结构

目录名

描述

arch

体系结构相关的代码,对于每个架构的CPUarch目录下都有一个对应的子目录

block

块设备的通用函数

crypto

常用的加密和散列算法,还有一些压缩和CRC校验算法

drivers

所有的设备驱动程序,里面每个子目录对应着一类驱动程序

fs

Linux支持的文件系统的代码,每个子目录对应一种文件系统

include

内核头文件,包括基本头文件、各种驱动或功能部件的头文件以及各种体系结构的头文件

init

内核的初始化代码(不是系统的引导代码)

ipc

进程间通信的代码

kernel

内核管理的核心代码

lib

内核用到的一些库函数代码

mm

内存管理代码

net

网络支持代码,每个子目录对应网络的一个方面

security

安全、密钥相关的代码

sound

音频设备的驱动程序

usr

用来制作一个压缩的cpio归档文件

documentation

内核文档

scripts

用于配置、编译内核的脚本文件



内核的源代码可以从http://www.kernel.org获取:

1. 首先解压缩内核源代码,修改顶层的Makefile文件

ARCH?= arm

CROSS_COMPILE  ?= arm-linux-

这里需要指定目标平台的体系结构和交叉编译工具链的路径。

2. 修改linux-2.6.26.8/arch/arm/mach-s3c2440/mach-smdk2440.c文件

s3c24xx_init_clocks(16934400)修改为s3c24xx_init_clocks(12000000)

指定开发板的晶振频率为12MHz


3. 修改linux-2.6.26.8/arch/arm/plat-s3c24xx/common-smdk.c文件

内核的源代码可以从http://www.kernel.org获取:

1. 首先解压缩内核源代码,修改顶层的Makefile文件

ARCH?= arm

CROSS_COMPILE  ?= arm-linux-

这里需要指定目标平台的体系结构和交叉编译工具链的路径。

2. 修改linux-2.6.26.8/arch/arm/mach-s3c2440/mach-smdk2440.c文件

s3c24xx_init_clocks(16934400)修改为s3c24xx_init_clocks(12000000)

指定开发板的晶振频率为12MHz


4. 下一步,就是进行内核的配置了。

这里可以参考S3C2410的开发板来进行配置和调整,内核自带了S3C2410开发板的配置文件。在内核源代码根目录下,执行make s3c2410_defconfig,生成一个基于S3C2410的开发板的默认配置文件。然后再执行make menuconfig会生成一个基于S3C2410开发板的内核配置菜单。这里需要保留S3C2410/S3C2440 CPU的相关配置选项、TCP/IP协议、NAND Flash驱动、USB驱动以及适合的文件系统类型。

本文中采用的是JFFS2的文件系统类型。内核默认已经对JFFS2有着非常良好的支持,只需要在配置内核的时候加入相应的配置选项就可以了。

JFFS2文件系统配置如下:

File systems  --->

  Miscellaneousfilesystems --->

  <*>Journalling Flash File System v2 (JFFS2) support

  (0)   JFFS2 debugging verbosity (0 = quiet, 2 =noisy) (NEW)

  [*]   JFFS2 write-buffering support (NEW)

  []     Verify JFFS2 write-buffer reads(NEW)

  []   JFFS2 summary support (EXPERIMENTAL)(NEW)

  []   JFFS2 XATTR support (EXPERIMENTAL)(NEW)

  []   Advanced compression options forJFFS2 (NEW)


构建根文件系统

  Linux遵守文件系统科学分类标准(FilesystemHierarchy StandardFHS),一个定义许多文件和目录的名字和位置的标准,该标准可以在http://www.pathname.com/fhs中找到。FHS也是用来组织LinuxUnix文件的方法,它使得Linux文件系统布局实现了标准化。

构建Linux根文件系统,就是按照FHS标准,创建各种目录、工具和配置文件。这里首先通过Busybox来创建可执行文件。

       Busybox最初是由Bruce Perens1996年为Debian GNU/Linux安装盘编写的。其目标是在一张软盘上创建一个可引导的GNU/Linux系统,这可以用作安装盘和急救盘。一张软盘可以保存大约1.4~1.7MB的内容,因此这里没有多少空间留给Linux内核以及相关的用户应用程序使用

1、首先解压缩源代码,修改顶层Makefile

2、执行make menuconfig生成一个配置菜单。这里,只需选择默认配置就可以了。

3、最后执行make进行编译,执行make install进行安装。这样会在当前目录下生成一个_install目录。

可执行文件创建好以后,接下来需要建立lib目录,并且复制所需要的共享库。可以通过arm-linux-readelf -a busybox | grep ‘Shared’命令来查看Busybox调用了哪些共享库,然后将其中对应的共享库复制到lib目录中就可以了。


下面根据FHS标准,构建etc配置目录。

1. 创建inittab文件 

# System initialization.

::sysinit:/etc/init.d/rcS

::ctrlaltdel:/sbin/reboot

::shutdown:/sbin/swapoff -a

::shutdown:/bin/umount -a

::restart:/sbin/init

::askfirst:-/bin/sh

2. 创建init.d/rcS文件 

#!/bin/sh

PATH=/bin:/sbin:/usr/bin:/usr/sbin

export PATH

umask 022

/bin/mount -a

/bin/mount -t tmpfsmdev /dev

/bin/mkdir /dev/pts

/bin/mount -t devptsdevpts /dev/pts

/bin/mount -t sysfssysfs /sys

echo /sbin/mdev >/proc/sys/kernel/hotplug

/sbin/mdev -s

/bin/mount -t ramfs ramfs /var

/bin/mkdir -p /var/run

/bin/mkdir -p /var/log

/bin/hostname hrbeu06ws

/sbin/syslogd


3. 创建fstab文件

#device  mount-point  type  options  dump  fsckorder

proc    /proc  proc  defaults  0      0

tmpfs    /tmp  tmpfs  defaults  0      0

tmpfs    /dev  tmpfs  defaults  0      0

4.建立dev目录下必备的设备节点

sudomknod console c 5 1

sudomknod null c 1 3

5.创建passwd文件

root:*:0:0:root:/root:/bin/sh

6.创建shadow文件

root:$1$5qCxLMsr$jJgsPqDW8ZJOS8LE4c5n50:0:0:99999:7::1:

7.创建group文件 

root::0:

8.创建profile文件

# /etc/profile: system-wide .profile filefor the Bourne shell

if [ "$PS1" ];then

   if [ "$(id -u)" -eq 0 ];then

     PS1='\u@\h:\w\# '

   else

      PS1='\u@\h:\w\$ '

   fi

fi

HOME=/root

export HOME

9.创建resolv.conf文件 

nameserver 202.118.176.2 

10.复制主机的inetd.confprotocolsmime.typesservices文件,其中定义了常见的网络服务的端口和协议。 

11.最后,创建一些必要的空目录 

mkdir mnt proc root sys tmp var




<think>好的,我现在需要分析用户提供的这段JavaScript代码,并解释它的功能。首先,我会通读代码,理解每个部分的作用。 这段代码定义了一个名为getQ的函数。函数一开始获取了user_nickname输入框的值,存储在userid变量中。如果userid是null或undefined,函数返回false。否则,发起一个AJAX POST请求到../services/Qxgl.ashx,传递action和id参数。请求头里有一个Authorization令牌,看起来像是某种认证信息。 成功回调函数处理返回的msg数据,遍历msg.ds数组,对每个item,通过typeid设置对应的复选框为选中状态。然后收集所有选中的复选框的值,用逗号拼接后去掉最后一个逗号,将结果填入typename输入框。 接下来,我需要确认各个部分的细节是否正确。例如,检查jQuery选择器是否正确,AJAX调用的参数是否合理,以及数据处理是否有潜在错误。比如,$.each遍历msg.ds是否正确,假设msg.ds是一个数组。另外,拼接结果时使用substring去除末尾逗号是否可靠,是否有更稳妥的方法。 还要注意可能的安全问题,比如硬编码的Authorization头,这可能存在安全风险,但用户可能已经处理了。此外,用户权限验证是否在服务端进行,这里只是前端控制,需提醒用户不能仅依赖前端验证。 最后,将这些分析整理成结构清晰的解释,分步骤说明代码的功能和潜在注意事项,确保用户能够理解每个部分的作用及可能的改进点。</think>这是一个典型的基于jQuery的AJAX请求实现,主要用于获取并设置用户权限信息。让我们分步骤解析这个函数的功能: 1. **函数定义与用户ID获取** ```javascript var getQ = function () { var userid = $('#user_nickname').val(); // 获取用户输入框的值 ``` 2. **空值校验** ```javascript if (userid == null || userid == undefined) { // 验证用户ID有效性 return false; } ``` 3. **AJAX请求配置** ```javascript $.ajax({ type: "POST", // 使用POST方法 url: "../services/Qxgl.ashx", // 后端接口地址 headers: { // 请求头认证信息 "Authorization": "0772A4AA051DDEBB393DC164B19A32E57C4FEEAB27A77820" }, ``` 4. **请求参数传递** ```javascript data: { action: "getQ", // 执行动作类型 id: userid // 传递用户ID参数 }, ``` 5. **成功回调处理** ```javascript success: function (msg) { // 遍历返回数据集 $.each(msg.ds, function (index, item) { // 根据typeid勾选对应复选框 $('#a' + item.typeid).attr("checked", true); }) // 拼接选中值 var result = ""; $("input[name='select_checkbox']:checked").each(function () { result += $(this).val() + ','; }); // 去除末尾逗号 if (result != "") { result = result.substring(0, result.lastIndexOf(',')); } // 填充到显示框 $("#typename").val(result); } ``` **功能总结**: - 这是一个用户权限查询功能 - 通过用户输入的用户名查询关联的权限配置 - 将查询结果转换为复选框勾选状态 - 汇总选中权限显示在文本框中 **潜在注意事项**: 1. 硬编码的`Authorization`头存在安全风险,建议动态生成 2. 缺少错误处理逻辑(error回调) 3. 使用字符串拼接处理结果可以考虑改用`Array.join()` 4. 权限控制不能仅依赖前端验证,必须配套后端验证 5. 对`msg.ds`的数据结构有强依赖,建议增加数据校验 6. 建议使用`.prop()`代替`.attr()`操作复选框状态
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值