PIXNET Logo登入

Horace papa's life

跳到主文

To memory my life, learning , family

部落格全站分類:心情日記

  • 相簿
  • 部落格
  • 留言
  • 名片
  • 3月 31 週四 201113:45
  • 在ubuntu9.10下使用openocd+jlink

所有文件在附件里
确保你已经安装了开发工具
1.使用新立得安装libusb
2.复制45-jlink.rules到/etc/udev/rules.d/下,重新启动
3.添加组plugdev,并且把当前用户添加到这个组里面
sudo groupadd plugdev
sudo usermod -a -G plugdev 用户名
4.解压openocd-0.4.0.tar.bz2
tar jxvf openocd-0.4.0.tar.bz2
5.编译openocd
cd openocd-0.4.0
./configure --prefix=/opt/openocd --enable-jlink
make && make install
6.修改/etc/environment在PATH添加/opt/openocd/bin路径
sudo gedit /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/openocd/bin"
7.拷贝配置文件到开发的目录
cp /opt/openocd/share/openocd/scripts/interface/jlink.cfg ./
cp /opt/openocd/share/openocd/scripts/target/stm32.cfg ./
8.运行openocd
openocd -f jlink.cfg -f stm32.cfg
我到结果如下:
rayfox@ubuntu:~/stm32-devel$ openocd -f jlink.cfg -f stm32.cfg 
Open On-Chip Debugger 0.4.0 (2010-03-30-18:44)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.berlios.de/doc/doxygen/bugs.html
1000 kHz
jtag_nsrst_delay: 100
jtag_ntrst_delay: 100
Info : J-Link initialization started / target CPU reset initiated
Info : J-Link ARM V7 compiled Jun 30 2009 11:05:27
Info : JLink caps 0xb9ff7bbf
Info : JLink hw version 70000
Info : JLink max mem block 9152
Info : Vref = 3.300 TCK = 1 TDI = 0 TDO = 1 TMS = 0 SRST = 0 TRST = 0
Info : J-Link JTAG Interface ready
Info : clock speed 1000 kHz
Info : JTAG tap: stm32.cpu tap/device found: 0x3ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x3)
Info : JTAG tap: stm32.bs tap/device found: 0x16410041 (mfg: 0x020, part: 0x6410, ver: 0x1)
Info : stm32.cpu: hardware has 6 breakpoints, 4 watchpoints
下载后重命名为stm32-dev-linux.tar.bz2后解压ourdev_542394.zip(文件大小:1.79M) (原文件名:stm32-dev-linux.zip) 
(繼續閱讀...)
文章標籤

horace papa 發表在 痞客邦 留言(0) 人氣(217)

  • 個人分類:openjtag
▲top
  • 3月 30 週三 201119:21
  • Debugging the Linux kernel with JTAG


Debugging the Linux kernel with JTAG


Alexander Sirotkin
8/29/2010 1:31 PM EDT

As with many Linux-related topics, the issue of using debuggers to troubleshoot the Linux kernel is not only technical--it's political. Linux is being mostly developed on the x86 platform, which does not have JTAG debugging capabilities, and software-only kernel debuggers are complex and unreliable. Because of this and other reasons, Linus Torvalds objected for a long time to inclusion of the KGDB (Linux kernel debugger) patch in the main Linux tree until Ingo Molnar managed to get a rather slimmed down KGDB variant into the 2.6.26 version. Putting politics aside, I believe that most developers would agree with me, that at least in the embedded world, a kernel debugger is a must-have tool for many tasks, BSP (board support package) development being probably the most obvious example.
Fortunately, compared with the world of x86, embedded platforms introduce not only additional challenges but also a good tool to help us tackle the problem--a JTAG debugger. It's easy to use, reliable, provides some nice features that are not available in software-only debuggers and is free from any controversy that is always associated with invasive Linux kernel patches, such as the original KGDB.
I assume that the topic of JTAG debugging is not new to you--as an experienced embedded systems developer, you have probably used something like Wind River's On-Chip Debugging in the past. I will go very briefly over general JTAG debugging capabilities and show you the peculiarities of Linux kernel debugging using JTAG.
JTAG is your friend
JTAG (Joint Test Action Group) was initially developed as a way to test circuit boards after manufacture, however today it's more commonly used for debugging embedded systems. A JTAG adaptor, sometimes referred to as in-circuit emulator (ICE), is used to access on-chip debug modules inside the target CPU.
It allows, among other things, to halt the CPU, inspect its registers and memory, single step through the code, and define breakpoints. In addition to the hard, you will also need a software debugger that supports it. Some JTAG adapter vendors provide software tools while others rely on open source packages.
Even though most JTAG debuggers nowadays support Linux, if you're shopping for a low-cost device, I suggest you ask whether it supports Linux, which boils down to memory management units (MMU), Linux binary formats, and loadable modules support. If it supports remote GDB (GNU debugger) protocol as well, you can be sure that it's going to work.
Cast of characters
I will use my setup of a FemtoLinux project throughout this article to demonstrate how to debug the Linux kernel on ARM, so it's beneficial to describe the setup first. The aim of this project is to reduce the Linux system's call latency and overhead in order to make it possible to port VxWorks 5.5 monolithic applications to Linux without redesign. As you would imagine, this kind of low-level Linux kernel hacking would be nearly impossible without JTAG.
For development, we use a LPC3250 board by Embedded Artists. It's a very convenient platform based on NXP CPU with ARM926 core. The hardware specs being pretty impressive are of no particular interest in the scope of this article, but what I really like about this board is that it's well thought out and specifically designed for developer's needs. Features such as power over USB combined with USB-to-serial bridge clearly shows that.
Naturally, the board has a 20-pin JTAG interface for debugging and a full Linux support. As USB JTAG adapter, we use the Flyswatter by Tin Can Tool. This is rather basic device, but it too surprised me very positively--before I found it, I had no idea that it was possible to get a fully functional JTAG debugger for less than $100.
I guess that one of the reasons Tin Can Tool were able to introduce this low-cost device is that they didn't invest in the debugging software at all, relying instead on open source software packages OpenOCD and GDB, which leads us to the most important part of the article--software tools for JTAG debugging.
Software tools for JTAG
In the scope of this article, OpenOCD--the on-chip debugger (OCD)--can be thought of as a software middleware running between the debugger, for instance GDB, and the JTAG adapter. It does more than that, but as far as JTAG debugging is concerned, OpenOCD translates GDB commands to USB commands, which it sends to the JTAG adapter.
OpenOCD implements a remote gdbserver protocol, so for a GDB client it appears as an instance of gdbserver, which just happens to debug the Linux kernel itself instead of one of the applications running under Linux.
OpenOCD supports ARM7, ARM9, XScale, and Cortex-M3 cores, which means that if you are using MIPS or PowerPC, you'll have to look for a different and usually more expensive JTAG debugger, such as Abatron BDI3000. OpenOCD works with a fairly large number of JTAG adapters, in particular FT2232-based ones.
FT2232 is a very popular chip manufactured by Future Technologies Devices International and used in many low-end JTAG adapters, such as Tin Can Tools' Flyswatter. In addition to GDB support, OpenOCD has an extensive list of commands available through telnet command line interface that include target state command, memory access, flash programming, ARM specific commands, JTAG low-level commands, and much more. OpenOCD comes with exhaustive documentation that explains in detail every command, configuration, devices support, and more; I encourage you to read it.
GDB is in the house
The last part of the setup puzzle is GDB, or the GNU debugger. It's a standard and widely used debugger for UNIX systems, including Linux, and it hardly needs an introduction. It offers extensive facilities for program tracing, altering, and debugging. A full GDB manual is beyond the scope of this article, so I'll cover only what is relevant for JTAG and embedded debugging.
Most commonly GDB is used as a single application; however it also has a client server mode. In this mode, GDB client, in other words the front end, can be run on one machine (usually the host PC) and GDB server, the back end, on another (usually the embedded target system). GDB server is used to control the application, and GDB client is the user interface: they both communicate using GDB's remote TCP-based protocol.
This configuration is what you would normally use when debugging embedded Linux applications. In the JTAG debugging case, the OpenOCD daemon and the JTAG adapter would simulate the gdbserver, while the GDB client will remain the same.
One important drawback of GDB is a lack of graphical user interface (GUI). Most people use Data Display Debugger (DDD), a GUI wrapper for GDB. Personally, I'm not a big fond of this program as it has a very slow response time (by modern standards) and clunky interface.
Fortunately, there is a better alternative--Insight. Unlike DDD, Insight is not a wrapper but a version of GDB with integrated GUI. (See http://sourceware.org/insight/faq.php for more about Insight.) The upside is that the GUI is much nicer and easier to use, but there is a downside--as it has GDB built in, you'll probably have to compile it for your target CPU architecture, while DDD would allow you to use an external GDB version from your cross compiler toolchain.
Configuring OpenOCD
Assuming you've installed all the software I've mentioned and compiled your kernel, the last step you need to take before starting debugging is to configure OpenOCD. If you're lucky, OpenOCD may already include configuration files for your JTAG adapter and your board, so it may "just work." Actually, this was almost the case with Flyswatter and LPC3250 (I only had to modify the CPUTAPID parameter), but your mileage may vary.
Refer to OpenOCD documentation for a full explanation of the configuration. I'll explain only the basic commands using in my configuration as an example. Omitting default value boilerplate code, my configuration file looks like that in Listing 1.







Click on image to enlarge.

The first part is the interface configuration, which defines the type of JTAG adapter you are using. The "interface" command identifies the driver that should be used, FT2232 in my case, and the ft2232_vid_pid commands specify vendor Id and product Id of the FT2232 device.
The rest are the target board configuration commands. The "jtag newtap" command defines a JTAG TAP in the chain. You will need at least one for your CPU, along with the set_TARGETNAME and the "target create" commands.
Here is what an actual JTAG debugging session looks like. As you can see in Figure 1, LPC3250 board is connected to Flyswatter via 20-pin JTAG cable and both devices are connected via USB to a Linux PC. Linux is running OpenOCD daemon and Insight GDB client.







Click on image to enlarge.

Debug session:
1. Power up the JTAG adaptor.
2. Power up the board.
3. Mount the usbfs (if it is not mounted already): sudo mount -t usbfs none /proc/bus/usb
4. Run the OpenOCD daemon: sudo bin/openocd -f flyswatter.cfg -f lpc3250.cfg
5. Run the Insight (or any other GDB compatible) debugger: arm-unknown-linux-gnueabi-insight vmlinux
6. Set the target settings (post 3333 is the default used by OpenOCD, you can change it in the configuration file):
 Target: Remote/TCP
Hostname: localhost
Port:3333

7. Connect to the target.
You will need an uncompressed kernel image vmlinux, preferably compiled with debugging symbols, in other words, CONFIG_DEBUG and CONFIG_DEBUG_INFO kernel build parameters should be enabled.
If you connected successfully, you can now use the graphical debugger interface to debug the Linux kernel. You can single step in both assembly and source code (I especially like the mixed assembly/C mode for low-level debugging), set breakpoints, check/modify memory and registers, and generally debug the kernel as you normally would debug an application. The screenshot in Figure 2 shows main Insight windows.







Click on image to enlarge.

Of course, if you prefer a command line interface, a console window is available as well. In addition to all standard GDB commands, you can send JTAG commands directly to OpenOCD using a monitor command. For instance, you can check all banked registers using arm reg command as is shown in Listing 2, or you can print information about the caches using arm926ejs cache_info command shown in Listing 3. (For a full list of supported commands refer to the OpenOCD documentation.)







Click on image to enlarge.








Click on image to enlarge.

The instructions that I've described so far assume that you're interested in debugging a statically linked kernel image. This is true most of the time--after all, JTAG is most useful for an early initialization debugging, and this code is of course statically linked.
Sometimes, however, you may wish to debug a driver or some other loadable kernel module. The problem here is that after you load the module using insmod or modprobe Linux commands, the GDB/Insight is not aware of this module's symbols. It's your responsibility to tell the debugger what the symbols names are and to where they've been relocated.
You can find the base address of each module by reading the /proc/modules file. For instance, you can see that on my system, the nfs module has been relocated to the address 0xf8716000:

cat /proc/modules
nfs 271912 1 - Live 0xf8716000
...

The offset is printed in the last column. When you know the offset, you can tell GDB to load this module's symbol table using the following command:

add-symbol-file nsf.ko 0xf8716000

When you are finished, you can continue debugging the kernel and your module.
A good start
This article is by no means a definitive guide to JTAG debugging Linux, but I hope that it gives you enough information to get started. As usually the case with Linux, there are alternatives to almost everything I've described here.
For instance, if you're unwilling to spend the time assembling the system by yourself and money is not an issue, Wind River Workbench On-Chip Debugging is a good option. It supports pretty much all processors currently used in embedded systems and comes with a nice integrated development environment. Needless to say, it supports both VxWorks and Linux.
Another slightly less expensive option is Abatron BDI3000. Abatron also supports all relevant processors and can be used with any client that supports remote GDB protocol, in much the same way as I described in this article. The major difference is that it has an Ethernet rather than USB interface and runs a GDB server emulation software--the equivalent of OpenOCD, inside the device itself, which is very convenient.
If you prefer an Eclipse-based integrated environment but cannot afford Wind River OCD, you can purchase an add-on software product LinuxScope-JTD (JTAG target debugger), which is a debugger for the Eclipse IDE that has been optimized for use with Abatron's probes.
Sasha Sirotkin currently works on the FemtoLinux project improving Linux system call overhead for embedded ARM, MIPS, and PowerPC systems. For more information visit FemtoLinux's web site at www.femtolinux.com. Sasha can be reached at demiurg@femtolinux.com.
Resources:
1. FemtoLinux, www.femtolinux.com
2. EmbeddedArtists, www.embeddedartists.com
3. Tin Can Tools, www.tincantools.com
4. OpenOCD, http://openocd.berlios.de/web/
5. Insight, http://sourceware.org/insight/
6. LinuxScope-JTD, www.ultsol.com/mfgs_comp_linuxscope.htm, or www.linuxscope.com/
7. Wind River OCD, www.windriver.com/products/OCD/
8. Abatron BDI3000, www.abatron.ch/products/bdi-family/bdi3000.html
(繼續閱讀...)
文章標籤

horace papa 發表在 痞客邦 留言(0) 人氣(239)

  • 個人分類:openjtag
▲top
  • 3月 30 週三 201117:39
  • DebuggingTheLinuxKernelUsingGdb




eLinux.org - Embedded Linux Wiki



DebuggingTheLinuxKernelUsingGdb



From eLinux.org


Jump to: navigation, search










Contents


[hide]


  • 1 Debugging the linux kernel using gdb

    • 1.1 Requirements

    • 1.2 The basics

      • 1.2.1 vmlinuz v.s zImage

      • 1.2.2 Debugging the kernel

      • 1.2.3 Loading a kernel in memory

      • 1.2.4 Getting the kernel log buffer

      • 1.2.5 Debugging a kernel module (.o and .ko )



    • 1.3 Determining the module load address

    • 1.4 Loading Symbols of a loaded module

    • 1.5 Pointers





Debugging the linux kernel using gdb


The majority of day to day kernel debugging is done by adding print statements to code by using the famous printk function. This technique is well described in Kernel Debugging Tips. Using printk is a relatively simple, effective and cheap way to find problems. There are many other Linux grown techniques that take the debugging and profiling approach to a higher level. On this page we will discuss using the GNU debugger (GDB) to do kernel debugging. The GDB page describes some basic gdb command and also gives good links to documentation. Overall starting using gdb to do kernel debugging is relatively easy.


Most of the examples here will work in two (open source) situations. When using JTAG and when using QEMU system emulation. As the second option does not require any hardware you could go on and try it right away!


The open source JTAG debugging world is not that big. One project stands out in terms of debugging capabilities is OpenOCD and this is the tool used in this documentation. OpenOCD is pretty usable on the targets we tested ARM11 and ARM9.


Requirements


GDB:


You need to get yourself a GDB that is capable of understanding you target architecture. Often this come with you cross-compiler but if you have do compile it yourself you need to understand the difference between --target and --host configure options. GDB will be running on host(read x86) and will be able to understand target (read armv6). with that you might also want to have the gdbserver that can serve as stub for you user land debugging.


OpenOCD:


TODO...


A JTAG Dongle:


TODO...


The basics


Kernel gdb debugging component overvierw small.png


To start debugging are kernel you will need to configure the kernel to have debug symbols. Once this is done you can do your normal kernel development. When needed you can "hook-up" your debugger. Start debugging a running kernel.


- start openocd


vmlinuz v.s zImage


When you want to debug the kernel you need a little understanding of how the kernel is composed. Most important is the difference between your vmlinux and the zImage. What you need to understand at this point is that the zImage is a container. This container gets loaded by a boot loader and that execution is handed over to the zImage. This zImage unpacks the kernel to the same memory location and starts executing the kernel. (explain that vmlinux does not have to be the real kernel as it is possible to debug a "stripped" kernel using a non stripped vmlinux). overall if we look at a compiled kernel we will see that vmlinux is located at the root of the kernel tree whiles the zImage is located under arch/arm/boot


vmlinux
arch/arm/boot
`-- zImage

vmlinux is what we will be using during debugging of the Linux kernel.


Debugging the kernel


The JTAG based debugging method described here is not intrusive. This means that besides debugging symbols you don't need to modify the kernel in any way. This is because we operate on the hardware, CPU core level. Overall this means that you can follow your normal development method. You can let your bootstrap and boot loader do their work and for example start debugging a running kernel. If your gdb-aware debugger is running it can be as simple as loading the vmlinuz and connecting to the remote target:


load vmlinuz
target remote :3333

Loading a kernel in memory


Once you are used to using gdb to debug kernels you will want to use gdb to directly load kernels onto your target. The most practical way of doing this is to set a hardware breakpoint at the start of the kernel and reset your board using the JTAG reset signal. Your boot loader will initialize your board and the execution will stop at the start of the kernel. After that you can load a kernel into memory and run it.


Execute the following:


(gdb) file vmlinux
(gdb) target remote :3333
(gdb) break __init_begin
(gdb) cont
(gdb) mon reset #perhaps this needs to be done from the openocd telnet session..
Breakpoint 1, 0xc0008000 in stext ()
(gdb) load vmlinux
Loading section .text.head, size 0x240 lma 0xc0008000
Loading section .init, size 0xe4dc0 lma 0xc0008240
Loading section .text, size 0x219558 lma 0xc00ed000
Loading section .text.init, size 0x7c lma 0xc0306558
Loading section __ksymtab, size 0x4138 lma 0xc0307000
Loading section __ksymtab_gpl, size 0x1150 lma 0xc030b138
Loading section __kcrctab, size 0x209c lma 0xc030c288
Loading section __kcrctab_gpl, size 0x8a8 lma 0xc030e324
Loading section __ksymtab_strings, size 0xc040 lma 0xc030ebcc
Loading section __param, size 0x2e4 lma 0xc031ac0c
Loading section .data, size 0x1e76c lma 0xc031c000
Start address 0xc0008000, load size 3345456
Transfer rate: 64 KB/sec, 15632 bytes/write.
(gdb) cont

This will boot your kernel that was loaded into memory via JTAG.


Getting the kernel log buffer


Sometimes the kernel will panic before the serial is up and running. In such situations is it very handy to be able to dump the kernel log buffer. This can be done by looking at the content of the __log_buf in the kernel. In gdb this can be done by issuing


p (char*) &__log_buf[log_start]

There must be a simple way of printing the memory area between log_start and log_end.


The problem is that gdb stops after the first line. Currently we use this routine that copied from wchar.gdb until something "normal" came out. We defined dmesg it like this:


define dmesg
set $__log_buf = $arg0
set $log_start = $arg1
set $log_end = $arg2
set $x = $log_start
echo "
while ($x < $log_end)
set $c = (char)(($__log_buf)[$x++])
printf "%c" , $c
end
echo "\n
end
document dmesg
dmesg __log_buf log_start log_end
Print the content of the kernel message buffer
end

and call it like this:


dmesg __log_buf log_start log_end

Debugging a kernel module (.o and .ko )


Debugging a kernel module is harder.


Determining the module load address


gdb itself does not have knowledge about kernel modules and when debugging a kernel module. We will need to help gdb a little. One problem with modules is that it is not possible to determine where in the memory a module will be loaded before it is actually loaded so only once it is loaded we need to determine the address in memory it is loaded and tell gdb about it. There are many ways of determining this information. Here are 3 ways:


lsmod

cat /sys/module/mydriver/sections/.text

#gdb implementation of the linux lsmod
define lsmod
# The Linux kernel contains a generic double linked list implementation.
# The "modules struct" is such a linked list and it contains information about modules.
set $current = modules.next
#The list implementation is done by adding a list_head struct to a container
#containing the data that is to be "listed". If one know the offset in bytes
#between the start of the struct and the "list_head" a simple formular can
#be defined to determine the "content" of the list item. This value
#is dependent on alignment and storage sized of the data in the struct
#and is determined here for the struct module..
set $container_offset = ((int)&((struct module *)0).list)
#Iterate over the list printing modules information
while($current != modules.prev)
printf "%s 0x%08x\n", \
((struct module *) (((char*) ($current)) - $container_offset ) )->name ,\
((struct module *) (((char*) ($current)) - $container_offset ) )->module_core
set $current = $current.next
end
end

Loading Symbols of a loaded module


add-symbol-file drivers/mydrivers/mydriver.o 0xbf098000

Note that we use the .o file and not the .ko one. The address at the end is the address where the kernel decided to load the module


Pointers


In the Linux Documentation directory under the kdump you will find file called gdbmacros.txt and it looks very promising as among other things it contains the a dmesg implementation


head linux-2.6.22.1/Documentation/kdump/gdbmacros.txt
#
# This file contains a few gdb macros (user defined commands) to extract
# useful information from kernel crashdump (kdump) like stack traces of
# all the processes or a particular process and trapinfo.
#


A "find . -name "*gdb*" in the linux kernel directory also shows up a few interesting .gdbinit files that apparently can perform low level initialization.



Retrieved from "http://elinux.org/DebuggingTheLinuxKernelUsingGdb"




Views



  • Page

  • Discussion

  • View source

  • History





Personal tools



  • Log in / create account






Navigation



  • Main Page

  • Community portal

  • Current events

  • Recent changes

  • Help

  • Volunteering

  • Popular Pages

  • Who's Online






 



Toolbox



  • What links here

  • Related changes

  • Special pages

  • Printable version

  • Permanent link





Powered by MediaWiki

GNU Free Documentation License 1.2


  • This page was last modified on 5 January 2009, at 13:22.

  • This page has been accessed 9,633 times.

  • Content is available under GNU Free Documentation License 1.2.

  • Privacy policy

  • About eLinux.org

  • Disclaimers


(繼續閱讀...)
文章標籤

horace papa 發表在 痞客邦 留言(0) 人氣(67)

  • 個人分類:openjtag
▲top
1

個人資訊

horace papa
暱稱:
horace papa
分類:
心情日記
好友:
累積中
地區:

熱門文章

  • (12,977)A類、B類、C類、D類、G類放大器、擴大機的特性比較(引用)
  • (5,073)修裡音響功率擴大機的維修方法及步驟詳細教學
  • (3,059)invalidate/flush cache
  • (636)[音響論壇] 調整LP唱盤的八大基本功
  • (486)[ARM] Buffer allocation for device DMA and DCache coherence
  • (176)安全的維修功率擴大機/利用燈泡代替保險私保護電路(引用)
  • (67)DebuggingTheLinuxKernelUsingGdb
  • (58)电子管功放布局
  • (52)ntp with gps pps impliment
  • (15)PDCP/RLC/MAC分層負責LTE第二層通訊協定把關QoS

文章分類

  • iptables (1)
  • Makefile (1)
  • ubuntu (2)
  • openocd (0)
  • docker (0)
  • openwrt (1)
  • compiler/tool chain (0)
  • my home (1)
  • tube (7)
  • linux networking (9)
  • LTE (3)
  • networking (1)
  • 音響 (0)
  • Linux (2)
  • 面試考題 (0)
  • eclipse IDE (2)
  • virtualbox (2)
  • EPC airinterface5g (1)
  • 音響 (1)
  • openjtag (3)
  • networking (6)
  • linux application (4)
  • Wireless (2)
  • Linux server setting (1)
  • Linux kernel (16)
  • Linux (6)
  • computing (0)
  • 未分類文章 (1)

最新文章

  • [wireshark] qt.qpa.plugin: Could not find the Qt platform plugin "xcb" in "" This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
  • Linux iptables and example.
  • Makefile variables
  • Microsoft teams install in ubuntu 16.04 failed " Depends: libgtk-3-0 (>= 3.19.12) but 3.18.9-1ubuntu3.3"
  • [OpenWrt] error: dereferencing pointer to incomplete type 'RSA {aka struct rsa_st}' if (BN_num_bits(key->e) > 64) ^~ scripts/Makefile.host:134:
  • ubuntu system boot up missing share liberary "/sbin/init: error while loading shared librariues librt.so.1"
  • 4-Way Handshake
  • bash ShellCheck
  • what #address-cells and #size-cells mean are in device-tree.
  • An In-Depth Guide to iptables, the Linux Firewall(轉載)

最新留言

  • [16/11/17] 108國語言翻譯公司 於文章「ntp with gps pps imp...」留言:
    <p>25國語言翻譯公司 </p> <p>&nbsp;<...
  • [12/07/30] shihpochan 於文章「sk_buff structure...」留言:
    簡潔有力~~~Good!...

文章精選

文章搜尋

誰來我家

參觀人氣

  • 本日人氣:
  • 累積人氣: