书接上文,我们上两篇在讲建立最小Linux系统时要创建的几个脚本,接下来我们继续说一下
建立最小系统之创建文件系统所需文件(续)
之后我们返回etc目录,再返回system目录,接着使用“cd lib”命令进入到lib 目录
因为使用的交叉编译环境和编译内核的相同,所以编译器是/usr/local/arm/arm-2009q3,
Busybox 编译生成的二进制文件以动态链接库的形式运行,所以需要拷贝编译器里面的库文
件到lib 目录,使用下面的命令:
“cp /usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib/* ./”
【注释:
关于交叉编译
交叉编译器就是一个压缩包,它里面有个bin文件夹,这个文件夹有一个arm-xxx-gcc,
是个可执行程序,一般编译程序我们就是用这个,然后在这个文件夹里arm-xxx-gcc -v可以查看这个编译器的版本,其实交叉编译器就和ubuntu里的gcc用法一样,只不过它编译出来的程序是跑在开发板上的而已。
一般我们对这个交叉编译器就是,找个目录放压缩包,解压,然后找到压缩包里的bin目录,复制这个路径,将这个路径添加到环境变量
然后以后我们编译要运行在开发板上的程序的时候,就用arm-xxx-gcc来编译~
编译内核源码也是类似的,就是修改makefile里的编译器路径,将交叉编译的路径复制到makefile里,再编译~ 这样就是所谓的编译程序和编译内核的交叉编译器一致了(在内核源码的根目录下,有一个名为 Makefile
(或者 Makefile
系列文件)的文件,它包含了编译内核的规则和指令。你可以在这个文件中找到编译器的路径、编译选项等设置。)
动态链接库
在程序执行时,如果它需要调用动态链接库中的函数或使用其中的数据,操作系统会动态地将该库加载到内存中,并且将程序中对库函数的调用映射到实际的库代码。这样,多个程序可以共享同一个动态链接库的实例,从而减少了内存的占用。
和静态链接库对比:
动态链接库:在程序执行时,动态链接库被加载到内存中,并在需要时动态链接到程序中。这意味着动态链接库在运行时被加载,可以与多个程序共享,并且可以通过更新单个库文件来更新所有依赖它的程序。
静态链接库:在程序编译时,静态链接库的代码和数据被静态地嵌入到可执行文件中。这意味着程序在运行之前就已经包含了所有依赖的库函数,因此它们独立于外部的库文件。
通常情况下,动态链接库存放在系统指定的目录中,例如 /lib
或 /usr/lib
】
之后返回到system 目录,使用“cd var”命令进入到var 目录,使用“mkdir lib lock log run tmp”命令在var 目录下建立lib,lock,log,run,tmp 五个目录,至此,文件系统所需要的文件都已经创建好了
建立最小系统之安装打包软件make_ext4fs
为了方便开发板能读懂,make_ext4fs可以将我们建立好的文件系统制作成二进制文件(即一个ext4文件系统镜像文件),我们将对应的压缩包拷贝到根目录下,之后解压,安装好make_ext4fs后,进入目录“/home/minilinux/”,使用命令
“make_ext4fs -s -l 314572800 -a root -L linux system.img system”生成system.img
文件系统镜像(文件系统镜像文件就是一个“大包裹”,把整个文件系统都打包起来,方便存储、备份、部署和使用)
现在已经完成了linux 文件系统的制作,可以烧写到开发板上了(作者本人用的是iTOP-4412),完结撒花!
helloworld程序
学习目的:学习一下应用程序如何编译、如何运行、如何修改权限等等实际操作
首先我们要在windows用Notepad++编辑一个helloworld的c文件(如果可以的话,可以自行在ubuntu下载一个vs),之后将这个c文件通过共享文件夹或者其他方式拖进ubuntu里
我们需要一个文件夹来存放一些源码和程序,所以要新建linuxsystemcode目录,之后去建立目录“helloworld”,进入到目录“helloworld”,将刚刚写的c文件拷贝在这里,之后使用命令“vi helloworld.c”或者“vim helloworld.c”命令
helloworld程序之编译方法
使用“cd”命令回到根目录,然后使用命令“vim .bashrc”打开环境变量文件,查看最低行是不是和编译内核用的编译器一样
之后回到helloword目录里,使用命令
“arm-none-linux-gnueabi-gcc -o helloworld helloworld.c -static”
【注释:arm-none-linux-gnueabi-gcc是编译器的名称
"-o" 选项后面跟着要生成的可执行文件的名称,这个选项指定生成的可执行文件的名称为 "helloworld"
helloworld.c是要编译的 C 语言源文件的名称
-static这个选项指示编译器生成的可执行文件应该是静态链接的,即将所有依赖的库文件都嵌入到可执行文件中,而不是在运行时动态加载,这意味着生成的可执行文件不依赖于目标系统上的动态链接库,可以在没有这些库的系统上运行】
之后编译成功,生成“helloworld”文件。
helloworld程序之修改权限和运行-U 盘
先将可执行文件helloworld 拷贝到U 盘,根据经验可以知道,用于挂载外部设备如U盘等的目录是"/mnt/udisk"目录,我们启动开发板后,如果文件系统第一次启动的时候没有/mnt/udisk 目录,使用命令“mkdir /mnt/udisk”新建。
插入u 盘的时候,被识别为sda1,使用命令“mount /dev/sda1 /mnt/udisk”加载u 盘,这个时候可以直接对U盘进行操作,我们使用命令“chmod 777 /mnt/udisk/helloworld”修改c文件的权限
然后使用命令“./mnt/udisk/helloworld”运行helloworld 程序,会出现打印信息
helloworld程序之修改权限和运行-TF 卡
启动开发板,插入TF卡之后可以看见TF卡的设备节点“mmcblk1:p1”,之后使用命令“mkdir /mnt/udisk1”新建/mnt/udisk1 目录,使用命令“mount /dev/mmcblk1p1 /mnt/udisk1”加载tf 卡,之后使用命令“ls /mnt/udisk1/”可以查看到helloworld 可执行程序。
使用命令“./mnt/udisk1/helloworld”运行helloworld,打印出了HelloWorld!。
将helloworld 编译进文件系统
使用这种方式就可以不用U 盘或者TF 卡来拷贝程序了。
用cp 命令将编译好的helloworld 程序移动到system 下的bin 目录,然后编译system,然后将重新烧写一下“system.img”文件系统,之后修改权限,运行/bin目录下的helloworld可执行文件
linux 用户、用户组、权限
在Linux 中,超级用户称为root。root 用户可以控制所有的程序,访问所有文件,使用系
统上的所有功能。对root 用户来说没有不可以做的事情。就管理的角度而言,root 的权限是
至高无上的。
在虚拟机的Ubuntu 系统下,使用命令“su root”,然后输入密码即可登录“root”用户
创建/删除用户
可以通过useradd 命令来创建新用户,使用命令“ useradd xunwei”添加用户xunwei,然后使用命令“cat/etc/passwd”,将 "/etc/passwd" 文件的内容打印到终端上后,在/etc/passwd 下可以看到/home/xunwei 用户
使用“userdel xunwei”命令可以删除用户xunwei
【注释:"/etc/passwd" 是一个文本文件,用于存储系统用户的基本信息。这个文件的格式是以冒号 ":" 分隔字段的文本文件,每行对应一个用户的信息】
Linux 用户的组织
在linux 中,所有的用户都存在于“/etc/passwd”中,可以使用命令“more/etc/passwd”去查看
如
第一列是用户名;第二列是用户的密码;第三列是用户的数字ID;第四列是用户的主组的
ID;第五列是用户的全名或者是注释;第六列是用户主目录的位置,这个目录通常位于/home
目录下,目录名与用户ID 相同;第七列是用户的默认控制台shell。
上面第二列的x,并不代表密码就是x,这里只是隐藏了,另外只有超级用户可以修改其它
用户的密码。
Linux 组
Linux中可以创建一个组,然后将成员添加到这个组的列表中,可以以组为单位来分配资源。隶属于同一个组的成员可以访问同一资源。
可以使用控制台命令groupadd 创建组,之后用命令“cat /etc/group”查看,可以看见新建的组
第一列是组的名字,第二列是一个密码(这里的x不是真正的密码),第三列是组的一个数字索引,在第三列之后将是以逗号隔开的组的成员的用户ID
【未完待续】