中断
引入缓冲的主要原因包括:
所以采用缓冲技术,可减少对CPU的中断次数,从而提高系统效率。
execve、open、read…
使用strace ls命令我们可以查看ls命令使用到的系统调用
jw@pc:~/w$ strace ls .
execve("/bin/ls", ["ls", "."], 0x7ffd4c677808 /* 63 vars */) = 0
brk(NULL) = 0x55e5088c7000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {
st_mode=S_IFREG|0644, st_size=74466, ...}) = 0
mmap(NULL, 74466, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fc619ef9000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20b\0\0\0\0\0\0"..., 832) = 832
fstat(3, {
st_mode=S_IFREG|0644, st_size=154832, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc619ef7000
mmap(NULL, 2259152, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fc619abd000
mprotect(0x7fc619ae2000, 2093056, PROT_NONE) = 0
mmap(0x7fc619ce1000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x24000) = 0x7fc619ce1000
mmap(0x7fc619ce3000, 6352, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fc619ce3000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260\34\2\0\0\0\0\0"..., 832) = 832
fstat(3, {
st_mode=S_IFREG|0755, st_size=2030544, ...}) = 0
mmap(NULL, 4131552, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fc6196cc000
mprotect(0x7fc6198b3000, 2097152, PROT_NONE) = 0
mmap(0x7fc619ab3000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e7000) = 0x7fc619ab3000
mmap(0x7fc619ab9000, 15072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fc619ab9000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpcre.so.3", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 \25\0\0\0\0\0\0"..., 832) = 832
fstat(3, {
st_mode=S_IFREG|0644, st_size=464824, ...}) = 0
mmap(NULL, 2560264, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fc61945a000
mprotect(0x7fc6194ca000, 2097152, PROT_NONE) = 0
mmap(0x7fc6196ca000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x70000) = 0x7fc6196ca000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\16\0\0\0\0\0\0"..., 832) = 832
fstat(3, {
st_mode=S_IFREG|0644, st_size=14560, ...}) = 0
mmap(NULL, 2109712, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fc619256000
mprotect(0x7fc619259000, 2093056, PROT_NONE) = 0
mmap(0x7fc619458000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7fc619458000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000b\0\0\0\0\0\0"..., 832) = 832
fstat(3, {
st_mode=S_IFREG|0755, st_size=144976, ...}) = 0
mmap(NULL, 2221184, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fc619037000
mprotect(0x7fc619051000, 2093056, PROT_NONE) = 0
mmap(0x7fc619250000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x19000) = 0x7fc619250000
mmap(0x7fc619252000, 13440, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fc619252000
close(3) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc619ef5000
arch_prctl(ARCH_SET_FS, 0x7fc619ef6040) = 0
mprotect(0x7fc619ab3000, 16384, PROT_READ) = 0
mprotect(0x7fc619250000, 4096, PROT_READ) = 0
mprotect(0x7fc619458000, 4096, PROT_READ) = 0
mprotect(0x7fc6196ca000, 4096, PROT_READ) = 0
mprotect(0x7fc619ce1000, 4096, PROT_READ) = 0
mprotect(0x55e50876c000, 8192, PROT_READ) = 0
mprotect(0x7fc619f0c000, 4096, PROT_READ) = 0
munmap(0x7fc619ef9000, 74466) = 0
set_tid_address(0x7fc619ef6310) = 8782
set_robust_list(0x7fc619ef6320, 24) = 0
rt_sigaction(SIGRTMIN, {
sa_handler=0x7fc61903ccb0, sa_mask=[], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x7fc619049890}, NULL, 8) = 0
rt_sigaction(SIGRT_1, {
sa_handler=0x7fc61903cd50, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART|SA_SIGINFO, sa_restorer=0x7fc619049890}, NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
prlimit64(0, RLIMIT_STACK, NULL, {
rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
statfs("/sys/fs/selinux", 0x7ffe7cb6d170) = -1 ENOENT (No such file or directory)
statfs("/selinux", 0x7ffe7cb6d170) = -1 ENOENT (No such file or directory)
brk(NULL) = 0x55e5088c7000
brk(0x55e5088e8000) = 0x55e5088e8000
openat(AT_FDCWD, "/proc/filesystems", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {
st_mode=S_IFREG|0444, st_size=0, ...}) = 0
read(3, "nodev\tsysfs\nnodev\ttmpfs\nnodev\tbd"..., 1024) = 369
read(3, "", 1024) = 0
close(3) = 0
access("/etc/selinux/config", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {
st_mode=S_IFREG|0644, st_size=10281936, ...}) = 0
mmap(NULL, 10281936, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fc618668000
close(3) = 0
ioctl(1, TCGETS, {
B38400 opost isig icanon echo ...}) = 0
ioctl(1, TIOCGWINSZ, {
ws_row=28, ws_col=79, ws_xpixel=0, ws_ypixel=0}) = 0
stat(".", {
st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
fstat(3, {
st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
getdents(3, /* 3 entries */, 32768) = 80
getdents(3, /* 0 entries */, 32768) = 0
close(3) = 0
fstat(1, {
st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
write(1, "ls.txt\n", 7ls.txt
) = 7
close(1) = 0
close(2) = 0
exit_group(0) = ?
+++ exited with 0 +++
fork -- exec--...
例如:在shell命令行执行ps命令,实际上是shell进程调用fork复制一个新的子进程,在利用exec系统调用将新产生的子进程完全替换成ps进程。
fork是一个UNIX术语,当fork一个进程(一个运行中的程序)时,基本上是复制了它,并且fork后的两个进程都从当前执行点继续运行,并且每个进程都有自己的内存副本。
原进程是父进程,新进程是子进程。可以通过fork()返回值区分。
父进程中fork调用返回的是新的子进程的pid(process id),而子进程中fork调用返回的是0
我们都要知道,linux系统的第一个用户进程是init,pid=1,后续的进程,都是从init进程fork出来的。
答:嵌入式系统定义:以应用为中心,以计算机技术为基础,其软硬件可裁剪配置,对功能、可靠性、成本、体积、功耗有严格约束的一种专用计算机系统。
嵌入式系统应用:应用于军事设备、信息终端、汽车电子、制造工业、航天航空等领域。
嵌入式系统特点:专用性、可裁性、实时性好、可靠性高、功耗低。
BL0----------------------> BL1 -->BL2-------> Linux kernel --> file system --> application
系统启动RomBoot --> SPL --> u-boot --> Linux kernel --> file system --> start application
bootloader的启动过程:
第一阶段:
① 设置CPU工作模式svc特权模式
② 关闭MMU和cache
③ 关看门狗
④ 屏蔽中断(防止程序跑飞)
⑤ 初始化时钟
⑥ 初始化RAM,为第二阶段做准备(非必须,例如对于NOR Flash可以直接在上面执行)
⑦ 设置栈,第二阶段是C程序
⑧ 拷贝第二阶段到RAM
⑨ 跳转到第二阶段的程序入口
第二阶段:
① 硬件初始化,时钟、串口、网卡、LED灯…
② 检测系统内存映射(memory map)
③ 将内核映像和根文件系统映像从Flash上读到RAM空间中。
④ 为内核设置启动参数。
⑤ 拷贝dtb(设备树)到RAM空间中。
⑥ 启动内核
Cache和MMU的设置
MMU和Cache必须必须关闭,指令Cache可以打开也可以关闭。
由于MMU在上电之初是没有任何作用的,也就是说U-boo第一阶段的汇编代码以及第二阶段的源代码初始化相关外设时访问的都是都是实际地址,MMU起不到任何作用,为了启动之初不影响对程序的启动常关闭MMU。
Cache是位于RAM和CPU内部寄存器之间的一个存储设施,用来加速二者之间的数据传输速度,即用来加快CPU从内存中取出指令的速度。但是在上电后CPU的初始化要比内存RAM更快一步,当CPU初始化完成后,若内存还没有准备好那势必会造成异常。
简单的讲,uboot利用函数指针及传参规范,它将
R0: 0x0
R1: 机器号
R2: 参数地址
三个参数传递给内核。
其中,R2寄存器传递的是一个指针,这个指针指向一个TAG区域。
–w-r–r--
-r-xr–r--
-r—w–w-
-r-x-wx-wx
umask是从权限中“拿走”相应的位,且文件创建时不能赋予执行权限.
创建时,文件 默认666,目录默认777,减去umask的位就是结果。
666-244=422(-r—w–w-)
I. 整数除以零
II. sin( )函数调用
III. read系统调用
用户态切换到内核态的 3 种方式
a. 系统调用
b. 异常
c. 外围设备的中断
所以答案是:
I. 异常
III. 系统调用
错误
考察C语言中int类型的常数的范围。
在16位机器中,int占16位,是两个字节,取值范围为前面所说的-32768~32767(-216~216-1)。此时题中表述是正确的。
在32位和64位机器中,int占32位,即4个字节长度,取值范围为-2147483648~2147483647(-232~232-1)。此时题中表述是错误的。
ISO/ANSI C规定,int类型的最小范围为-32768到32767。因此int类型常数的范围不限于-32768到32767,可以得到题中表述是错误的。
在C++官网中给出的C99标准中的宏定义,int类型的范围为-32767到32767。